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 Große Ini-Datei in TreeView einlesen (https://www.delphipraxis.net/114932-grosse-ini-datei-treeview-einlesen.html)

Aurelius 3. Jun 2008 07:00


Große Ini-Datei in TreeView einlesen
 
Hi DPler :hi:

Mit folgendem Code möchte ich alle Sections und Werte einer Ini-Datei in eine TreeView einlesen. Da es sich dabei aber um eine Reg-Datei (im Test ca. 75 MB) handelt sind entsprechend viele Einträge vorhanden. Leider bekomme ich hier bei weitem nicht alle Sections eingelesen (Sections.Count sagt ~254), außerdem dauert das Ganze ewig lange. Sowas wie Ini.getNextSection gibt es ja leider auch nicht. Ich hoffe ihr könnt mir bei beiden Problemen helfen.

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var Ini : TIniFile;
    Sections, Werte : TStrings;
    i, j : integer;
    Knoten : TTreeNode;
begin
  Ini := TIniFile.Create('C:\Test.reg');
  Sections := TStringList.Create;
  Werte := TStringList.Create;
  try
    Ini.ReadSections(Sections);
    for i := 0 to Sections.Count - 1 do
    begin
      Knoten := rtv.Items.AddChild(nil,Sections[i]);
      Ini.ReadSectionValues(Sections[i],Werte);
      for j := 0 to Werte.Count - 1 do
      begin
        rtv.Items.AddChild(Knoten,Werte[j])
      end;
    end;
  finally
    Ini.Free;
    Sections.Free;
    Werte.Free;
  end;
end;

taaktaak 3. Jun 2008 08:33

Re: Große Ini-Datei in TreeView einlesen
 
Moin, Moin,

frü solche Datenmengen ist das TreeView vermutlich nicht gedacht. Sicherlich ist das VirtualTreeView da besser geeignet (kenne ich aber persönlich nicht). Weiter Möglichkeit: Konzept überdenken! Möglicherweise ist es ausreichend, zunächst nur die Sections in den Tree einzulesen und für jede Section ein Dummy-Child anzulegen (damit ein Plus vor der Node erscheint). Erst, wenn im Tree eine Section-Node angeklickt wird, die Werte dieser Section in den Tree einfügen. Muss man halt mal ausprobieren...

Aurelius 3. Jun 2008 08:38

Re: Große Ini-Datei in TreeView einlesen
 
Gut, damit hast du Recht. Allerdings löst das nicht das Problem mit der StringList, da dort ja leider nichta lle Werte eingelesen werden...

taaktaak 3. Jun 2008 08:44

Re: Große Ini-Datei in TreeView einlesen
 
Ohhh, das habe ich gar nicht beachtet. Die etwa 254 SectionNamen werden nicht in die Stringliste eingelesen? Komisch...

// edit: Sind da Sonderzeichen in der Datei?! Wäre spontan die einzig mögliche Erklärung

Aurelius 3. Jun 2008 08:50

Re: Große Ini-Datei in TreeView einlesen
 
Es werden nur 254 Sections eingelesen, alle anderen nicht. Sonderzeichen sollten nicht drin sein (sind ja alles Registry-Schlüssel-Namen in der Reg-Datei)

DeddyH 3. Jun 2008 08:55

Re: Große Ini-Datei in TreeView einlesen
 
Du benutzt TIniFile, oder? AFAIR kann diese nicht mit so großen Dateien umgehen. Such mal nach BigIniFile, damit könnte es gehen, leider weiß ich nicht mehr, wo ich die gefunden habe.

mkinzler 3. Jun 2008 08:56

Re: Große Ini-Datei in TreeView einlesen
 
Die ersten 254?

taaktaak 3. Jun 2008 09:02

Re: Große Ini-Datei in TreeView einlesen
 
Alternativ mit TMemIniFile lösen! Wie DeddyH schon bemerkte: TIniFile ist (unterschiedlich) limitiert; bei XP auf 64KB (wenn ich mich recht entsinne).

Aurelius 3. Jun 2008 09:05

Re: Große Ini-Datei in TreeView einlesen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ich hab das ganze mal fix angehängt. Ihr braucht nur eine große Test-Reg-Datei unter 'C:\Test.reg' (oder ihr ändert das ganze im Code um, habs nur fix hingeschludert.

Ja, es sind immer die ersten x Sections (auf meinem Laptop z.b. 164), wobei der letzte Section-Name nicht vollständig ist.

Dann werd ich mir mal TMemIniFile angucken..

taaktaak 3. Jun 2008 09:08

Re: Große Ini-Datei in TreeView einlesen
 
Ist kein Aufwand, du musst nur TIniFile in TMemIniFile ändern und an passender Stelle (sofern du die Daten auch speicherst) xxx.UpdateFile ergänzen, damit die Daten auch vom RAM auf die Festplatte kommen.

Aurelius 3. Jun 2008 18:11

Re: Große Ini-Datei in TreeView einlesen
 
Ich hab das jetzt mal mit TMemIniFile getestet, allerdings ist meine Section-Stringlist dann komplett leer. Ändere ich das aber in TIniFile "funktioniert" es wieder...

edit: Auch TMemIni kann nicht mit diesen großen Inis umgehen, ich habs mal mit einer kleinen getestet --> hat geklappt. Langsam verzwifel ich hier

bitsetter 3. Jun 2008 20:06

Re: Große Ini-Datei in TreeView einlesen
 
Hast du es nun inzwischen schon mal mit TBigIniFile von Torry.net versucht?

Aurelius 4. Jun 2008 10:24

Re: Große Ini-Datei in TreeView einlesen
 
Habe es gerade getestet, geht leider auch nicht...

alzaimar 4. Jun 2008 10:29

Re: Große Ini-Datei in TreeView einlesen
 
Gehts damit?

Aurelius 4. Jun 2008 10:39

Re: Große Ini-Datei in TreeView einlesen
 
Nein, geht nicht:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var Ini : TFIniFile;
    Sections, Werte : TStrings;
    i, j : integer;
    Knoten : TTreeNode;
begin
  Ini := TFIniFile.Create('C:\Test.reg');
  Sections := TStringList.Create;
  Werte := TStringList.Create;
  try
    Ini.ListSections(Sections);
    for i := 0 to Sections.Count - 1 do
    begin
      Knoten := rtv.Items.AddChild(nil,Sections[i]);
      {Ini.ReadSectionValues(Sections[i],Werte);
      for j := 0 to Werte.Count - 1 do
      begin
        rtv.Items.AddChild(Knoten,Werte[j])
      end;}
    end;
  finally
    Ini.Free;
    Sections.Free;
    Werte.Free;
  end;
end;

alzaimar 4. Jun 2008 10:49

Re: Große Ini-Datei in TreeView einlesen
 
Kann ich nicht nachvollziehen:
Delphi-Quellcode:
Var
  s : TStringlist;
  i,j : Integer;
  x : String;
  m : TMemIniFile;

begin
  s :=Tstringlist.create;
  For i:=0 to 1000 do begin
    x := Format('Section_%d',[i]);
    s.add('['+x+']');
    For j:=1 to 100 do
    s.add('Value_'+x+'_'+IntToStr(j));
    End;
  s.savetofile ('c:\test.reg');
  s.clear;
  m := TMemIniFile.Create('c:\test.reg');
  m.ReadSections(s);
  Showmessage(IntToStr(s.count));
  m.free;
  s.Free;
end;
Hingerotzt, liefert aber korrekte '1001'.

Aurelius 4. Jun 2008 11:17

Re: Große Ini-Datei in TreeView einlesen
 
Ich habe die Vermutung dass es WideStrings sein müssen. Dazu habe ich bei TFIniFile.ListSections(Dest: TWStrings); die WStrings aus JclWideStrings hinzugefügt. Jetzt arbeitet er auch, allerdings ist meine Liste immer noch leer...

Aurelius 5. Jun 2008 13:47

Re: Große Ini-Datei in TreeView einlesen
 
*uff* Thread nach oben schieb *stöhn*

itashadow 2. Okt 2008 13:47

Re: Große Ini-Datei in TreeView einlesen
 
gibts hier inzwischen ne lösung?:(

ok hat sich glaub ich erledigt...

(hatte ein paar leerzeilen in der ini und da ist er bei readsections rausgesprungen)


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:47 Uhr.

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