4

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

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

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

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

提前谢谢米。

4

4 回答 4

8
  1. 设置对象的数据大小

    vstTree.NodeDataSize := SizeOf(TMyObject); 
    
  2. 获取数据大小持有者并绑定到您的对象

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

    或者

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


    使用 vstTree.InsertNode 方法

  3. 释放绑定对象连接 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;
    
于 2010-02-18T22:21:57.873 回答
1

您可以在收到节点数据后创建对象实例,如下所示:

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

或者您可以尝试直接分配它

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

于 2010-02-18T20:01:16.847 回答
1

您可以在 OnFreeNode 事件中释放您的对象。

于 2010-02-18T21:53:27.297 回答
1

只需将对象引用添加到您的记录。使用OnInitNodeOnFreeNode事件来创建和销毁您的对象。

于 2010-02-18T22:10:28.433 回答