Knoten eines TreeViews vergleichen

Rund um die LCL und andere Komponenten
Antworten
pschoett
Beiträge: 36
Registriert: Sa 7. Feb 2015, 11:48

Knoten eines TreeViews vergleichen

Beitrag von pschoett »

Hallo allerseits,
ich möchte per Drag and Drop ganze Äste eines Treeviews verschieben. Dieses Beispiel verwende ich als Vorlage. Dabei wird nur ein einzelner Knoten kopiert.

Beim Verschieben ganzer Äste muss ich darauf achten, dass keine Zirkelbezüge entstehen. D.h. es darf kein Knoten auf einen seiner Nachkommen verschoben werden.

Code: Alles auswählen

 
procedure TForm1.TreeView1DragDrop(Sender, Source: TObject; X, Y: Integer);
vat
  quellknoten, zielknoten: TTreeNode;
begin
  quellknoten := TreeView1.Selected;
  zielknoten := TreeView1.GetNodeAt(x,y);
  while zielknoten <> nil do
    If (zielknoten = quellknoten) then  // <-- Kann ich die Gleichheit zweier Knoten, auf diese Weise ermitteln?
      begin
        showmessage("Achtung Zirkelbezug!");
        exit;
      end
    else
      zielknoten := zielknoten.GetParent;  //  <-- die Funktion gibt es nicht. Wie springe ich zum Vater?
end;
 
Kann ich das so machen?

Gruß,
Peter

Komoluna
Beiträge: 565
Registriert: So 26. Aug 2012, 09:03
OS, Lazarus, FPC: Windows(10), Linux(Arch)
CPU-Target: 64Bit

Re: Knoten eines TreeViews vergleichen

Beitrag von Komoluna »

Code: Alles auswählen

If (zielknoten = quellknoten) then  // <-- Kann ich die Gleichheit zweier Knoten, auf diese Weise ermitteln?
ja, da TTreeNode eine Klasse ist, und bei einer Zuweisung nur die Speicheradresse, und nicht der Speicherinhalt kopiert wird.
(selbe Addresse = selber Node)

Code: Alles auswählen

zielknoten := zielknoten.GetParent;  //  <-- die Funktion gibt es nicht. Wie springe ich zum Vater?
Guck dir die Property TTreeNode.Parent an. Da wird einfach der Parentnode gespeichert.

Alternative:

Code: Alles auswählen

function HasAsParent(AValue: TTreeNode): Boolean;
Diese Methode prüft ob AValue ein Parent von dem Node, dessen HasAsParent funktion aufgerufen wurde.
Da die Funktion rekursiv Arbeitet brauchst du damit nur fragen:

Code: Alles auswählen

 
if zielknoten.HasAsParent(quellknoten) or (zielknoten = quellknoten) then
//Fehler ausgeben und beenden
else
//verschieben
MFG

Komoluna
Programmer: A device to convert coffee into software.

Rekursion: siehe Rekursion.

pschoett
Beiträge: 36
Registriert: Sa 7. Feb 2015, 11:48

Re: Knoten eines TreeViews vergleichen

Beitrag von pschoett »

Vielen Dank, das ist genau was ich benötige. Beide Varianten die Eigenschaft Parent und die Funktion HasAsParent funktionieren.

Allerdings ist die Doku für HasAsParent falsch formuliert oder ich verstehe es aufgrund meiner Englischkenntnisse falsch.

Code: Alles auswählen

TTreeNode.HasAsParent
HasAsParent - returns True if the node specified by AValue has a parent 
public function TTreeNode.HasAsParent( AValue: TTreeNode ):Boolean;
Kann man dort die Dokumentation selber verbessern?

Komoluna
Beiträge: 565
Registriert: So 26. Aug 2012, 09:03
OS, Lazarus, FPC: Windows(10), Linux(Arch)
CPU-Target: 64Bit

Re: Knoten eines TreeViews vergleichen

Beitrag von Komoluna »

Stimmt, da hast du Recht. Die Doku ist in der Tat falsch...
(Oder wir können beide kein Englisch ^v^)

MFG

Komoluna
Programmer: A device to convert coffee into software.

Rekursion: siehe Rekursion.

Antworten