我需要为 VirtualStringTree 节点使用类而不是记录。

我应该像这样声明它是标准的(但在这种情况下 - 棘手):

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

还是应该直接使用 TMyObject ?如果是这样 - 如何?!
如何分配(构造)对象并释放它?

提前致谢
米。

最佳答案

  • 设置保持对象的数据大小
    vstTree.NodeDataSize := SizeOf(TMyObject);
    
  • 获取数据大小持有者并绑定(bind)到您的对象
    vstTree.getNodeData(passed in interested node)^ := your object
    

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

    或者
    使用 vstTree.InsertNode 方法
  • 释放绑定(bind)对象hookup OnFreeNode 事件
    vstTree.OnFreeNode := FreeNodeMethod;
    


    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;
    
  • 10-07 16:41