【问题标题】:Does VirtualTreeView manage the memory for the userdata of nodes or can I?VirtualTreeView 是否管理节点用户数据的内存,或者我可以吗?
【发布时间】:2015-12-23 19:29:59
【问题描述】:

我开始使用 VirtualTreeView,从所有的网络信息和文档看来,VirtualTreeView 管理用户提供的数据的内存(如果有的话,记录)。无需 New() 和 Dispose() 任何用户数据。只需在调用 GetNodeData 后告诉 VirtualTreeView 用户数据的大小并分配其字段值即可。

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

【问题讨论】:

    标签: delphi virtualtreeview


    【解决方案1】:

    只需要在调用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 的用户数据记录,或者只在其中有一个指向其他数据结构的指针。

    【讨论】:

      【解决方案2】:

      不,你不能。 VTW 使​​用固定大小的用户数据,因此它提供了快速计算和访问。

      但是您可以请求userdataSizeOf(pointer) 大小,然后将指向您的数据帧的指针存储在VTW 提供的用户数据中。这些帧的数据类型及其大小以及您自己管理的分配/解除分配。您仍然必须将指向它的指针存储在 VTW 提供的用户数据中,但除此之外您不会依赖它。

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

      但您最好尽可能使用 UserData - 因为 VTW 团队专门为您优化了速度。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-09-15
        • 1970-01-01
        • 2018-09-10
        • 2012-04-16
        • 2017-01-04
        • 2010-10-09
        相关资源
        最近更新 更多