![]() |
TreeView - NodeExists Funktion ?
Moin !
Kann mir jemand sagen wie ich ein NodeExist realisieren kann? Ich habe es mal so probiert:
Delphi-Quellcode:
Aber das geht nicht.
function Node_Exists(Node : TTreeNode): Boolean;
begin Result := assigned(Node); end; Ich merke mir in einer Variable einen TTreeNode. Und die Funktion soll mit False zurück kommen wenn dieser Node nicht mehr existiert (weil gelöscht). |
Re: TreeView - NodeExists Funktion ?
Assigned prüft ja auf nil. Wenn Du den TTreeNode beim Löschen also auf nil setzt, sollte das auch gehen. Vielleicht gäbe es auch andere Möglichkeiten, aber ich habe gerade kein Delphi zur Hand, um nachzusehen.
|
Re: TreeView - NodeExists Funktion ?
Dann könnte man aber auf die Funktion verzichten und direkt assigned verwenden
|
Re: TreeView - NodeExists Funktion ?
Jepp, wobei sich "Node_Exists" aber später besser lesen lässt.
|
Re: TreeView - NodeExists Funktion ?
Hmm aber ich lösche den Knoten doch schon:
Delphi-Quellcode:
Muss ich dann den gelöschten Knoten (und ggf. seine ChildNodes) alle explizit auf NIL setzen :gruebel:
procedure Node_Delete (Node : TTreeNode);
begin if( Node = nil ) then Exit; {Free the class} if( Node.Data <> nil ) then TNodeInfo(Node.Data).Free; {Delete the node} Node.Delete; end; |
Re: TreeView - NodeExists Funktion ?
Entweder das oder mit FreeAndNil freigeben.
|
Re: TreeView - NodeExists Funktion ?
Ich würde die beiden If Anweisungen verschmelzen und auf das Exit verzichten
Delphi-Quellcode:
if Node.Data <> nil then ...
|
Re: TreeView - NodeExists Funktion ?
Moin !
Das will nicht. Selbst wenn ich das auf einen Node anwende:
Delphi-Quellcode:
Dann kriege ich bei:
procedure Node_Delete (Node : TTreeNode);
begin if( Node = nil ) then Exit; {Free the class} if( Node.Data <> nil ) then TNodeInfo(Node.Data).Free; {Delete the node} Node.Delete; Node.Free; Node := NIL; end;
Delphi-Quellcode:
Immer ein True als Ergebnis. :gruebel:
function Node_Exists(Node : TTreeNode): Boolean;
begin Result := assigned(Node); end; |
Re: TreeView - NodeExists Funktion ?
Moin !
So nachdem ich mein Löschen erweitert habe und alles auf NIL setze und auch rekursiv lösche gehts nun :-)
Delphi-Quellcode:
procedure Node_Delete (Node : TTreeNode);
begin if( Node = nil ) then Exit; while node.HasChildren do begin Node_Delete(node.Item[0]); end; //ShowMessage('Lösche : ' + Node.Text); {Free the class} if( Node.Data <> nil ) then begin TNodeInfo(Node.Data).NodeParent := NIL; Node.Data := NIL; TNodeInfo(Node.Data).Free; end; {Delete the node} Node.Delete; Node := NIL; Node.Free; end; |
Re: TreeView - NodeExists Funktion ?
Am Ende wird alles gut :mrgreen: :thumb:
|
Re: TreeView - NodeExists Funktion ?
Zitat:
Zitat:
|
Re: TreeView - NodeExists Funktion ?
Moin !
Zitat:
Zitat:
Zitat:
Zitat:
Das Exit am Anfang muss sicher nicht sein. Da gebe ich dir Recht. Aber es schadet auch nicht ... |
Re: TreeView - NodeExists Funktion ?
Ok, wenn das alles geht, dann ist ja alles gut.
Ich hatte eigentlich immer gedacht, dass ich einen Zeiger, der auf NIL zeigt nicht freigeben kann. Aber man lernt ja nie aus. Bei der Schleife hatte ich eigentlich gedacht nochmal zu prüfen, ob sie vielleicht auch mal beendet werden muss, falls dort nämlich zufällig mal kein Node mit weiteren Kindern vorhanden ist. Ich vermute auch mal, das ein Speichertest da einiges ans Tageslicht bringen würde. Aber wenn augenscheinlich die gewünschte Funktion vorhanden ist, dann wird wohl doch "alles gut" sein. Naja, war ein Versuch auf garantiert vorhandene Problemstellen aufmerksam zu machen. Nichts für ungut... |
Re: TreeView - NodeExists Funktion ?
Wie sollte die Funktion denn deiner Meinung nach aussehen?
Nur weil sie so funktioniert muss sie ja nicht korrekt sein. |
Re: TreeView - NodeExists Funktion ?
Habe deine Schleife jetzt erst richtig verstanden, bleiben noch die NIL-Stellen...
Delphi-Quellcode:
procedure Node_Delete(Node : TTreeNode);
var NodeObject:TObject; begin if assigned(Node) then begin while Node.HasChildren do Node_Delete(Node.Item[0]); {Free the class} NodeObject:=Node.Data; if assigned(NodeObject) then NodeObject.Free; {Delete the node} Node.Delete; end; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:54 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-2025 by Thomas Breitkreuz