在树视图中的所有分支的末尾添加节点

时间:2017-03-25 09:58:48

标签: delphi treeview treenode

for j:=0 to TreeView1.Items.Count-1 do
 if (not(CNode.HasChildren) then
 begin
  CNode:=TreeView1.Items[j];
  CNode:=TreeView1.Items.AddChild(Cnode,'xxxx');
 end;

显然不起作用,因为树中的项目数增加了每一步。

1 个答案:

答案 0 :(得分:2)

Imo,如果你以递归方式执行此操作,则最简洁,如

procedure TForm1.AddChildren(ATreeView: TTreeView);

  procedure ProcessNode(Node : TTreeNode);
  var
    NewNode : TTreeNode;
  begin
    while Node <> Nil do begin
      if Node.HasChildren then
        ProcessNode(Node.getFirstChild)
      else
        NewNode := ATreeView.Items.AddChild(Node, 'Child of ' + Node.Text);
      Node := Node.getNextSibling;  
    end;
  end;

begin
  ProcessNode(ATreeView.Items[0]);
  ATreeView.FullExpand;
end;

,最好在调用Items.BeginUpdate / EndUpdate之间加括号。这样,您就可以避免使用TreeView.Items.Count更改时遇到的问题。

如果由于某种原因你必须坚持使用TreeView.Items,你可以这样做:

procedure TForm1.AddChildren(ATreeView: TTreeView);
var
  List : TList;
  i : Integer;
  Node,
  NewNode : TTreeNode;
begin
  List := TList.Create;
  try
    ATreeView.Items.BeginUpdate;
    for i := 0 to ATreeView.Items.Count - 1 do
      List.Add(ATreeView.Items[i]);
    for i := 0 to List.Count - 1 do begin
      Node := TTreeNode(List.Items[i]);
      if not Node.HasChildren then begin
        NewNode := ATreeView.Items.AddChild(Node, 'Child of ' + Node.Text);
      end;
      Node.Expand(True);
    end;
  finally
    ATreeView.Items.EndUpdate;
    List.Free;
  end;
end;

显然,这可以通过创建Tree的节点的TList然后迭代它来添加新的子节点。

只需将无子节点添加到List中,然后将树正确地完全展开 - 如果这是你想要的 - 需要额外的步骤,你可以提高效率:

procedure TForm1.AddChildren(ATreeView: TTreeView);
[...]
    for i := 0 to ATreeView.Items.Count - 1 do begin
      if not ATreeView.Items[i].HasChildren then
        List.Add(ATreeView.Items[i]);
    end;
    for i := 0 to List.Count - 1 do begin
      Node := TTreeNode(List.Items[i]);
      if not Node.HasChildren then begin
        NewNode := ATreeView.Items.AddChild(Node, 'Child of ' + Node.Text);
      end;
    ATreeView.FullExpand;
  [...]
end;