转载
procedure AddSubTree(DestTree: TTreeView; SourceNode, DestNode: TTreeNode; AddState: Boolean);
var
  TempNode, TempNode1: TTreeNode;
  I : integer;
begin
  TempNode := DestNode;  with DestTree do begin
    if Not (AddState) then TempNode := Items.AddChild(DestNode, sourceNode.Text);
    if SourceNode.HasChildren then begin
      for I := 0 to SourceNode.Count-1 do begin
        if I>0 then
            TempNode := Items.AddChild(TempNode.Parent, SourceNode.Item[I].Text)
        else
            TempNode := Items.AddChild(TempNode, SourceNode.Item[I].Text);
        AddSubTree(DestTree, SourceNode.Item[I], TempNode, True);
      end;
    end;
  end;
end;procedure MoveSubTreeView(SourceTreeView, DestTreeView: TTreeView; Keep: Boolean);
var
  TempLevel, TempIndex : integer;
  I, J : integer;
  TempNode : array of TTreeNode;
  TempNode1 : TTreeNode;
  Yes_No : Boolean;
  OldOnChanging, OldOnChanging1 : TTVChangingEvent;
  OldOnChange, OldOnChange1 : TTVChangedEvent;
  IsSelected : TTreeNode;
begin
  OldOnChanging := DestTreeView.OnChanging;
  DestTreeView.OnChanging := Nil;
  OldOnChange := DestTreeView.OnChange;
  DestTreeView.OnChange := Nil;
  OldOnChanging1 := SourceTreeView.OnChanging;
  SourceTreeView.OnChanging := Nil;
  OldOnChange1 := SourceTreeView.OnChange;
  SourceTreeView.OnChange := Nil;  IsSelected := SourceTreeView.Selected;
  TempLevel := SourceTreeView.Selected.Level;
  setlength(TempNode, TempLevel+1);
  Yes_No := False;
  TempNode1 := Nil;  TempIndex := FindNode(DestTreeView, SourceTreeView.Selected.Text);
  if TempIndex>-1 then begin
    DestTreeView.Items[TempIndex].Delete;
  end;  with SourceTreeView do begin
    TempNode[TempLevel] := Selected;
    if TempLevel>0 then
      for I := TempLevel-1 downto 0 do begin
        TempNode[I] := TempNode[I+1].Parent;
      end;
  end;  with DestTreeView.Items do begin
    if Count>0 then begin
      for I := TempLevel downto 0 do
        for J := Count-1 downto 0 do begin
          if (TempNode[I].Text=DestTreeView.Items[J].Text) and (TempNode1=Nil) then begin
            if I=Templevel then Yes_no := True;
            TempNode1 := DestTreeView.Items[J];
          end;
        end;
    end;    if TempNode1=Nil then
      for I := 0 to TempLevel-1 do begin
        TempNode1 := AddChild(TempNode1, TempNode[I].Text);
      end
    else 
      for I := TempNode1.Level+1 to TempLevel-1 do begin
        TempNode1 := AddChild(TempNode1, TempNode[I].Text);
      end;
  end;
      AddSubTree(DestTreeView, IsSelected, TempNode1, False);//Yes_No);
  if (Not (Keep)) then begin
    if (IsSelected.Parent<>Nil) and (IsSelected.Parent.Count<1) then
        IsSelected.Parent.Delete
    else
        IsSelected.Delete;
  end;  DestTreeView.SortType := stData;  DestTreeView.OnChanging := OldOnChanging;
  DestTreeView.OnChange := OldOnChange;
  SourceTreeView.OnChanging := OldOnChanging1;
  SourceTreeView.OnChange := OldOnChange1;
end;