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.