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 TTreeView durchlaufen (https://www.delphipraxis.net/131802-ttreeview-durchlaufen.html)

BlueStarHH 31. Mär 2009 10:12


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:
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
Ausgabe:

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

shmia 31. Mär 2009 10:27

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;

BlueStarHH 31. Mär 2009 10:33

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.

shmia 31. Mär 2009 10:47

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 11:21 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