6

我有一个树视图,其中已经填充了来自另一个过程的文件/文件夹。我想逐一迭代树视图中的项目,从上到下按照确切的顺序进行。但是,与普通列表不同,我不能只使用一个简单的for语句。我必须进入每个节点等。

我该怎么做呢?我希望有一种方法可以在不运行递归过程的情况下做到这一点。当我遍历这些项目时,我不一定关心当前关注的项目的父节点或子节点。我只需要能够在Data传递每个节点时读取它们的属性,并在通过它时在树视图中突出显示当前节点。对于此树视图中的每个项目,我将执行一些工作,并希望向用户直观地显示在此过程中当前选择了哪个项目。

4

2 回答 2

16

事实上,您可以使用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 进行了有趣的观察,文档指出:

按索引访问树视图项目可能会耗费大量时间,尤其是当树视图包含许多项目时。为获得最佳性能,请尝试设计您的应用程序,使其对树视图的项目索引的依赖关系尽可能少。

这是完全正确的。对于随机访问,代码必须遍历树,从根开始,直到找到第 i节点。

但是,对顺序访问进行了优化。Delphi 树视图包装器记住由索引定位的最后一个节点的索引。下次你请求一个与缓存节点的索引不超过一个的节点时,可以快速返回所需的节点。这是在TTreeNodes.GetNodeFromIndex.

于 2012-12-26T19:40:55.827 回答
3
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;
于 2012-12-26T19:42:59.853 回答