【问题标题】:How to Use Virtual Tree View in a Dynamically Updating Tree?如何在动态更新的树中使用虚拟树视图?
【发布时间】:2019-09-25 08:58:32
【问题描述】:

我正在使用 Delphi XE3 和 Virtual TreeView。

我想用Virtual TreeView来实现一棵树,当点击“开始”按钮时,程序会递归搜索一个驱动器下的所有文件和文件夹,然后将它们一一添加到树中,就像Windows资源管理器一样。

仔细阅读帮助文档中的“虚拟范例”后,我知道我不能使用 AddChild 或 InsertNode,因为它们仅用于兼容性目的。应该使用 OnInitNode 和 OnInitChildren 来初始化节点。

但是在我的案例中使用虚拟范式真的很难。目前我可以找出一种算法:

  1. 定义一个内部数据结构,称为TMyInternalNode,用于存储一个树内部节点的数据,以及内部节点之间的关系,如父、子、兄弟等。

    李>
  2. 在 OnInitNode 和 OnInitChildren 事件中。尝试通过节点的级别和其他节点之间的关系找到节点的位置。然后为节点找到对应的内部节点(这可能有点困难,有时可能要遍历整个内部节点树才能找到正确的节点。找到正确的节点后,用内部节点数据初始化节点。

这个算法似乎复杂且耗时。有没有更好的方法来实现这种情况?

【问题讨论】:

    标签: delphi virtualtreeview


    【解决方案1】:

    虚拟范式很有趣,也很有用。但现实情况是您实际上不想使用虚拟范式。

    虚拟模型的目的不是在用户请求之前实际获取任何数据。

    如果您首先获取 C: 驱动器根目录中的文件夹列表:

    • ?英特尔
    • ?MSOCache
    • ?PerfLogs
    • ?程序文件
    • ?程序文件 (x86)
    • ?程序数据
    • ?用户
    • ?Windows

    关键是你停在那里虚拟范例的目标是仅根据需要填充树。

    如果用户随后选择展开一个节点,就是你获取子节点的时候:

    • ?英特尔
    • ?MSOCache
    • ?PerfLogs
    • ?程序文件
    • ?程序文件 (x86)
    • ?程序数据
    • ?用户
      • ?艾伦
      • ?大卫
      • ?伊恩
    • ?Windows

    然后你可以:

    • 直接依赖node.Index来判断每个节点代表什么
    • 或用每个PVirtualNode 存储一段任意数据,以帮助您将其链接到基础数据

    但你并没有真正这样做:

    当点击“开始”按钮时,程序会递归搜索驱动器下的所有文件和文件夹,然后将它们一一添加到树中,就像Windows资源管理器一样。

    您正在加载所有内容,并且想要显示所有数百万个文件。

    现在这绝对没有错。虚拟树几乎可以立即创建一百万个节点。太棒了。我会定期加载 100,000 行客户、发票、销售订单等。然后用户可以Ctrl+F,或将这些行导出到 Excel。

    但在你的情况下,它只是不是 "virtual";因为您正在为 500k 个文件分配内存预先

    虚拟范式的优点是节省内存。

    • 你只是有50万个节点,
    • 树会假装有 500k 个节点,
    • 但它实际上并没有分配 500k 个节点的内存

    不虚拟也没关系

    在你的情况下,是虚拟的也没关系。如果您从根本上想要加载所有内容,而不管用户展开、滚动或看到什么,那都可以。然后你可以使用:

    • 添加孩子

    但您也意识到,预先分配 450,409 个TMyFileInfo 对象与在需要时节省内存的想法背道而驰。

    虚拟版

    您可以使其虚拟化,只为用户打开的文件夹获取子文件夹。但这也有不利之处。很多时候,我希望程序为我在后台获取所有内容。

    【讨论】:

    • 对不起,我可能会歪曲我的观点。我最初需要显示的只是 C: 驱动器根目录中的文件夹列表:。当用户单击其中一个时,文件夹将展开所有子文件夹,就像 Windows 资源管理器一样。
    • 我不需要从头加载所有内容。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多