Проще всего сделать это рекурсивно, примерно так:
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);