[gelöst] ListView in INI speichern und laden

Rund um die LCL und andere Komponenten
Antworten
catweasel
Beiträge: 230
Registriert: Di 17. Mär 2009, 10:51
OS, Lazarus, FPC: Win10 64Bit // Linux Mint 20.0 - (L 2.2.0 FPC 3.2.2)

[gelöst] ListView in INI speichern und laden

Beitrag von catweasel »

Moin

Ich habe zwei Spalten (Hostname und IP) in meiner ListView die ich in eine INI speichern und beim Programmstart auch wieder laden möchte.

Das Speichern in die INI funktioniert soweit:

Code: Alles auswählen

var ini:Tinifile;
    i:integer;
begin
  try
    ini:=TIniFile.Create('meineini.ini');
 
	//ListView in ini speichern
    ini.EraseSection('hostname');
    for i := 0 to Form2.ListView1.Items.Count - 1 do
      ini.Writestring('hostname', Form2.ListView1.Items[i].Caption, Form2.ListView1.Items[i].SubItems.Text);
 
  finally
    ini.Free;
  end;
end;


So steht es dann in der INI:

Code: Alles auswählen

[hostname]
Server1=192.168.1.105
Server2=10.192.1.17
Leider bekomme ich es nicht hin die Einträge wieder einzulesen und die ListView zu schreiben.
Den ersten Eintrag für die ListView (Caption) bekomme ich noch, aber den zweiten Eintrag (SubItem) bekomme ich irgendwie nicht.

So versuche ich die Einträge einzulesen:

Code: Alles auswählen

var ini:Tinifile;
    i:integer;
    StringList:TStringList;
begin  
  try
    ini:=TIniFile.Create('meineini.ini');
    StringList := TStringList.Create;
 
	try
      Ini.ReadSection('hostname', StringList);
      for i := 0 to StringList.Count-1 do begin
          with Form2.ListView1.Items.Add do
          begin
            Caption := StringList[i];
            //SubItems.Add(????);
          end;
      end;
    finally
      StringList.Free;
    end; 
 
  finally
    ini.Free;
  end;
end;
Kann mir jemand auf die Sprünge helfen wie ich an die IP für das SubItem kommen kann?

Gruß
Michael
Zuletzt geändert von catweasel am So 12. Jun 2011, 09:13, insgesamt 1-mal geändert.

Benutzeravatar
theo
Beiträge: 10904
Registriert: Mo 11. Sep 2006, 19:01

Re: ListView in INI speichern und laden

Beitrag von theo »

Code: Alles auswählen

Ini.ReadSectionValues('hostname', StringList);
      for i := 0 to StringList.Count-1 do begin
          with ListView1.Items.Add do
          begin
            Caption := StringList.Names[i];
            SubItems.Add(StringList.Values[Caption]);
          end;
      end;

catweasel
Beiträge: 230
Registriert: Di 17. Mär 2009, 10:51
OS, Lazarus, FPC: Win10 64Bit // Linux Mint 20.0 - (L 2.2.0 FPC 3.2.2)

Re: ListView in INI speichern und laden

Beitrag von catweasel »

Danke, das hat´s gebracht :)

Funktioniert das auch wenn die erste Spalte mit Checkboxen versehen ist? (checkboxes=true)
oder muß man da ganz anders an das Speichern rangehen, z.B. die Angaben ob ein Eintrag checked ist in eine weitere Section der INI speichern?


Gruß
Michael

Benutzeravatar
theo
Beiträge: 10904
Registriert: Mo 11. Sep 2006, 19:01

Re: ListView in INI speichern und laden

Beitrag von theo »

TStringList kennt nur "Name=Wert" Paare. Also musst du das anders machen, für mehr Daten.

catweasel
Beiträge: 230
Registriert: Di 17. Mär 2009, 10:51
OS, Lazarus, FPC: Win10 64Bit // Linux Mint 20.0 - (L 2.2.0 FPC 3.2.2)

Re: ListView in INI speichern und laden

Beitrag von catweasel »

theo hat geschrieben:TStringList kennt nur "Name=Wert" Paare. Also musst du das anders machen, für mehr Daten.
Dachte ich mir schon. Danke für die Bestätigung.

Schöne Pfingsten
Michael

catweasel
Beiträge: 230
Registriert: Di 17. Mär 2009, 10:51
OS, Lazarus, FPC: Win10 64Bit // Linux Mint 20.0 - (L 2.2.0 FPC 3.2.2)

Re: ListView in INI speichern und laden

Beitrag von catweasel »

Moin

Falls noch mal jemand vor dem gleichen Problem steht, schreibe ich hier noch mal die Gesamtlösung wie sie bei mir im Einsatz ist:

Es funktioniert jetzt auch das in der INI gespeichert wird ob der erste Eintrag in dem ListView "checked" ist oder nicht. Dazu werden die ListView-Einträge in zwei Sections der INI gespeichert (1. Hostname und IP, 2.Hostname und ob checked)


Zweispaltigen ListView mit Checked in INI schreiben:

Code: Alles auswählen

var ini:Tinifile;
    i:integer;
begin
  try
    ini:=TIniFile.Create('meineini.ini');
 
    // Zweispaltigen ListView (Hostname und IP) inclusive "checked" auf Hostname in
    // INI speichern; Das muß in zwei Teilschritten erfolgen:
    // Das Verfahren funktioniert nur mit zwei Spalten beim ListView
 
    //1.Teil: ListView Hostname und IP speichern
    ini.EraseSection('hostname');
    for i := 0 to Form1.ListView1.Items.Count - 1 do
      ini.Writestring('hostname', Form1.ListView1.Items[i].Caption, Form1.ListView1.Items[i].SubItems.Text); 
 
    //2.Teil: ListView Hostname und checked speichern
    ini.EraseSection('hostname_checked');
    for i := 0 to Form1.ListView1.Items.Count - 1 do
        ini.WriteBool('hostname_checked', Form1.ListView1.Items[i].Caption, Form1.ListView1.Items[i].Checked);
 
  finally
    ini.Free;
  end; 
end;
In der INI wird das dann in zwei Sections gespeichert:

Code: Alles auswählen

[hostname]
Server1=192.168.1.101
Server2=192.168.1.102
Server3=192.168.1.101
 
[hostname_checked]
Server1=1
Server2=0
Server3=1

INI wieder auslesen und Ergebnis in ListView schreiben:

Code: Alles auswählen

var ini:Tinifile;
    i:integer;
    StringList:TStringList;
begin
  try
    ini:=TIniFile.Create('meineini.ini'); 
 
    // Zweispaltigen ListView (Hostname und IP) inclusive "checked" auf Hostname aus
    // INI laden; Das muß in zwei Teilschritten erfolgen:
    // Das Verfahren funktioniert nur mit zwei Spalten beim ListView
 
    // 1.Teil: ListView aus INI laden (Hostname und IP)
    StringList := TStringList.Create;
    try
      Ini.ReadSectionValues('hostname', StringList);
      Form1.memo1.lines.addstrings(stringlist);
            for i := 0 to StringList.Count-1 do begin
                with Form1.ListView1.Items.Add do
                begin
                  Caption := StringList.Names[i];
                  SubItems.Add(StringList.Values[Caption]);
                end;
            end;
    finally
      StringList.Free;
    end;
 
    // 2.Teil: ListView aus INI laden (Hostname und ob Eintrag "checked" ist)
    for i := 0 to Form1.ListView1.Items.Count - 1 do
      Form1.ListView1.Items[i].Checked := ini.ReadBool('hostname_checked', Form1.ListView1.Items[i].Caption, Form1.ListView1.Items[i].Checked);
 
  finally
    ini.Free;
  end; 
end

Benutzeravatar
theo
Beiträge: 10904
Registriert: Mo 11. Sep 2006, 19:01

Re: [gelöst] ListView in INI speichern und laden

Beitrag von theo »

Geschmackssache, aber ich finde eine solche Struktur sauberer (Beisp. aus meinem Mail-Client):

Code: Alles auswählen

[Account_0]
Name=localhost
Enabled=0
Host=localhost
UserName=root@localhost
PassWord=0101010
Encrypted=1
 
[Account_1]
Name=mail.abcd.com
Enabled=0
Host=mail.abcd.com
UserName=theo@abcd.com
PassWord=01010101
Encrypted=1

creed steiger
Beiträge: 958
Registriert: Mo 11. Sep 2006, 22:56

Re: [gelöst] ListView in INI speichern und laden

Beitrag von creed steiger »

Würde sich da nicht TInipropstorage (oderTXMLPropstorage) anbieten?

diogenes
Beiträge: 200
Registriert: So 11. Jul 2010, 18:39
OS, Lazarus, FPC: Linux
CPU-Target: 64 Bit
Wohnort: Wien
Kontaktdaten:

Re: [gelöst] ListView in INI speichern und laden

Beitrag von diogenes »

creed steiger hat geschrieben:Würde sich da nicht TInipropstorage (oderTXMLPropstorage) anbieten?
Weil die Dokumentation noch nicht so weit ist: Wie funktioniert das?
Ceterum censeo computatores per Pascal docendos esse.

creed steiger
Beiträge: 958
Registriert: Mo 11. Sep 2006, 22:56

Re: [gelöst] ListView in INI speichern und laden

Beitrag von creed steiger »

IniPropStorage aufs Formular ziehen
und im Objektinspektor bei Form1 (als Beispiel)
auf SessionProperties klicken
nun die Eigenschaften auswählen die du ablegen willst

Probier halt ein bissl rum ;)

diogenes
Beiträge: 200
Registriert: So 11. Jul 2010, 18:39
OS, Lazarus, FPC: Linux
CPU-Target: 64 Bit
Wohnort: Wien
Kontaktdaten:

Re: [gelöst] ListView in INI speichern und laden

Beitrag von diogenes »

Danke
Ceterum censeo computatores per Pascal docendos esse.

Antworten