Как я могу скопировать поддерево из одного TTreeView в другое? - PullRequest
7 голосов
/ 11 мая 2011

Я хочу скопировать выбранный узел и все его потомки из одного TTreeView в другой.

Какой самый лучший и самый эффективный способ добиться этого?

1 Ответ

9 голосов
/ 11 мая 2011

Проще всего сделать это рекурсивно, примерно так:

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);
...