VirtualTreeView是为节点的用户数据管理内存,还是可以



我开始玩VirtualTreeView,从所有的web信息和文档来看,VirtualTreeView似乎管理着用户提供的数据(记录,如果有的话)的内存。不必新建()和丢弃()任何用户数据。只需告诉VirtualTreeView用户数据的大小,并在调用GetNodeData后分配其字段值。

如果我想管理它呢?能做到吗?我可以随心所欲地创建用户数据并将其添加到我自己的列表中,并且只向VirtualTreeView提供每个记录的指针而不受其干扰吗?

调用GetNodeData 后,只需告诉VirtualTreeView用户数据的大小并分配其字段值

这并不完全正确——如果用户数据记录包含需要它的数据类型,也就是引用计数的类型,如字符串和接口,还必须注意最终确定用户数据记录。这是在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提供的用户数据中。这些帧中的数据类型及其大小以及它们的分配/解除分配,您将自行管理。尽管如此,您还是必须将指向它的指针存储在VTW提供的用户数据中,但除此之外,您将不依赖它

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

但尽可能让您更好地使用UserData,因为VTW团队专门为您优化了速度。

最新更新