delphi 递归遍历树视图中的节点?

5cg8jx4n  于 2023-05-17  发布在  其他
关注(0)|答案(3)|浏览(108)

我有一个树视图,其中已经填充了来自另一个程序的文件/文件夹。我想逐个遍历树视图中的项目,从上到下按精确的顺序进行。但是,与普通列表不同,我不能仅使用简单的for语句来实现此目的。我必须进入每个节点,等等
我该怎么做?我希望有一种方法,我可以做到这一点,而无需运行递归过程。当我迭代这些项时,我不必关心当前焦点的父节点或子节点。我只需要能够在传递每个节点时读取它们的Data属性,并在遍历树视图时突出显示当前节点。对于这个树视图中的每一项,我都将执行一些工作,并希望在此过程中向用户直观地显示当前选择的是哪一项。

ou6hu8tu

ou6hu8tu1#

实际上,你可以使用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循环。
在不支持节点迭代器的旧版本中,您可能更喜欢使用while循环来实现。

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

我想还有别的办法。我只知道这些!
LU RD进行了有趣的观察,documentation声明:
按索引访问树视图项可能会耗费大量时间,尤其是当树视图包含许多项时。为了获得最佳性能,请尝试设计应用程序,使其对树视图的项索引的依赖性尽可能少。
这是非常正确的。对于随机访问,代码必须从根开始遍历树,直到找到第i个节点。
然而,存在用于顺序访问的优化。Delphi树视图 Package 器记住索引所定位的最后一个节点的索引。下次请求索引与缓存节点相差不超过1的节点时,可以快速返回所需的节点。这是在TTreeNodes.GetNodeFromIndex中实现的。

ugmeyewa

ugmeyewa2#

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;
toe95027

toe950273#

在我自己寻找用TListView中的项目填充ComboBoxEx的方法之后,为了能够过滤数据,我做了递归函数,它迭代所有的ListView数据。这不是100%的答案,但它可能是有用的。

procedure TForm1.btnPopulateClick(Sender: TObject);
var
  lvl: Integer;
  mNode: TTreeNode;
//--
procedure PlaceTreeItem(nTree: TTreeNode; nLvl: Integer);
var
  nIndent, nImg: Integer;
  NextNode, LastNode: TTreeNode;
begin
  nIndent:=nLvl * 2;
  if nTree.HasChildren then nImg:=0 else nImg:=1;
  ComboBoxEx1.ItemsEx.AddItem(nTree.Text, nImg, nImg, nImg, nIndent, nTree.Data);
  if nTree.HasChildren then
    begin
      Inc(lvl);
      NextNode := nTree.getFirstChild;
      LastNode := nTree.GetLastChild;
      while NextNode <> nil do begin
        PlaceTreeItem(NextNode, lvl);
        if NextNode = LastNode then Dec(lvl);
        NextNode := NextNode.getNextSibling;
      end;
    end;
end;
//--
begin
  ComboBoxEx1.Clear;
  lvl:=0;
  mNode := TreeView1.Items.GetFirstNode;
  while Assigned(mNode) do begin
    PlaceTreeItem(mNode, 0);
    mNode := mNode.getNextSibling;
  end;
end;

相关问题