Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi CheckListBox aus ini Datei lesen (https://www.delphipraxis.net/86327-checklistbox-aus-ini-datei-lesen.html)

iron 12. Feb 2007 18:05


CheckListBox aus ini Datei lesen
 
Hallo wiedermal,

ich möchte gerne die gecheckten Items einer CheckListBox in eine ini Datei Speichern, das Speichern klappt glaub ich schon.
Delphi-Quellcode:
ini := TIniFile.Create(IncludeTrailingPathDelimiter(GetCurrentDir)+'einstellungen.ini');
    begin
      try
        for i := 0 to ChecklistBox1.Count - 1 do
          if ChecklistBox1.Checked[i] = true then
          begin
            s:=s+ChecklistBox1.Items[i]+',';
          end;
            ini.WriteString('ChecklistBox','Items',s);
      finally
        ini.Free;
      end;
  end;
Nun komm ich aber nich dahinter wie ich das wieder auslesen kann.

Vielleicht könnt ihr mir einen Tipp geben.

Christian Seehase 12. Feb 2007 18:11

Re: CheckListBox aus ini Datei lesen
 
Moin iron,

warum speicherst Du es nicht einfach anders.
Vor dem Speichern löscht Du die Section, und dann werden alle CheckListBox.Items in jeweils einem, durchnummerierten, Ident gespeichert.
Anschliessend kannst Du noch ein Ident für die Anzahl dazunehmen, und weisst beim Auslesen sogar, wieviele Items Du wieder einlesen musst.

himitsu 12. Feb 2007 18:15

Re: CheckListBox aus ini Datei lesen
 
Ändert sich der Inhalt der ChecklistBox, oder ist der fest?

Wenn der Inhalt sich nicht ändert, dann kannst du auch einfach nur den CheckStatus über den Index speichern und lesen.
z.B.:
Delphi-Quellcode:
ini := TIniFile.Create(IncludeTrailingPathDelimiter(GetCurrentDir)+'einstellungen.ini');
try
  for i := 0 to ChecklistBox1.Count - 1 do
    ini.WriteBoolean('ChecklistBox', 'Item' + IntToStr(i), ChecklistBox1.Checked[i]);
finally
  ini.Free;
end;
Delphi-Quellcode:
ini := TIniFile.Create(IncludeTrailingPathDelimiter(GetCurrentDir)+'einstellungen.ini');
try
  for i := 0 to ChecklistBox1.Count - 1 do
    ChecklistBox1.Checked[i] := ini.ReadBoolean('ChecklistBox', 'Item' + IntToStr(i));
finally
  ini.Free;
end;
Ansonsten die Namen in der Ini auflisten, dann der Reihe nach die gefundenen Namen in der ChecklistBox suchen und .Checked auf True setzen (vorher alle .Checked auf False)

iron 13. Feb 2007 06:10

Re: CheckListBox aus ini Datei lesen
 
ja Danke himitsu, das hat mir schon ein ganzes stück weitergeholfen.

marabu 13. Feb 2007 06:50

Re: CheckListBox aus ini Datei lesen
 
Guten Morgen,

da eine CheckListBox bei angemessener Benutzung keine Unzahl an Einträgen hat, würde ich den Zustand der Checkboxen als einen einzigen Wert speichern. Denkbar sind bis zu 32 Werte in einem DWORD - oder auch ein String.

Delphi-Quellcode:
function GetCheckedStr(clb: TCheckListBox): String;
var
  i: Integer;
begin
  SetLength(Result, clb.Count);
  for i := 0 to Pred(clb.Count) do
    Result[Succ(i)] := Chr(Ord('0') + Ord(clb.Checked[i]));
end;

procedure SetCheckedStr(clb: TCheckListBox; s: String);
var
  i: Integer;
begin
  for i := 0 to Pred(clb.Count) do
    // clb.Checked[i] := (i < Length(s)) and (s[i] = '1'); // s[i] fails
    clb.Checked[i] := (i < Length(s)) and (s[Succ(i)] = '1');
end;

function GetCheckedCard(clb: TCheckListBox): Cardinal;
var
  i: Integer;
begin
  Result := 0;
  for i := Pred(clb.Count) downto 0 do
    Result := Result shl 1 + Ord(clb.Checked[i]);
end;

procedure SetCheckedCard(clb: TCheckListBox; n: Cardinal);
var
  i: Integer;
begin
  for i := 0 to Pred(clb.Count) do
  begin
    clb.Checked[i] := Odd(n);
    n := n shr 1;
  end;
end;
Getippt und nicht getestet.

EDIT: Habe den von pszopp gefundenen Fehler korrigiert, damit garantiert niemand drüber stolpert.

Grüße vom marabu

pszopp 13. Feb 2007 08:07

Re: CheckListBox aus ini Datei lesen
 
Hi Marabu,

Zitat:

Zitat von marabu
Getippt und nicht getestet.

Stimmt, denn ich habe ausnahmsweise einen kleinen Fehler gefunden:

Delphi-Quellcode:
procedure SetCheckedStr(clb: TCheckListBox; s: String);
var
  i: Integer;
begin
  for i := 0 to Pred(clb.Count) do
    //clb.Checked[i] := (i < Length(s)) and (s[i] = '1'); Hier Zugriff auf die Chars 0..Pred(Count) !
    clb.Checked[i] := (Succ(i) <= Length(s)) and (s[Succ(i)] = '1');
end;
Gruß,
pszopp

marabu 13. Feb 2007 08:20

Re: CheckListBox aus ini Datei lesen
 
Danke für die Korrektur.

Freundliche Grüße


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:48 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz