【问题标题】:How can I copy a subtree from one TTreeView to another?如何将子树从一个 TTreeView 复制到另一个?
【发布时间】:2011-08-23 11:43:41
【问题描述】:

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

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

【问题讨论】:

  • 我不完全了解您要做什么...如果您只想要所选节点的子节点,则没有人可以成为它的父节点,或者-自己的父母!...重新思考您表达需求的方式并改写您的帖子!

标签: delphi loops treeview iteration


【解决方案1】:

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

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;

这样称呼它:

List := TList<TTreeNode>.Create;
WalkChildren(Root, List);

此示例添加到列表中,但您可以将该操作替换为您选择的一个。

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

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;

你可以这样称呼它:

CopySubTree(SrcTree.Selected, nil, DestTree.Items);

【讨论】:

  • 对不起,大卫,也许我的问题不太清楚。我附上了一个屏幕截图,以准确显示我正在寻找的内容。此外,在您的代码中,我必须将 Node.Items[i] 更改为 Node[i],但如果我的问题被误解,则不再需要该过程。跨度>
  • @David 时间到了。 ;)
  • 效果很好,谢谢大卫,我已经接受了你的回答。很抱歉最初的混淆,尽管您的第一段代码在其他情况下会很有用
  • 噢!我花了太多时间写我的答案,最终复制了你的答案。
  • @David:单独使用“两个人并排”这一短语时 +1。 ;) 说真的,很好的答案。
猜你喜欢
  • 2020-11-24
  • 2011-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-23
  • 2012-02-06
  • 1970-01-01
相关资源
最近更新 更多