我正在使用Delphi XE3和Virtual TreeView。
我想使用虚拟树视图来实现树,当单击"开始"按钮时,程序将以递归方式搜索驱动器下的所有文件和文件夹,然后将它们一一添加到树中,就像Windows资源管理器一样。
仔细阅读帮助文档中的"虚拟范例"后,我知道我不能使用 AddChild 或 InsertNode,因为它们仅用于兼容性目的。应该使用 OnInitNode 和 OnInitChildren 来初始化节点。
但是在我的案例中使用虚拟范式真的很困难。目前我可以找出一种算法:
-
定义一个内部数据结构,称为TMyInternalNode,用于存储一个树内部节点的数据,以及内部节点之间的关系,如父节点、子节点、同级节点等。
-
在 OnInitNode 和 OnInitChildren 事件中。尝试通过节点的级别和其他节点之间的关系找到节点的位置。然后找到节点对应的内部节点(这可能有点困难,有时可能会遍历整个内部节点树以找到正确的节点。找到正确的节点后,使用内部节点数据初始化节点。
这种算法似乎既复杂又耗时。有没有更好的方法来实施这种情况?
虚拟范式很有趣,很有用。但现实情况是,你实际上并不想使用虚拟范式。
虚拟模型的目的实际上并不是获取任何数据,直到用户请求它。
如果首先获取 C: 驱动器根目录中的文件夹列表:
- 📁英特尔
- 📁MSOCache
- 📁性能日志
- 📁程序文件
- 📁程序文件 (x86(
- 📁程序数据
- 📁用户
- 📁窗户
关键是你停在那里。虚拟范例中的目标是仅根据需要填充树。
如果用户随后选择扩展节点,即您获取子节点时:
- 📁英特尔
- 📁MSOCache
- 📁性能日志
- 📁程序文件
- 📁程序文件 (x86(
- 📁程序数据
- 📁用户
- 📁艾伦
- 📁大卫
- 📁伊恩
- 📁窗户
然后,您可以:
- 直接依赖节点。用于确定每个节点代表什么的索引
- 或在每个
PVirtualNode
存储一段任意数据,以帮助您将其链接到基础数据
但你并没有真正这样做:
单击"开始"按钮时,程序将以递归方式搜索驱动器下的所有文件和文件夹,然后将它们逐个添加到树中,就像Windows资源管理器一样。
您正在加载所有内容,并希望显示所有数百万个文件。
现在这绝对没有错。虚拟树几乎可以立即创建一百万个节点。真棒。我会定期加载 100,000 行客户、发票、销售订单等。然后用户可以Ctrl+F
,或将行导出到 Excel。
但在你的情况下,它不是"虚拟的">;因为你是预先为50万个文件分配内存的。
虚拟范式的优点是节省内存。
- 你只是说有 500k 个节点,
- 树将假装有 500k 个节点,
- 但它实际上并没有分配500K节点的内存
不虚拟没关系
在您的情况下,不是虚拟的也可以。如果您从根本上希望加载所有内容,而不管用户已展开、滚动或可以看到什么,那么没关系。然后您可以使用:
- 添加子项
但您也意识到,预先分配 450,409 个TMyFileInfo
对象与在需要时保存内存的想法背道而驰。
虚拟版
您可以通过仅获取用户已打开的文件夹的子文件夹来使其成为虚拟的。但这也有缺点。很多时候,我希望程序为我在后台获取所有内容。