【发布时间】:2013-01-16 20:29:22
【问题描述】:
出于性能原因,我需要在不使用递归的情况下浏览树视图的项目。
TTreeview 提供 GlobalCount 和 ItemByGlobalIndex 方法,但它只返回 可见 个项目
我搜索了根类代码没有找到所有节点的私有列表,FGlobalItems 似乎只包含需要渲染的项目
有没有办法顺序浏览树视图的所有项目(包括不可见和折叠的节点)?
此问题适用于 Delphi XE3 / FM2
谢谢,
[2 月 3 日编辑]
我接受了默认答案(不可能开箱即用),尽管我正在寻找一种方法来修补这方面的 firemonkey 树视图。
经过更多分析,我发现 FGlobalItems 列表只保存扩展项,并在 TCustomTreeView.UpdateGlobalIndexes 方法中维护;
评论 FMX.TreeView 的第 924 行(如果 AItem.IsExpanded 则...)会导致构建节点的完整索引,并允许使用 ItemByGlobalIndex() 按顺序浏览所有节点,但可能会导致其他性能问题和错误...
没有更多线索,我将保留我的递归代码。
【问题讨论】:
-
我非常怀疑你所要求的能不能做到。 FMX 的设计是每个控件都可以作为任何其他控件的父级。所以你只需要像任何其他控件一样迭代孩子。为什么框架会在递归版本的同时维护树结构的线性版本。
-
是什么让您认为避免递归可以提高性能?
-
@jachguate:对于每个浏览的节点,您可以避免使用参数堆叠和局部变量创建/销毁的调用成本。在大树上检查了以前的商业代码。
-
@David:在 VCL 方面,例如 dev expree 树维护一个内部节点列表。使用 FMX 树视图,还维护了一个顺序列表,但仅适用于可见节点。为什么要维护它:即使不需要,拥有原始项目集合和反映层次结构的单独数据似乎是一个不错的设计。
-
VCL 完全不同。忘记所有关于 VCL 的事情。
标签: delphi firemonkey