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