Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > ComboBox + INI


Автор: ForumRu 4.10.2004, 21:11
Как в INI-файл записывать последний текст из ComboBox? Тое сть: есть ИНИ-файл с содержанием:

Код
[SECTION]
1=Текст
2=Еще текс
3=И снова текст
4=И опять текст


Этими (к примеру) пунктами заполняется ComboBox при загрузки программы. Когдя пользователь вписует новый текст в ComboBox и закрывает программу он должен сохраняться, а последний пропадать в этом списке пропадать:

Код
[SECTION]
1=НОВЫЙ ТЕКСТ
2=Текст
3=Еще текс
4=И снова текст


и т.д:

Код
[SECTION]
1=СОВСЕМ НОВЫЙ ТЕКСТ
2=НОВЫЙ ТЕКСТ
3=Текст
4=Еще текс


Как это можно реализовать на практике. Буду благодарен за код.

Автор: Pakshin A. S. 4.10.2004, 21:38
Вот три процедуры
Код


{В ini есть секция с количеством записей}

procedure TForm1.Load(filename:string);
var
f:TIniFiles;
i:integer;
begin
f:=TiniFile.Create(filename);
Memo1.Lines.Clear;
for i:=1 to f.readinteger('Section', 'Count', 1) do
 Memo1.Lines.Add(f.readString('Section', IntToStr(i), '');
f.free;
CombBox1.Items:=Memo1.Lines;
end;

procedure TForm1.AddItem(str:string);
var
i:integer;
begin
for i:=Memo1.Lines.Count-1 downto 1 do
 Memo1.Lines[i]:=Memo1.Lines[i-1];
Memo1.Lines[0]:=str;
ComboBox1.IOtems:=Memo1.Lines;
end;

procedure TForm1.Save(filename:string);
var
i:integer;
begin
f:=TiniFile.Create(fileName);
for i:=0 to Memo1.Lines.Count-1 do
f.WriteString('Section, IntToStr(i+1), Memo1.Lines[i]);
f.WriteInteger('Section', 'Count', Memo1.Lines.Count);
f.Free;
end;

У Memo свойство Visible=False;

Вроде так... smile.gif wink.gif

Автор: p0s0l 5.10.2004, 01:01
Ну, Pakshin A. S., ну наворотил ! biggrin.gif
Зачем бедный Memo-то сюда прилепил ?
Что мешает делать сразу так:
ComboBox1.Items.Add(f.readString('Section', IntToStr(i), '');
то бишь везде вместо Memo1.Lines делать ComboBox1.Items
А AddItem будет так:
ComboBox1.Items.Delete(0);
ComboBox1.Items.Add(str);


Автор: andrey_post 5.10.2004, 07:07
Я тоже раньше делал все через Мемо и его скрывал.
но появлялись другие проблемы связанные с длинной строк, когда они переходили за предел Мемо и переносились в другие строки, плюс проблемы с кодировками и ключами конца файла и т.п....
Посол согласен с твоим экземляром!

Автор: Guest 5.10.2004, 08:10
А ИМХО лучше через TStrings

Автор: ForumRu 5.10.2004, 08:20
Через МЕМО не очень хорошо...
Кстати, ребята! Меня интересует запись, а чтение дело нехитрое...

qstn.gif

Автор: ForumRu 5.10.2004, 11:56
И еще один вопросик назрел: как НЕ отображать в КомбоБоксе пустые пункты, т.е не заполнять ими это компонент?

Автор: Pakshin A. S. 5.10.2004, 17:00
Цитата(andrey_post @ 5.10.2004, 08:07)
но появлялись другие проблемы связанные с длинной строк, когда они переходили за предел Мемо и переносились в другие строки, плюс проблемы с кодировками и ключами конца файла и т.п....

Ставим полосы прокрутки горизонтальные и вертикальные...
Добавлено @ 17:01
Цитата(ForumRu @ 5.10.2004, 09:20)
Меня интересует запись

Как прочли, так и записываем... sad.gif Что именно?
Добавлено @ 17:05
Цитата(p0s0l @ 5.10.2004, 02:01)
А AddItem будет так:
ComboBox1.Items.Delete(0);
ComboBox1.Items.Add(str);

Нее, здесь надо как с массивом
Код

for i:=ComboBox1.Items.Count-1 downto 1 do
ComboBox1.Items[i]:=ComboBox1.Items[i-1];
CombBox1.Items[0]:=str;

Добавлено @ 17:07
Код
procedure TForm1.Load(filename:string);
var
f:TIniFiles;
i:integer;
begin
f:=TiniFile.Create(filename);
ComboBox1.Items.Clear;
for i:=1 to f.readinteger('Section', 'Count', 1) do
ComboBox1.Items.Add(f.readString('Section', IntToStr(i), '');
f.free;
end;

procedure TForm1.AddItem(str:string);
var
i:integer;
begin
for i:=ComboBox1.Items.Count-1 downto 1 do
ComboBox1.Items[i]:=ComboBox1.Items[i-1];
ComboBox1.Items[0]:=str;
end;

procedure TForm1.Save(filename:string);
var
i:integer;
begin
f:=TiniFile.Create(fileName);
for i:=0 to ComboBox1.Items.Count-1 do
f.WriteString('Section', IntToStr(i+1), ComboBox1.Items[i]);
f.WriteInteger('Section', 'Count', ComboBox1.Items.Count);
f.Free;
end;

Автор: Pakshin A. S. 5.10.2004, 17:13
Кстати обходимся без изменения структуры файла:
Код

procedure TForm1.Load(filename:string);
var
f:TIniFiles;
i:integer;
begin
f:=TiniFile.Create(filename);
ComboBox1.Items.Clear;
i:=1;
while f.ValueExists('Section', IntToStr(i)) do
begin
ComboBox1.Items.Add(f.readString('Section', IntToStr(i), '');
inc(i);
end;
f.free;
end;

procedure TForm1.Save(filename:string);
var
i:integer;
begin
f:=TiniFile.Create(fileName);
for i:=0 to ComboBox1.Items.Count-1 do
f.WriteString('Section', IntToStr(i+1), ComboBox1.Items[i]);
f.Free;
end;

Добавлено @ 17:20
Цитата(ForumRu @ 5.10.2004, 12:56)
как НЕ отображать в КомбоБоксе пустые пункты, т.е не заполнять ими это компонент?

В этом духе?
Код


var DefL:integer;

procedure TForm1.Load(filename:string);
var
f:TIniFiles;
i:integer;
begin
f:=TiniFile.Create(filename);
ComboBox1.Items.Clear;
i:=1;
while f.ValueExists('Section', IntToStr(i)) do
begin
if f.readString('Section', IntToStr(i), '') <> ''
then
ComboBox1.Items.Add(f.readString('Section', IntToStr(i), ''));
inc(i);
end;
DefL:=i-1;
f.free;
end;


procedure TForm1.AddItem(str:string);
var
i:integer;
begin
if ComboBox1.Items.Count <> DefL
then
 ComboBox1.Items.Add('');
for i:=ComboBox1.Items.Count-1 downto 1 do
ComboBox1.Items[i]:=ComboBox1.Items[i-1];
ComboBox1.Items[0]:=str;
end;

{Остальное без изменений}


Автор: p0s0l 5.10.2004, 21:09
Цитата(Pakshin @ 5.10.2004, 17:00)
Нее, здесь надо как с массивом

Почему ? Обоснуй...
Если надо с другой стороны вставлять, то делаем так:
Код
 ComboBox1.Items.Delete(ComboBox1.Items.Count-1);
 ComboBox1.Items.Insert(0, str);


Автор: Pakshin A. S. 5.10.2004, 21:11
О! А я и не подумал, что так можно... smile.gif

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)