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


Автор: andrey_post 19.1.2004, 08:07
 Мне необходимо сохранить данные из ListView в файл INI. Но вот как зделать сохранение данных из ListView не знаю. Вот как я обычно сохраняю другие элементы:

Код

procedure TForm1.Button1Click(Sender: TObject);
var
  F: TIniFile;
  Loop: Integer;
  basenum:string;
begin
  for Loop := 0 to Listbox1.Items.Count - 1 do
    if Listbox1.Selected[Loop] then     //из ListBox выбирается база для сохранения
     basenum:=IntToStr(Loop);
     F := TIniFile.Create(ExtractFilePath(ParamStr(0)) + 'base'+basenum+'.ini');
     F.WriteString('tools', 'edit1', Edit1.Text);                                     //записываем текст
     F.WriteInteger('tools', 'const1', StrToIntDef(Edit2.Text, 0));       //записываем число
     F.WriteBool('tools', 'check1', CheckBox1.Checked);                    //Записываем булевые значения
     F.WriteBool('tools', 'radio1', RadioButton1.Checked);
     F.Free;
end;


В ListView у меня есть как Item так и SubItems... каждое сожержимое Item'а так и SubItem'а должно записываться в каждую строчку INI-файла:
Напромер:
...
Item1=помогите
SubItem1=пожалуйста
...

////////////////////////
F.WriteString('tables', 'list1', ListView1...);   что дальше?  smile   

Автор: Kesh 19.1.2004, 12:50
Код
 ListView1.Items[Loop].Caption

Автор: DriveSoftware 19.1.2004, 13:35
Я сохраняю в типизированый файл smile.gif

В твоем случае можно так:
Код

var
 S: String;
begin
S:=ListView1.Items.Item [0].Caption; //первая колонка
S:=ListView1.Items.Item [0].SubItems[0];//вторая
S:=ListView1.Items.Item [0].SubItems[1];//третья
ShowMessage(S);


[сюды CAPTION]
Subitems0=Value
Subitems1=Value


Автор: andrey_post 19.1.2004, 15:10
С сохранением я понял, делается вот так:
Код

begin
     for i:=0 to ListView1.Items.Count -1 do
       Begin
            F.WriteString('tools', 'valutaa'+IntToStr(i), ListView1.Items.Item[i].Caption);
            F.WriteInteger('tools', 'valutab'+IntToStr(i), ListView1.Items.Item[i].SubItems[0]);
            F.WriteString('tools', 'valutac'+IntToStr(i), StrToIntDef(ListView1.Items.Item[i].SubItems[1],0));
       end;
end;


А как сейчас загрузить обратно?

Пример загрузки:
Код

begin
 for Loop := 0 to Listbox1.Items.Count - 1 do
   if Listbox1.Selected[Loop] then
     basenumber:=IntToStr(Loop);
     F := TIniFile.Create(ExtractFilePath(ParamStr(0)) + ('bankbase'+basenumber+'.ini');
     Edit3.Text := F.ReadString('tools', 'edit3', 'no text');


Автор: DriveSoftware 19.1.2004, 15:39

в цикле
Код

 frmOption.ListView1.Items.Add;

 frmOption.ListView1.Items.Item [K].Caption:=строка; {valutaa}
 frmOption.ListView1.Items.Item [K].SubItems.Add (строка); {valutab}
 frmOption.ListView1.Items.Item [K].SubItems.Add (строка); {valutac}

Автор: andrey_post 20.1.2004, 07:00
То что в цикле я понял, так и написал у себя в проге:
Код


ListView1.Items.Item [i].Caption := F.ReadString('tools', 'valutaa'+IntToStr(i), '0');
ListView1.Items.Item [i].SubItems.Add (F.ReadString('tools', 'valutab'+IntToStr(i), '0'));
ListView1.Items.Item [i].SubItems.Add (F.ReadString('tools', 'valutac'+IntToStr(i), '0'); //*);



А как поставить цикл от 0 до скольки? thumbs-up.gif

Автор: andrey_post 20.1.2004, 07:39
INI-файл выглядит так:
[tables]
valutaa0=RUR
valutab0=33
valutac0=Российский Рубль
valutaa1=USD
valutab1=25
valutac1=Американский доллар

Вот попробовал так считать из INI-файла:
Код

begin
       tables := TStringList.Create;
       F.ReadSection('tables', tables); //читаем секцию [tables]
       for i:=0 to tables.Count - 1 do
       begin
       ListView1.Items.Item[i].Caption:=F.ReadString('valutaa'+IntToStr(i), tables.Strings[i], '');
       ListView1.Items.Item[i].SubItems.Add(F.ReadString('valutab'+IntToStr(i), tables.Strings[i], ''));
       ListView1.Items.Item[i].SubItems.Add(F.ReadString('valutac'+IntToStr(i), tables.Strings[i], ''));
       end;
       tables.Destroy;
    end;


Не получается, выбается ошибка приложения... confused.gif

Автор: DriveSoftware 20.1.2004, 11:36
Пройдись по циклу по шаговой отладкой (F7 или F8) и посмотри где ошибка, взгляни на значения.

Вообщем должно работать, ошибка может быть если
tables.Count = 0

Автор: DriveSoftware 20.1.2004, 11:39
ДА! ты еще забыл в самом начале цикла
ListView1.Items.Add;

Автор: andrey_post 20.1.2004, 18:28
Все с этим делом разобрался...
осталось последнее, мне нужно синхронизировать ListView1 с ComboBox1. Т.е. все что есть в ListView1 добавляется в ComboBox1, а потом выбранный элемент в ComboBox1 сохраняется в INI-файл.

Начинаю синхронизировать ListView1 с ComboBox1:
Код

begin
     for i:=0 to ListView1.Items.Count -1 do
       ComboBox1.Items.Add(ListView1.Items.Item[i].Caption);
end;


Все окей, а вот когда пытаюсь сохранить в INI вот тут и есть загвоздка. Как сохранить значение (Caption) выбранного значения в ComboBox1?

Код


...

B.WriteString('tools', 'combocaption', ComboBox1...что тут вставить?);

...


Автор: <Spawn> 20.1.2004, 18:30
Код
ComboBox1.Text
smile.gif

Автор: Medved 20.1.2004, 22:54
Цитата(andrey_post @ 20.1.2004, 21:28)
Все с этим делом разобрался...
осталось последнее, мне нужно синхронизировать ListView1 с ComboBox1. Т.е. все что есть в ListView1 добавляется в ComboBox1, а потом выбранный элемент в ComboBox1 сохраняется в INI-файл.

Модератор: Один топик - один вопрос. Прочитайте http://forum.vingrad.ru/index.php?act=SR&f=27 форума.

Автор: Unregistered 21.1.2004, 03:16
Хочу напомнить.
Стандартный класс TIniFile может работать только с файлами не больше 64Кб -- как и все инишки в Windows.

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