我有一个树视图,它已经填充了另一个过程中的文件/文件夹。我想逐个遍历树视图中的项目,按照从上到下的确切顺序进行迭代。但是,与普通列表不同,我不能仅使用简单的for
语句。我必须进入每个节点等。
我该怎么做?我希望有一种方法可以在不运行递归程序的情况下完成。当我遍历这些项目时,我不一定关心当前聚焦的父节点或子节点。我只需要能够在传递它们时读取每个节点的Data
属性,并在我浏览时突出显示树视图中的当前节点。对于此树视图中的每个项目,我将执行一些工作,并希望在此过程中直观地向用户显示当前选择的那个。
答案 0 :(得分: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发表了documentation状态的有趣观察结果:
按索引访问树视图项可能非常耗时,尤其是当树视图包含许多项时。为了获得最佳性能,请尝试设计应用程序,使其尽可能少地依赖树视图的项目索引。
这是真的。对于随机访问,代码必须从根开始遍历树,直到找到i th 节点。
但是,顺序访问有一个优化。 Delphi树视图包装器会记住索引所在的最后一个节点的索引。下次请求索引与缓存节点的索引不超过一个的节点时,可以快速返回所需的节点。这是在TTreeNodes.GetNodeFromIndex
。
答案 1 :(得分: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;