Question

I need to use a class instead of record for VirtualStringTree node.

Should I declare it standard (but in this case - tricky) way like that:

PNode = ^TNode;
TNode = record
 obj: TMyObject;
end;
//..
var
 fNd: PNode;
begin
fNd:= vstTree.getNodeData(vstTree.AddChild(nil));
fNd.obj:= TMyObject.Create; 
//..

or should I use directly TMyObject? If so - how?! How about assigning (constructing) the object and freeing it?

Thanks in advance m.

Was it helpful?

Solution

  1. Setup datasize for holding object

    vstTree.NodeDataSize := SizeOf(TMyObject); 
    
  2. Get the datasize holder and bind to your object

    vstTree.getNodeData(passed in interested node)^ := your object
    

    or

    vstTree.getNodeData(vstTree.AddChild(nil))^ := TMyObject.Create;
    

    or
    use vstTree.InsertNode method

  3. To free the binding object hookup the OnFreeNode event

    vstTree.OnFreeNode := FreeNodeMethod;
    

    with

    procedure TFoo.FreeNodeMethod(Sender: TBaseVirtualTree; Node: PVirtualNode);
    var
      P: ^TMyObject;
    begin
      P := Sender.getNodeData(Node);
      if P <> nil then
      begin
          P^.Free;
          P^ := nil; //for your safety or you can omit this line
      end;
    end;
    

OTHER TIPS

you could create the object instance after receiving the node data, as in :

fNd:= vstTree.getNodeData(vstTree.AddChild(nil)); 
fnd.obj := TMbyObject.Create;

or you could try and assign it directly

Pointer(Obj) := vstTree.getNodeData(...);

And you can free your object in OnFreeNode event.

Just add an object reference to your record. Use the OnInitNode and OnFreeNode events to create and destroy your object.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top