VirtualTreeView是否为节点的用户数据管理内存,或者我可以吗?

时间:2015-12-23 19:29:59

标签: delphi virtualtreeview

我开始使用VirtualTreeView,从所有Web信息和文档中可以看出VirtualTreeView管理用户提供的数据的内存(如果有的话,记录)。一个人没有New()和Dispose()任何用户数据。只需要告诉VirtualTreeView userdata的大小,并在调用GetNodeData后分配其字段值。

如果我想管理该怎么办?可以吗?我可以根据需要创建用户数据并将其添加到我自己的列表中,并且只提供每条记录的指针到VirtualTreeView而不会干扰它吗?

2 个答案:

答案 0 :(得分:6)

  

只需告诉VirtualTreeView userdata的大小,并在调用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的用户数据记录,或只有指向其中某些其他数据结构的指针。

答案 1 :(得分:2)

不,你不能。 VTW使用固定大小的用户数据,因此可以快速计算和访问。

但您可以请求SizeOf(pointer) userdata大小,然后将指针存储到VTW提供的用户数据中的数据框中。这些框架中的数据类型及其大小以及您自己管理的分配/取消分配。你仍然需要在VTW提供的用户数据中存储指针,但除此之外你不会依赖它。

在较新的Delphi(2010+)中,您还可以使用TDictionary<Pointer, you-data-type>对象,并使用VTW提供的PVirtualNode作为该容器的密钥来检索数据。这样你就可以将UserData设置为零大小,因此VTW只会根据自己的需要分配节点内存池。

但是尽可能地为用户提供更好的用户数据 - 因为它是由VTW团队专门针对您进行速度优化的。