通过树视图中的节点递归地迭代



i有一个树视图,该视图已填充了来自另一个过程的文件/文件夹。我想通过树视图中的项目一一迭代,从上到下以精确的顺序进行。但是,与普通列表不同,我不能仅使用简单的for语句。我必须进入每个节点,等等

我该怎么做?我希望有一种方法可以在不执行递归过程的情况下做到这一点。当我仔细阅读这些项目时,我不一定要关心当前专注的父母或子节点。我只需要能够在通过它们时读取每个节点的Data属性,并在我经过时突出显示当前的属性。对于此树视图中的每个项目,我将执行一些工作,并希望在此过程中以目视显示目前选择的用户。

实际上您可以使用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对文档指出的有趣观察:

通过索引访问树视图项目可能是耗时的,尤其是当树视图包含许多项目时。为了获得最佳性能,请尝试设计您的应用程序,以使其对树视图的项目索引的依赖项很少。

这是真的。为了随机访问,代码必须从根部开始行走,直到ip> th 节点位于。

但是,有一个优化的顺序访问。Delphi Tree View包装器记得位于索引的最后一个节点的索引。下次您要求提供索引的节点与缓存节点不超过一个不同时,可以快速返回所需的节点。这是在TTreeNodes.GetNodeFromIndex中实现的。

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;

在寻找自己的方法之后,用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;

最新更新