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;