Delphi,VirtualStringTree - 使用类(objects)代替记录(records)

4

我需要使用类代替VirtualStringTree节点的记录。

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

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

我应该直接使用TMyObject吗?如果是这样的话 - 如何使用?!

那么,如何分配(构造)对象并释放它呢?

提前感谢 m.

4个回答

8
  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;
    

1

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

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

或者您可以尝试直接进行赋值

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


1

而且你可以在OnFreeNode事件中释放你的对象。


这应该是对Aldo答案的评论。 - jpfollenius

1

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

(Note: This is in simplified Chinese script.)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接