复制和移动节点操作函数
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;

解决方案 »

  1.   

    interfaceuses
     Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, Menus, ExtCtrls,inifiles, ComCtrls, StdCtrls, ImgList, XPMenu,
      ToolWin;type
      TForm1 = class(TForm)
        Panel1: TPanel;
        TreeView1: TTreeView;    ...    private
        { Private declarations }
      public    { Public declarations }
      end;
    var
      Form1: TForm1;
      
      stanleyzhang:array[0..1000] of string;
      stanleyphoenix:array[0..1000] of integer;
     function savetree(treenodex:ttreenode):integer;
     function pastetre(treenodey:ttreenode;treeviewy:ttreeview):integer;
    implementation
    {$R *.dfm}
    function pastetree(treenodey:ttreenode;treeviewy:ttreeview):integer;
     var
     i:integer;
     k:integer;
     h:integer;
     name:string; treenode:array[1..100] of ttreenode;
     //////
     x:integer;
     phoenixlength:integer;
     y:integer;
     treeviewa:ttreeview;
     t:ttreenode;
     z:integer;
     e:string;
     mn:integer;
     g:integer;
     fathername:string;
     sectionnum:array[0..1000] of string;
     sectionname:string;
     a:integer;
     
    begin
            y:=0;
            mn:=2;
            g:=1;
            t:=treenodey;
            h:=1;
            result:=0;        //将内存中的数据写到树上。
                    name:='';
                    i:=0;
                    treeviewa:=treeviewy;
                    name:=stanleyzhang[i];
                    sectionnum[0]:=name;
                    treenode[1]:=treeviewa.Items.AddChild(t,name);
                    i:=1;
                    while true do
                                    begin
                                            a:=0;                                        if stanleyzhang[i]='' then
                                                    break
                                            else
                                                    begin                                                        sectionname:=stanleyzhang[i];
                                                            for k:=0 to (h-1) do
                                                                    if sectionnum[h]=sectionname then
                                                                    begin
                                                                    i:=i+1;
                                                                    a:=1;
                                                                    break;
                                                                    end;
                                                            if a=1 then
                                                            break;
                                                            name:=stanleyzhang[i];
                                                            x:=stanleyphoenix[i];
                                                            phoenixlength:=length(inttostr(x));
                                                            ////
                                                              while true do
                                                                    begin
                                                                    z:=stanleyphoenix[y];
                                                                    if length(inttostr(z))=(phoenixlength-1) then
                                                                    begin
                                                                    e:=copy(inttostr(x),1,phoenixlength-1);
                                                                    if (strtoint(e)=z) then
                                                                             begin
                                                                                ////                                                                                fathername:=stanleyzhang[y];
                                                                                        while true do
                                                                                            begin
                                                                                            if fathername=treenode[g].Text then
                                                                                            begin                                                                                        break;
                                                                                            end;
                                                                                            g:=g+1;
                                                                                            end;
                                                                                treenode[mn]:=treeviewa.items.AddChild(treenode[g],name);
                                                                                sectionnum[h]:=name;
                                                                                mn:=mn+1;
                                                                                g:=1;
                                                                                y:=0;
                                                                                break;
                                                                                ///
                                                                             end;
                                                                    end;
                                                                    y:=y+1;                                                                end;                                                        i:=i+1;
                                                            h:=h+1;                                                end;
                                    end;end;
      

  2.   

    function savetree(treenodex:ttreenode):integer;
      var        t:string;
            treenode1:ttreenode;
            v:integer;
            treeroot:ttreenode;
            q:integer;
            r:integer;
            w:integer;
            treelast:ttreenode;
            treenodey:ttreenode;
     begin
            result:=0;
            v:=1;
            t:='1';
            q:=0;
            w:=0;
             ///////将树写入内存。
             treenodey:=treenodex;
            treeroot:=treenodey;
            treenode1:=treenodey;
            stanleyzhang[0]:=treenode1.Text;
            stanleyphoenix[0]:=1;
            treelast:=treeroot;
             while true do
            begin
            if treelast.HasChildren then
                    treelast:=treelast.GetLastChild
            else
            break;
            end;while true do   begin
                    while true do                        begin
                            if treenode1.HasChildren then
                                    begin
                                    treenode1:=treenode1.getFirstChild;
                                    t:=t+inttostr(0)
                                    end
                            else
                                    break;
                                    stanleyzhang[v]:=treenode1.Text;
                                    stanleyphoenix[v]:=strtoint(t);
                                    v:=v+1;
                            end;                        /////////////
                            r:=0;
                             while true do
                                    begin                                if treelast.Text=stanleyzhang[r] then
                                    begin
                                    w:=1;                                break;
                                    end;
                                    r:=r+1;                                if stanleyzhang[r]='' then
                                    break;
                                    end;
                            if w=1 then
                            break;
                    /////////////                if treenode1.Parent.GetLastChild=treenode1 then
                            begin
                            treenode1:=treenode1.Parent;
                            t:=copy(t,1,length(t)-1);                        end;
                    while true do
                    begin
                    if treenode1.Parent.Count=1 then
                       begin
                    treenode1:=treenode1.Parent;
                    t:=copy(t,1,length(t)-1)
                       end
                    else
                    break;
                    if treenode1=treeroot then
                            begin
                            q:=1;
                            break;
                            end;
                    end;
                    if q=1 then
                    break;                treenode1:=treenode1.getNextSibling;
                    t:=inttostr(strtoint(t)+1);
                    stanleyzhang[v]:=treenode1.Text;
                    stanleyphoenix[v]:=strtoint(t);
                    v:=v+1;                /////////////
                    r:=0;
                             while true do
                                    begin
                                    if treelast.Text=stanleyzhang[r] then
                                    begin
                                    w:=1;                                break;
                                    end;
                                    r:=r+1;
                                    if stanleyzhang[r]='' then
                                    break;
                                    end;
                            if w=1 then
                            break;
                    /////////////
                            // end;   end;
    end;
    这两个函数一个将树结点保存,一个是将树结点考到另一结点下。你定义以后,就调用吧。
      

  3.   

    我这儿有个简单的例子.你参考一下吧.
    type
      TForm1 = class(TForm)
        TreeView1: TTreeView;
        Button1: TButton;
        TreeView2: TTreeView;
        Button2: TButton;
        procedure Button1Click(Sender: TObject);
        procedure Button2Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.DFM}//生成结点
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      TreeView1.Items.Clear;
      TreeView1.Items.AddChild(nil,'ROOT1');
      TreeView1.Items.AddChildFirst(TreeView1.items[0],'First');
      TreeView1.Items.AddChild(TreeView1.items[0],'Sencond');
      TreeView1.Items.AddChild(TreeView1.items[0],'Third');
      TreeView1.Items.AddChild(TreeView1.items[0],'Fourth');
      TreeView1.Items.AddChild(nil,'ROOT2');
    end;//移动结点
    procedure TForm1.Button2Click(Sender: TObject);
    begin
      //下面这条语句是将ROOT1与子结点全部移至ROOT2结点下.
      TreeView1.Items[0].MoveTo(TreeView1.items[5],naAddChild);
    end;