![]() |
TTreeView durchlaufen
Hallo,
ich habe einen TTreeView, der beliebig tief verschachtelte Nodes enthält. Einigen Nodes ist per Node.Data ein Objekt zugewiesen. Ich möchte diesen Baum nun durchlaufen um alle Nodes zu löschen, bei denen - Node.Data = nil ist und keine Kinder vorhanden sind - Node.Data = nil ist und *ausschließlich* Kinder vorhanden, bei denen Node.Data = nil ist. Beispiel: Eingabe:
Delphi-Quellcode:
Ausgabe:
Node 1 (Data = nil)
Node 1.1 (Data = nil) Node 1.2 (Data = nil) Node 1.3 (Data = nil) Node 2 Node 2.1 Node 2.1.1 (Data = nil) Node 2.1.1.1 Node 2.2 (Data = nil) Node 2.3 Node 2.3.1 (Data = nil) Node 2.3.2 Node 3
Delphi-Quellcode:
Node 2
Node 2.1 Node 2.1.1 (Data = nil) Node 2.1.1.1 Node 2.3 Node 2.3.2 Node 3 |
Re: TTreeView durchlaufen
Grundgerüst:
Delphi-Quellcode:
procedure VisitNode(node : TTreeNode);
var i : integer; s : string; begin s := StringOfChar('-', node.level); // zum Einrücken // Ausgabe der Daten writeln(s, node.Text); // rekursiver Aufruf für alle Kinder for i := 0 to node.Count-1 do VisitNode(node.Item[i]); end; |
Re: TTreeView durchlaufen
Ich kann die Nodes nicht einfach rekusiv durchlaufen, ich weiß ja nicht, was mit den Kindern ist. Es müsste irgendwie von unten nach oben durchlaufen werden. Also von den Kindern ausgehend.
|
Re: TTreeView durchlaufen
Achso, ich habe deinen Text etwas schlampig gelesen. :oops:
Delphi-Quellcode:
function VisitNode(node : TTreeNode):Boolean;
var i : integer; begin // rekursiver Aufruf für alle Kinder (Tiefensuche) for i := node.Count-1 downto 0 do // rückwärts, da durch Löschen node.Count verändert wird begin VisitNode(node.Item[i]); end; Result := (node.Data = nil) and (node.Count=0); if Result then node.delete; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:49 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 by Thomas Breitkreuz