Delphi,VirtualStringTree - 类(对象)而不是记录

时间:2010-02-18 12:14:50

标签: delphi class delphi-7 virtualtreeview

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

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

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

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

提前致谢 米。

4 个答案:

答案 0 :(得分:8)

  1. 设置数据大小以保存对象

    vstTree.NodeDataSize := SizeOf(TMyObject); 
    
  2. 获取datasize holder并绑定到您的对象

    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;
    

答案 1 :(得分:1)

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

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

或者您可以尝试直接分配

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

答案 2 :(得分:1)

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

答案 3 :(得分:1)

只需在记录中添加对象引用即可。使用OnInitNodeOnFreeNode事件来创建和销毁您的对象。