实际上,您可以使用for
循环。
var
Node: TTreeNode;
....
for Node in TreeView.Items do
DoSomething(Node);
这是语法糖:
for i := 0 to TreeView.Items.Count-1 do
DoSomething(TreeView.Items[i]);
在可读性方面我会建议for/in
循环。
在不支持节点迭代器的旧版本的Delphi版本中,您可能更喜欢使用while
循环来完成。
Node := TreeView.Items.GetFirstNode;
while Assigned(Node) do
begin
DoSomething(Node);
Node := Node.GetNext;
end;
我希望还有其他方法可以做到这一点。这些是我知道的唯一!
LU RD使得有趣的现象是,documentation状态:
通过访问索引树视图中的项目可以需要大量的时间,特别是当树视图中包含很多项目。为了获得最佳性能,请尝试设计您的应用程序,使其尽可能少地依赖树视图的项目索引。
这是相当真实的。对于随机访问,代码必须遍历树,从根开始,直到节点所在的节点为止。
但是,有顺序访问的优化。 Delphi树视图包装器会记住按索引定位的最后一个节点的索引。下一次请求索引不超过缓存节点的节点时,可以快速返回所需的节点。这在TTreeNodes.GetNodeFromIndex
中执行。
“我不能用这个简单的语句来表示”< - 我很难理解为什么?你应该使用一个** for **循环的递归函数/过程,在** for循环**之后,你对Node.Data属性起作用,并且调用者将移动到下一个节点,等等... – ComputerSaysNo
我说我不能使用简单的** for **语句来做这件事,因为在树形视图中没有物品索引或总节点数量这样的事情。 –
我所要求的全部原因是因为我试图避免实际上递归调用这个相同的过程,我宁愿只有一个没有递归的直的0..MAX-1循环,但我不认为这是可能的,我想确认一下。 –