我有与来自另一个程序文件/文件夹已填充的树视图。 我想遍历一个接一个通过在树视图中的项目,按正确的顺序要自上而下。 然而,不同于正常的名单,我不能只用一个简单for
声明这一点。 我必须去到每一个节点,等等。
我该怎么做呢? 我希望有一种方法,我可以不用运行递归过程。 当我通过这些项目重复,我不一定在乎当前焦点之一父或子节点。 我只是需要能够读取Data
的每个节点的性能,因为我通过他们,以及突出的树视图当前一个,因为我通过它去。 在此树视图中的每个项目,我将要执行一些工作,并且希望为可视地显示哪一个在此过程中当前所选择的用户。
事实上,你可以使用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
环。
在不支持的节点迭代你可能更喜欢用做旧的德尔福版本while
循环。
Node := TreeView.Items.GetFirstNode;
while Assigned(Node) do
begin
DoSomething(Node);
Node := Node.GetNext;
end;
我希望有其他的方法来做到这一点。 这些都是唯一的,我知道!
LU RD使有趣的观察,该文件指出:
通过索引访问树视图项可以是时间密集,特别是当树视图中包含很多项目。 为了获得最佳性能,尝试设计您的应用程序,使其对树视图中的项目索引尽可能少的依赖。
这是千真万确的。 用于随机接入的代码必须遍历树,从根开始,直到第节点i的位置。
然而,有一个顺序访问的优化。 德尔福树视图包装记得位于由指数的最后一个节点的索引。 你问一个节点与指数没有从缓存节点多个不同的下一次,所需要的节点,可以快速地返回。 这是在实施TTreeNodes.GetNodeFromIndex
。
var
i:Integer;
begin
for I := 0 to tv.Items.Count - 1 do
begin
Listbox1.Items.Add(tv.Items[i].Text +' SubItems: ' + IntToStr(tv.Items[i].Count))
end;
end;