如何将子树从一个TTreeView复制到另一个?

7 delphi iteration treeview loops

我想将所选节点及其所有后代从一个TTreeView复制到另一个节点.

实现这一目标的最佳,最有效的方法是什么?

Dav*_*nan 9

递归执行此操作最简单,如下所示:

procedure WalkChildren(Node: TTreeNode; List: TList<TTreeNode>);
var
  i: Integer;
begin
  List.Add(Node);
  for i := 0 to Node.Count-1 do begin
    WalkChildren(Node[i], List);
  end;
end;
Run Code Online (Sandbox Code Playgroud)

像这样称呼它:

List := TList<TTreeNode>.Create;
WalkChildren(Root, List);
Run Code Online (Sandbox Code Playgroud)

此示例添加到列表中,但您可以使用您选择的某个替换该操作.

现在我们可以走一棵树了,是时候一起走两棵树了.

procedure CopySubTree(Src, DestParent: TTreeNode; DestNodes: TTreeNodes);
var
  i: Integer;
  Dest: TTreeNode;
begin
  Dest := DestNodes.AddChild(DestParent, Src.Text);
  //copy other parameters from Src to Dest as you please
  for i := 0 to Src.Count-1 do begin
    CopySubTree(Src[i], Dest, DestNodes);
  end;
end;
Run Code Online (Sandbox Code Playgroud)

你可以像这样调用它:

CopySubTree(SrcTree.Selected, nil, DestTree.Items);
Run Code Online (Sandbox Code Playgroud)

  • @David时间正在运行.;) (2认同)
  • @David:单独使用"两个人串联"这句话的+1.;)说真的,很好的答案. (2认同)