VirtualTreeView 是否管理节点用户数据的内存,或者我可以吗?
Does VirtualTreeView manage the memory for the userdata of nodes or can I?
我开始玩 VirtualTreeView,从所有网络信息和文档看来,VirtualTreeView 管理用户提供的数据(如果有记录)的内存。不必 New() 和 Dispose() 任何用户数据。只需在调用 GetNodeData 后告诉 VirtualTreeView 用户数据的大小并为其分配字段值即可。
如果我想管理它怎么办?可以吗?我可以根据需要创建用户数据并将其添加到我自己的列表中,并且只将每条记录的指针提供给 VirtualTreeView 而不会受到干扰吗?
One only has to tell VirtualTreeView the size of userdata and assign its field values after calling GetNodeData
这不完全正确 - 如果用户数据记录包含需要它的数据类型 - 即引用计数类型,如字符串和接口,还必须注意最终确定用户数据记录。这是在 OnFreeNode
事件中完成的。所以如果你的数据记录包含字符串
type
TMyNodeData = record
Foo: string;
end;
然后当节点的数据被释放时,你必须给它分配空字符串:
procedure TForm1.VT_FreeNode(Sender: TBaseVirtualTree; Node: PVirtualNode);
var ND: PMyNodeData;
begin
ND := Sender.GetNodeData(Node);
if(ND <> nil)then begin
ND.Foo := '';
end;
end;
否则你会泄露那个字符串。
自己管理内存最简单的方法是根本不使用 VT 的用户数据记录,或者只有一个指向其他数据结构的指针。
不,你不能。 VTW 使用固定大小的用户数据,因此它提供了快速计算和访问。
但是您可以请求 SizeOf(pointer)
大小 userdata
,然后将指向数据帧的指针存储在 VTW 提供的用户数据中。这些帧的数据类型及其大小及其 allocation/deallocation 您可以自行管理。您仍然必须在 VTW 提供的用户数据中存储指向它的指针,但除此之外您不会依赖它。
在较新的 Delphi (2010+) 中,您还可以使用 TDictionary<Pointer, you-data-type>
对象,并使用 VTW 提供的 PVirtualNode
作为该容器的密钥检索数据。这样您就可以将 UserData
设置为零大小,因此 VTW 只会根据自己的需要分配节点内存池。
但您尽可能更好地使用 UserData - 因为 VTW 团队专门为您优化了速度。
我开始玩 VirtualTreeView,从所有网络信息和文档看来,VirtualTreeView 管理用户提供的数据(如果有记录)的内存。不必 New() 和 Dispose() 任何用户数据。只需在调用 GetNodeData 后告诉 VirtualTreeView 用户数据的大小并为其分配字段值即可。
如果我想管理它怎么办?可以吗?我可以根据需要创建用户数据并将其添加到我自己的列表中,并且只将每条记录的指针提供给 VirtualTreeView 而不会受到干扰吗?
One only has to tell VirtualTreeView the size of userdata and assign its field values after calling GetNodeData
这不完全正确 - 如果用户数据记录包含需要它的数据类型 - 即引用计数类型,如字符串和接口,还必须注意最终确定用户数据记录。这是在 OnFreeNode
事件中完成的。所以如果你的数据记录包含字符串
type
TMyNodeData = record
Foo: string;
end;
然后当节点的数据被释放时,你必须给它分配空字符串:
procedure TForm1.VT_FreeNode(Sender: TBaseVirtualTree; Node: PVirtualNode);
var ND: PMyNodeData;
begin
ND := Sender.GetNodeData(Node);
if(ND <> nil)then begin
ND.Foo := '';
end;
end;
否则你会泄露那个字符串。
自己管理内存最简单的方法是根本不使用 VT 的用户数据记录,或者只有一个指向其他数据结构的指针。
不,你不能。 VTW 使用固定大小的用户数据,因此它提供了快速计算和访问。
但是您可以请求 SizeOf(pointer)
大小 userdata
,然后将指向数据帧的指针存储在 VTW 提供的用户数据中。这些帧的数据类型及其大小及其 allocation/deallocation 您可以自行管理。您仍然必须在 VTW 提供的用户数据中存储指向它的指针,但除此之外您不会依赖它。
在较新的 Delphi (2010+) 中,您还可以使用 TDictionary<Pointer, you-data-type>
对象,并使用 VTW 提供的 PVirtualNode
作为该容器的密钥检索数据。这样您就可以将 UserData
设置为零大小,因此 VTW 只会根据自己的需要分配节点内存池。
但您尽可能更好地使用 UserData - 因为 VTW 团队专门为您优化了速度。