我需要为VirtualStringTree节点使用类而不是记录。
我应该声明它是标准的(但在这种情况下是棘手的)方式:
PNode = ^TNode;
TNode = record
obj: TMyObject;
end;
//..
var
fNd: PNode;
begin
fNd:= vstTree.getNodeData(vstTree.AddChild(nil));
fNd.obj:= TMyObject.Create;
//..
还是应该直接使用TMyObject
?如果是这样 - 怎么样?!
如何分配(构建)对象并释放它?
提前致谢 米。
答案 0 :(得分:8)
设置数据大小以保存对象
vstTree.NodeDataSize := SizeOf(TMyObject);
获取datasize holder并绑定到您的对象
vstTree.getNodeData(passed in interested node)^ := your object
或
vstTree.getNodeData(vstTree.AddChild(nil))^ := TMyObject.Create;
或
使用vstTree.InsertNode方法
释放绑定对象连接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)
只需在记录中添加对象引用即可。使用OnInitNode
和OnFreeNode
事件来创建和销毁您的对象。