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 TTreenode Problem mit getNextSibling (https://www.delphipraxis.net/63062-ttreenode-problem-mit-getnextsibling.html)

Redfox 13. Feb 2006 16:39


TTreenode Problem mit getNextSibling
 
Hallo,

ich habe ein Problem mit dem durchlaufen der Zweige der Ebene 0 mit getNextSibling.
Ich schreibe an einer Projektverwaltung für meine Firma. Darin werden in einem TTreeview die Projekte mit den entsprechenden Unterprojekten dargestellt. In der Datenbanktabelle für die Projekte werden diese mit einer Referenz auf das Überprojekt (Id) gespeichert. Das Ganze wird für jeden Knoten mit gespeichert.
Bei Auswahl eines Projektstatus sollen nur die Hauptprojekte (Projekte ohne Überprojekt) angezeigt werden. Die Unterprojekte sollen auf jeden Fall angezeigt werden. Um sicher zu gehen das ich auch alle Unterprojekte habe füge ich alle Unterprojekte, egal zu welchem Hauptprojekt diese gehören, zum Treeview hinzu und verschiebe diese dann unter die entsprechenden Überprojekte. Das funktioniert gut. Nun habe ich aber das Problem das ich noch Unterprojekte in meinem Tree habe die sich in der ersten Ebene befinden. Diese möchte ich mit dem jeweiligen Zweig löschen.

Ich will also alle Knoten der 1. Ebene durchgehen und überprüfen ob diese ein Überprojekt haben. Wenn ich das mache wie ich es angefügt habe, scheint aber getNextSibling nicht richtig zu funktionieren. Ich sehe das auch Knoten Level 1 und größer durchlaufen werden. Was läuft da falsch? Verwende ich getNextSibling falsch?

Gibt es sonst noch eine praktikable Lösung nur Knoten in Level 0 zu durchlaufen?

Ich habe folgenden Code:
ausblenden anzeigen Delphi-Quelltext
Delphi-Quellcode:
prjnode := PrjTreeview.Items.GetFirstNode;
while (prjnode <> nil) do
begin
  prjidx := prjnode.Index;
  if ((PNodeDaten((PrjTreeview.Items[prjidx]).Data).ParentId > 0) and (PrjTreeview.Items[prjidx].Level = 0)) then
  begin
    helpnode := prjnode.getNextSibling;
    prjnode.DeleteChildren;
    prjnode.Delete;
    prjnode := helpnode;
    helpnode := nil;
  end
  else
  begin
    prjnode := prjnode.getNextSibling;
  end;
end;
Vielen Dank im Voraus.

Daniel

marabu 13. Feb 2006 18:30

Re: TTreenode Problem mit getNextSibling
 
Auch wenn du schon eine Weile mitgelesen hast - herzlich willkommen in der Delphi-PRAXiS, Daniel.

Dein Code lässt sich noch etwas verbessern:

Delphi-Quellcode:
function TForm1.IsOrphan(tn: TTreeNode): Boolean;
begin
  Result := (PNodeDaten(tn.Data).ParentId > 0)
    and (tn.Level = 0);
end;

procedure TForm1.PurgeButtonClick(Sender: TObject);
var
  tnThis, tnNext: TTreeNode;
begin
  tnThis := Treeview.Items.GetFirstNode;
  while Assigned(tnThis) do
  begin
    tnNext := tnThis.getNextSibling;
    if isOrphan(tnThis) then
      tnThis.Delete;
    tnThis := tnNext;
  end;
end;
Wenn der Speicher, auf den der im property Data abgelegte Pointer verweist, beim Delete des Knoten frei gegeben werden muss, dann kannst du das elegant im Ereignis OnDelete der TreeView erledigen.

Soviel zum Code - aber auch dein Ansatz ist verbesserungsfähig. Warum hängst du alle Daten zuerst als top level nodes in die TreeView? Wenn die Daten in einer selbst-rekursiven Tabelle gespeichert vorliegen, dann kannst du sie bei geigneter Sortierung direkt an der richtigen Stelle einfügen.

Oft reicht auch eine simple Datensatznummer, hinterlegt in der Eigenschaft Data des Knoten, um den Bezug zu den Tabellendaten herstellen zu können.

Grüße vom marabu


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