2012-12-26 54 views
6

我有一个树形视图,它已经与其他过程的文件/文件夹一起填充。我想通过树视图中的项目逐个迭代,按照从上到下的顺序进行。但是,与普通列表不同,我不能仅仅使用简单的for语句。我必须进入每个节点等。通过树状视图中的节点递归地迭代?

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

+0

“我不能用这个简单的语句来表示”< - 我很难理解为什么?你应该使用一个** for **循环的递归函数/过程,在** for循环**之后,你对Node.Data属性起作用,并且调用者将移动到下一个节点,等等... – ComputerSaysNo

+1

我说我不能使用简单的** for **语句来做这件事,因为在树形视图中没有物品索引或总节点数量这样的事情。 –

+0

我所要求的全部原因是因为我试图避免实际上递归调用这个相同的过程,我宁愿只有一个没有递归的直的0..MAX-1循环,但我不认为这是可能的,我想确认一下。 –

回答

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状态:

通过访问索引树视图中的项目可以需要大量的时间,特别是当树视图中包含很多项目。为了获得最佳性能,请尝试设计您的应用程序,使其尽可能少地依赖树视图的项目索引。

这是相当真实的。对于随机访问,代码必须遍历树,从根开始,直到节点所在的节点为止。

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

+0

很好,我从来没有想到这是可能的。 –

+0

+1从来不知道它是可能通过一个循环中的所有项目... – ComputerSaysNo

+0

+1漂亮的四舍五入的初始职位... – bummi

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; 
+0

这只是第一层次的层次结构,并不是所有子项目 –

+3

@Jerry不,这列举了他们全部 –

+0

...我很困惑,然后,很抱歉跳到结论 –