通过在树视图节点递归迭代?(Iterate recursively through nodes in

2019-08-04 18:23发布

我有与来自另一个程序文件/文件夹已填充的树视图。 我想遍历一个接一个通过在树视图中的项目,按正确的顺序要自上而下。 然而,不同于正常的名单,我不能只用一个简单for声明这一点。 我必须去到每一个节点,等等。

我该怎么做呢? 我希望有一种方法,我可以不用运行递归过程。 当我通过这些项目重复,我不一定在乎当前焦点之一父或子节点。 我只是需要能够读取Data的每个节点的性能,因为我通过他们,以及突出的树视图当前一个,因为我通过它去。 在此树视图中的每个项目,我将要执行一些工作,并且希望为可视地显示哪一个在此过程中当前所选择的用户。

Answer 1:

事实上,你可以使用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



Answer 2:

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;


文章来源: Iterate recursively through nodes in a tree view?