Listview in Ini-Datei

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
Andromeda
Beiträge: 120
Registriert: So 4. Jan 2015, 20:18

Listview in Ini-Datei

Beitrag von Andromeda »

Hallo,

ich möchte den Inhalt einer Listview in eine Ini-Datei schreiben. Das habe ich jetzt so versucht:

Code: Alles auswählen

procedure TFormHaupt.FormClose(Sender: TObject; var CloseAction: TCloseAction);
var
  IniDat:TIniFile;
  i : Integer;
begin
  i := ListBox.Items.Count;
  try
    for i := 0 to ListBox.Count -1 do
     IniDat.WriteString('Dateinamen', 'Dateinamen', ListBox.Items[i]);
  finally
    IniDat.free;
  end;
end;
 

Aber leider wird nur die letzte Zeile in die Ini übernommen und ich finde den Fehler nicht.

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2640
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Listview in Ini-Datei

Beitrag von m.fuchs »

Logisch, du überschriebst ja auch immer wieder den Key "Dateinamen". Entweder du machst dir eine komma-separierte Liste und packst die in den Key oder du verwendest für jeden Eintrag beispielsweise einen Key mit angehängter Zahl.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

Mathias
Beiträge: 6194
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Listview in Ini-Datei

Beitrag von Mathias »

oder du verwendest für jeden Eintrag beispielsweise einen Key mit angehängter Zahl.

ZB. so:

Code: Alles auswählen

    IniDat.WriteString('Dateinamen', 'Dateinamen' + IntToStr(i), ListBox.Items[i]);


Natürlich muss man noch den Wert Count auch in die Ini-Datei speichern, so weis man viele Werte das abgespeichert sind.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Andromeda
Beiträge: 120
Registriert: So 4. Jan 2015, 20:18

Re: Listview in Ini-Datei

Beitrag von Andromeda »

Vielen Dank,
ich hab's jetzt geschafft. Es hat eine Weile gedauert, weil ich nicht wusste, wie man eine Repeat-Schleife formuliert. Ich habe den Inhalt der Listbox in einen String gepackt, und kopiere den beim Starten des Programms wieder in die Listbox.
Beim Programmende:

Code: Alles auswählen

 
procedure TFormHaupt.FormClose(Sender: TObject; var CloseAction: TCloseAction);
var
  IniDat:TIniFile;
  i : Integer;
  S : String;
begin
  S := '';
  i := ListBox.Items.Count;
  for i := 0 to ListBox.Count -1 do S := S + ListBox.Items[i]+',';
  IniDat := TIniFile.Create('zip.ini');
  try
    IniDat.WriteString('Dateinamen', 'Dateinamen', S);
  finally
    IniDat.free;
  end;
end;
 

Beim Programmstart:

Code: Alles auswählen

 
procedure TFormHaupt.FormCreate(Sender: TObject);
var
  IniDat : TIniFile;
  S : String;
begin
  IniDat := TIniFile.Create('zip.ini');
  try
    S := IniDat.ReadString('Dateinamen', 'Dateinamen', '');
  finally
    IniDat.Free;
  end;
  repeat
    ListBox.Items.Add(Copy(S,1,Pos(',',S)-1));
    Delete(S, 1, Pos(',',S));
  until Length(S) < 2 ;
end;
 

Das funktioniert jetzt wunderbar.

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2640
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Listview in Ini-Datei

Beitrag von m.fuchs »

Du musst nicht einmal eine Schleife verwenden. Die Items einer ListBox sind ja vom Typ TStrings.

Komma-getrennte Werte auslesen:

Code: Alles auswählen

s := ListBox1.Items.CommaText;


Werte wieder schreiben:

Code: Alles auswählen

ListBox1.Items.CommaText := s;
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

Andromeda
Beiträge: 120
Registriert: So 4. Jan 2015, 20:18

Re: Listview in Ini-Datei

Beitrag von Andromeda »

Vielen Dank.
Das ist ja noch viel einfacher.
Aber vermutlich wird es auch kein großer Fehler sein, wenn man weiß, dass es auch Repeat-Schleifen gibt.

Mathias
Beiträge: 6194
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Listview in Ini-Datei

Beitrag von Mathias »

Will man, das alles gespeichert wird, auch wen im String zufällig ", " steht, kann man einen Umweg über Memorystream und das ganze Binär speichern.

Code: Alles auswählen

procedure TForm1.SaveClick(Sender: TObject);
var
  ini: TIniFile;
  fs: TMemoryStream;
begin
  fs := TMemoryStream.Create;
  fs.WriteAnsiString(ListBox1.Items.Text);
  ini := TIniFile.Create('test.ini');
  ini.WriteBinaryStream('bin', 'Datei', fs);
  ini.Free;
  fs.Free;
end;
 
procedure TForm1.LoadClick(Sender: TObject);
var
  ini: TIniFile;
  fs: TMemoryStream;
begin
  fs := TMemoryStream.Create;
  ini := TIniFile.Create('test.ini');
  ini.ReadBinaryStream('bin', 'Datei', fs);
  fs.Position:=0;
  ListBox2.Items.Text := fs.ReadAnsiString;
 
  ini.Free;
  fs.Free;
end;
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

wp_xyz
Beiträge: 4889
Registriert: Fr 8. Apr 2011, 09:01

Re: Listview in Ini-Datei

Beitrag von wp_xyz »

Andromeda hat geschrieben:

Code: Alles auswählen

procedure TFormHaupt.FormClose(Sender: TObject; var CloseAction: TCloseAction);
var
  IniDat:TIniFile;
  i : Integer;
begin
  i := ListBox.Items.Count;
  try
    for i := 0 to ListBox.Count -1 do
     IniDat.WriteString('Dateinamen', 'Dateinamen', ListBox.Items[i]);
  finally
    IniDat.free;
  end;
end;
 


Weiter oben hast du eine Lösung für dich gefunden, die aber von dem ursprünglichen Problem abweicht. Hier ist eine Lösung zum ursprünglichen Ansatz:

Code: Alles auswählen

procedure WriteListboxToIni(const IniFileName: String; Listbox: TListbox);
var
  iniDat: TIniFile;
  i: Integer;
begin
  iniDat := TIniFile.Create(IniFileName);
  try
    for i:=0 to Listbox.Items.Count-1 do
      iniDat.WriteString('Dateinamen', 'Datei'+IntToStr(i), Listbox.Items[i]);
  finally
    iniDat.Free;
  end;
end;
 
procedure LoadListboxFromIni(const IniFileName: String; Listbox: TListbox);
var
  iniDat: TIniFile;
  i: Integer;
  s: String;
begin
  Listbox.Items.Clear;
  iniDat := TIniFile.Create(IniFileName);
  try
    i := 0;
    repeat
      s := iniDat.ReadString('Dateinamen', 'Datei' + IntToStr(i), '');
      if s <> '' then Listbox.Items.Add(s);
    until (s = '');
  finally
    iniDat.Free;
  end;
end;

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2640
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Listview in Ini-Datei

Beitrag von m.fuchs »

Mathias hat geschrieben:Will man, das alles gespeichert wird, auch wen im String zufällig ", " steht, kann man einen Umweg über Memorystream und das ganze Binär speichern.

Warum denn immer so umständliche Lösungen?
Die CommaText Property deckt doch alles ab. Aus

Code: Alles auswählen

Test,Test
Bla,Bla
Muh,Muh

wird

Code: Alles auswählen

"Test,Test","Bla,Bla","Muh,Muh"
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2640
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Listview in Ini-Datei

Beitrag von m.fuchs »

wp_xyz hat geschrieben:Weiter oben hast du eine Lösung für dich gefunden, die aber von dem ursprünglichen Problem abweicht. Hier ist eine Lösung zum ursprünglichen Ansatz:
[...]

Da muss ich klugscheißender Weise nochmal einhaken. Warum weicht die Lösung mit dem CommaText vom ursprünglichen Problem ab? Problemstellung war:
Andromeda hat geschrieben:ich möchte den Inhalt einer Listview in eine Ini-Datei schreiben.

Exakt das passiert jetzt.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

wp_xyz
Beiträge: 4889
Registriert: Fr 8. Apr 2011, 09:01

Re: Listview in Ini-Datei

Beitrag von wp_xyz »

m.fuchs hat geschrieben:
wp_xyz hat geschrieben:Weiter oben hast du eine Lösung für dich gefunden, die aber von dem ursprünglichen Problem abweicht. Hier ist eine Lösung zum ursprünglichen Ansatz:
[...]

Da muss ich klugscheißender Weise nochmal einhaken.

Ich denke (ok - ich *weiß* es nicht), dass die Ini-Datei für ihn Neuland ist. Und am Umgang mit Keys und den Ini-Datei-Methoden mogelt er sich mit dieser Lösung herum. (Wobei deine Lösung natürlich an Eleganz nicht zu überbieten ist).

Antworten