Auch noch ein Tipp von mir
function AddChild(Parent: PVirtualNode; UserData: Pointer = nil): PVirtualNode;
Viele wissen nicht genau, was man mit UserData anfangen kann.
Es ist aber ganz nützlich, weil man damit Daten noch vor dem OnInitNode Event dem Knoten zuweisen kann.
Der Parameter UserData wird dabei direkt auf die ersten 4 Bytes des Records gesetzt.
D.h.
Delphi-Quellcode:
Type
PMyNodeData = ^TMyNodeData;
TMyNodeData = record
MyData : Pointer; <-- UserData aus AddChild
Rest ...
end;
Da kommen die Daten rein. Dabei muss es sich nicht um ein Pointer handeln, auch eine Klasseninstanz oder Interface geht - also alles was 4 Byte beansprucht. Nur sollte im Record auch wirklich ein 4 Byte Typ stehen und nicht etwa weniger. Sonst kommt es gerne mal zu Nebenwirkungen.
Wenn man UserData benutzt, bekommt der Knoten einen State zugewiesen, so dass man dies in OnInitNode überprüfen kann :
if vsInitialUserData in Node.States then
Wichtig zu wissen ist dabei, dass der var Parameter InitialStates von OnInitNode nicht diesen Status enthält.