Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi TreeView - NodeExists Funktion ? (https://www.delphipraxis.net/126224-treeview-nodeexists-funktion.html)

moelski 20. Dez 2008 10:17


TreeView - NodeExists Funktion ?
 
Moin !

Kann mir jemand sagen wie ich ein NodeExist realisieren kann?

Ich habe es mal so probiert:
Delphi-Quellcode:
function Node_Exists(Node : TTreeNode): Boolean;
begin
  Result := assigned(Node);
end;
Aber das geht nicht.

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).

DeddyH 20. Dez 2008 10:24

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.

mkinzler 20. Dez 2008 10:34

Re: TreeView - NodeExists Funktion ?
 
Dann könnte man aber auf die Funktion verzichten und direkt assigned verwenden

DeddyH 20. Dez 2008 10:39

Re: TreeView - NodeExists Funktion ?
 
Jepp, wobei sich "Node_Exists" aber später besser lesen lässt.

moelski 20. Dez 2008 10:52

Re: TreeView - NodeExists Funktion ?
 
Hmm aber ich lösche den Knoten doch schon:
Delphi-Quellcode:
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;
Muss ich dann den gelöschten Knoten (und ggf. seine ChildNodes) alle explizit auf NIL setzen :gruebel:

DeddyH 20. Dez 2008 10:55

Re: TreeView - NodeExists Funktion ?
 
Entweder das oder mit FreeAndNil freigeben.

mkinzler 20. Dez 2008 11:01

Re: TreeView - NodeExists Funktion ?
 
Ich würde die beiden If Anweisungen verschmelzen und auf das Exit verzichten
Delphi-Quellcode:
if Node.Data <> nil then ...

moelski 20. Dez 2008 11:05

Re: TreeView - NodeExists Funktion ?
 
Moin !

Das will nicht. Selbst wenn ich das auf einen Node anwende:
Delphi-Quellcode:
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;
Dann kriege ich bei:
Delphi-Quellcode:
function Node_Exists(Node : TTreeNode): Boolean;
begin
  Result := assigned(Node);
end;
Immer ein True als Ergebnis. :gruebel:

moelski 20. Dez 2008 12:36

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;

DeddyH 20. Dez 2008 12:40

Re: TreeView - NodeExists Funktion ?
 
Am Ende wird alles gut :mrgreen: :thumb:

omata 20. Dez 2008 17:10

Re: TreeView - NodeExists Funktion ?
 
Zitat:

Zitat von moelski
So nachdem ich mein Löschen erweitert habe und alles auf NIL setze und auch rekursiv lösche gehts nun

:?:

Zitat:

Zitat von moelski
Delphi-Quellcode:
:
    Node.Data := NIL;
    TNodeInfo(Node.Data).Free;
:

:
  Node := NIL;
  Node.Free;
:

Kannst du mal bitte erklären, was das für Aktionen sind? Für mich sind die sinnfrei. Mal abgesehen von dem verwendeten exit und der komischen While-Schleife, die zwar refursiv arbeitet, aber niemals prüft, ob Node überhaupt noch existiert. Hast du überhaupt mal mit deiner Routine den letzten Node in deiner Struktur gelöscht?

moelski 21. Dez 2008 08:42

Re: TreeView - NodeExists Funktion ?
 
Moin !

Zitat:

Kannst du mal bitte erklären, was das für Aktionen sind?
Wenn ich nur mit Delete arbeite hat meine Überprüfung "NODE <> NIL" nicht funktioniert. ´

Zitat:

While-Schleife, die zwar refursiv arbeitet, aber niemals prüft, ob Node überhaupt noch existiert
Also ich habe sie getestet und die While Schleife arbeitet hervorragend. Man kann einzelne Elemente löschen aber auch ganze Treestrukturen.

Zitat:

ob Node überhaupt noch existiert
Warum sollte ich das auch tun. Die While Schleife selber prüft auf die Existenz von Child Nodes.

Zitat:

Hast du überhaupt mal mit deiner Routine den letzten Node in deiner Struktur gelöscht?
Ja das geht hervorrangend.

Das Exit am Anfang muss sicher nicht sein. Da gebe ich dir Recht. Aber es schadet auch nicht ...

omata 21. Dez 2008 17:21

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...

moelski 21. Dez 2008 18:26

Re: TreeView - NodeExists Funktion ?
 
Wie sollte die Funktion denn deiner Meinung nach aussehen?
Nur weil sie so funktioniert muss sie ja nicht korrekt sein.

omata 21. Dez 2008 22:44

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