Einzelnen Beitrag anzeigen

peterbelow

Registriert seit: 12. Jan 2019
Ort: Hessen
669 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Treeview: Parent löscht die Daten meiner CustomNode

  Alt 13. Jun 2019, 17:44
Ich benutze eine TreeView und möchte in den einzelnen Nodes zusätzliche Daten speichern.

Delphi-Quellcode:
type TCustomNode = class(TTreeNode)
  public
    MyData:String;
end;
Folgerung:
- Die Zuweisung 'Parent := ' sorgt dafür, dass mein Variablen in meiner Custom-Node geleert werden.

Fragen an euch:
- Wisst ihr warum?
- Mache ich was falsch?
- Gibt es bessere Möglichkeiten?
TTreeeview ist ein Windows custom control und die Nodes werden intern von Windows verwaltet, wobei die VCL aber halt einen "Überbau" in Form von TTreeNode et Cie. bereitstellt, um den ganzen hässlichen API-Kram zu verbergen. Aber so ganz geht das nicht. Wenn das Window handle eines TTreeview zum ersten mal angelegt wird werden die API-Level nodes erzeugt und mit den eventuell zur Design-Zeit angelegten TTReenode-Daten initialisiert. Wenn sich das Handle dann später ändert, z. B. weil das eines Forms oder Panels oder wo immer der Treeview enthalten ist neu angelegt wird, wird das Control auf dem API-level komplett neu erzeugt und dabei werden alle existierenden API-level Nodes zerstört. Damit die Daten des Treeviews das überleben speichert die VCl die komplette TTreenode-Collection in einem TMemoryStream (in DestroyWnd des TTreeview) und rekonstruiert die dann, wenn das neue Windowhandle angelegt wurde, aus diesem Stream.

Leider weis die VCL nichts von deinen zusätzlichen Daten in TCustomNode, deshalb überleben die die Änderung des Handles nicht. Früher konnte man das selbst nachflicken, da die entsprechenden Methoden (ReadNodeData und WriteNodeData) in TTreenode protected und virtual waren. Leider sind sie das nicht mehr in neueren Versionen der VCL (hat wohl was mit der Unterstützung von 64 bit Anwendungen zu tun), wie ich gerade feststellen mußte. Dadurch ist es leider reichlich unnütz geworden, eine eigene Nodeklasse zu verwenden. Da hat jemand definitiv was kaputt gemacht...

Wenn Du also mehr Daten an einen Node binden willst geht das nur noch über die Data-Property.
Peter Below
  Mit Zitat antworten Zitat