递归遍历树视图中的节点? [英] Iterate recursively through nodes in a tree view?

查看:31
本文介绍了递归遍历树视图中的节点?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

I have a tree view which is populated already with files/folders from another procedure. I would like to iterate one by one through the items in the tree view, going in exact order from top to bottom. However, unlike a normal list, I cannot use just a simple for statement for this. I have to go into each node, etc.

How do I do this? I'm hoping there's a way I can do it without running a recursive procedure. As I iterate through these items, I don't necessarily care about parent or child nodes of the currently focused one. I just need to be able to read the Data property of each node as I pass them, as well as highlight the current one in the tree view as I go through it. For each item in this tree view, I will be performing some work and want to visually display to the user which one is currently selected during this process.

解决方案

In fact you can use a for loop.

var
  Node: TTreeNode;
....
for Node in TreeView.Items do
  DoSomething(Node);

This is syntactic sugar for:

for i := 0 to TreeView.Items.Count-1 do
  DoSomething(TreeView.Items[i]);

In terms of readability I would recommend the for/in loop.

In older Delphi versions that don't support the node iterator you may prefer to do it with a while loop.

Node := TreeView.Items.GetFirstNode;
while Assigned(Node) do
begin
  DoSomething(Node);
  Node := Node.GetNext;
end;

I expect there are other ways to do it. These are the only ones that I know!


LU RD makes the interesting observation that the documentation states:

Accessing tree view items by index can be time-intensive, particularly when the tree view contains many items. For optimal performance, try to design your application so that it has as few dependencies on the tree view's item index as possible.

This is quite true. For random access the code has to walk the tree, starting at the root, until the ith node is located.

However, there is an optimisation for sequential access. The Delphi tree view wrapper remembers the index of the last node located by index. The next time you ask for a node with index no more than one different from the cached node, the required node can be returned quickly. This is implemented in TTreeNodes.GetNodeFromIndex.

这篇关于递归遍历树视图中的节点?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆