delphi - 递归遍历 TreeView 中的节点?

标签 delphi recursion treeview iteration

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

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

最佳答案

事实上,您可以使用 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状态:

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.

这确实是事实。对于随机访问,代码必须从根开始遍历树,直到找到第 ith 节点。

但是,有针对顺序访问的优化。 Delphi TreeView 包装器会记住通过索引找到的最后一个节点的索引。下次请求索引与缓存节点相差不超过1的节点时,可以快速返回所需的节点。这是在 TTreeNodes.GetNodeFromIndex 中实现的。

关于delphi - 递归遍历 TreeView 中的节点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14045263/

相关文章:

Delphi:DBGrid 列标题提示 - 强制重置提示?

php - 递归函数返回空值

c++ - 在 C++ 中通过递归反转字符串

c# - 从代码背后在Viewmodel中设置属性

delphi - 创建错误消息 Delphi 7

multithreading - Delphi/Indy 多线程服务器

xcode - Delphi XE2 FireMonkey Xcode安装问题

c - 在 C 中使用递归打印康托集

jquery - Ruby on Rails 3.1 的 Treeview gem

angular - Angular 4 中的树结构