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 Datei in ein TVirtualStringTree einlesen (https://www.delphipraxis.net/52894-datei-ein-tvirtualstringtree-einlesen.html)

freak1985 6. Sep 2005 11:45


Datei in ein TVirtualStringTree einlesen
 
hi @all,

ich eine Datei in folgendem Format, die ich gerne in ein VirtualStringTree einlesen möchte:

Item1 | FirstSubItem1 | SecondSubItem1 | ThirdSubItem1
Item2 | FirstSubItem1
Item1 | FirstSubItem2 | SecondSubItem2 | ThirdSubItem2
Item1 | FirstSubItem3
Item1 | FirstSubItem2 | SecondSubItemA | ThirdSubItemB


also hoffe ihr versteht was ich meine. Ordnung ist keine vorhanden^^.

der zugehörige baum soll dann folgendermaßen aussehen:
Code:
Item1
  |_ FirstSubItem1
  | |_ SecondSubItem1
  |   |_ThirdSubItem1
  |
  |_ FirstSubItem2
  | |_ SecondSubItem2
  | |  |_ ThirdSubItem2
  | |_ SecondSubItemA
  |   |_ ThirdSubitemB
  |
  |_ FirstSubItem3

Item2
  |_FirstSubItem1

so ich hoffe ihr versteht was ich meine. Leider kann ich das Problem nicht besser darstellen :-\

Ich weiße nocheinmal darauf hin, dass die Einträge in der Datei durcheinander sein können...


Hoffe auf hilfe :)



MfG

freak1985 6. Sep 2005 13:47

Re: Bestimmte Datei in ein TVirtualStringTree einlesen
 
so. nach langem Hin und Her hab ich es endlich geschafft^^


Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
type
  TMyNode = record
    Name: String;
    Node: PVirtualNode;
  end;

var
  i, k: Integer;
  TreeData: TTreeData;
  tmp: TStringDynArray;
  tmpNode: PVirtualNode;
  NodeList: array of TMyNode;
  tmp_: cardinal;


  function GetNode(NName: String): PVirtualNode;
  var
    j: integer;
  begin
    Result := nil;

    for j := Low(NodeList) to High(NodeList) do
      if NName = NodeList[j].Name then
        Result := NodeList[j].Node;

  end;

begin
  tmp_ := GetTickCount;

  // VirtualStringTree vorbereiten
  VST.NodeDataSize:=SizeOf(TTreeData);
  VST.BeginUpdate;

  // Liste durchlaufen
  for i := 0 to ListBox1.Items.Count - 1 do
  begin

    tmp := Explode('|', ListBox1.Items[i]);

    tmpNode := nil;

    // Teile durchlaufen
    for k := Low(tmp) to High(tmp) do
    begin
      TreeData.FCaption := tmp[k];
      TreeData.FData := tmp[k];

      if GetNode(tmp[k]) = nil then
        tmpNode := AddVSTStructure(VST, tmpNode, TreeData)
      else
        tmpNode := GetNode(tmp[k]);

      // Node merken
      SetLength(NodeList, Length(NodeList) + 1);
      NodeList[Length(NodeList) - 1].Name := tmp[k];
      NodeList[Length(nodeList) - 1].Node := tmpNode;

    end;

  end;

  VST.EndUpdate;

  caption := inttostr(gettickcount - tmp_) + 'ms';


end;

das Problem ist nur die Geschwindigkeit. Das dauert fast 2 sekunden. die Datei hat 2000 Zeilen....


hat jemand eine effizientere Lösung?



MfG


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:14 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