Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi GetNext implementieren (https://www.delphipraxis.net/78650-getnext-implementieren.html)

_frank_ 8. Okt 2006 22:25


GetNext implementieren
 
Hi,

ich bin dabei eine Hintergrund-Klasse für meinen DFMeditor zu schreiben, nur leider habe ich bisschen Probleme mit der recursiven getNext-funktion...

Da der komplette Code bisschen viel ist, hab ich den mal hier http://coder.cycnus.de/entry.php?id=963 geposted.

TCompInfo stellt eine Komponente dar, hat 2 Listen (sub-Komponenten und Eigenschaften) und so entsteht ein Baum. Diesen will ich zur Anzeige rekursiv durchlaufen, um diese Struktur in einem Treeview darzustellen:

Delphi-Quellcode:
var Comp:TCompInfo;
    Prop:TPropInfo;
    tn:TTreenode;
    i:integer;
begin
  comp:=rootcomp;
  tn:=nil;
  while assigned(comp) do
  begin
    tn:=treeview1.items.Add(tn,comp.name+':'+comp.TypeName);
    for i:=0 to comp.Properties.Count-1 do
    begin
      prop:=comp.Properties.GetItem(i);
      Treeview1.Items.AddChild(tn,prop.Name+' = '+prop.Value);
    end;
    comp:=comp.GetNext;
  end;
end;

ich habe festgestellt das das "result:=FParent.GetNext;" falsch ist, da dort dann wieder mit item 0 angefangen wird (result:=FComponents.GetItem(0)) und somit eine Endlosschleife erzeugt wird. Wie könnte ich das lösen?

Gruß Frank

marabu 9. Okt 2006 07:45

Re: GetNext implementieren
 
Guten Morgen Frank.

Um deine Baumstruktur rekursiv in eine TreeView zu laden genügt es, wenn die Laderoutine rekursiv ist. Deine Komponente muss lediglich eine Möglichkeit zur Iteration über die Unterkomponenten anbieten - und das tut sie ja auch ohne GetNext().

Delphi-Quellcode:
procedure AddNodes(nodes: TTreeNodes; nParent: TTreeNode; ciRoot: TCompInfo);
var
  i: Integer;
  ci: TCompInfo;
  tn: TTreeNode;
begin
  with ciRoot.Components do
    for i := 0 to Pred(Count) do
    begin
      ci := Items[i];
      tn := nodes.AddChildObject(nParent, DisplayName(ci), ci);
      AddNodes(nodes, tn, ci);
    end;
end;
In der Funktion DisplayName() kannst du den Anzeigenamen für die jeweilige Komponente erzeugen. Der Aufruf könnte so aussehen:

Delphi-Quellcode:
begin
  with TreeView do
  begin
    Items.BeginUpdate;
    Items.Clear;
    AddNodes(Items, nil, rootComp);
    Items.EndUpdate;
  end;
end;
Alles nur getippt und nicht getestet.

Grüße vom marabu


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