如题,请各位高手指教!谢谢!!!

解决方案 »

  1.   

    //SNode是要copy的节点,DNode是目标节点
    //你可以用GetNodeAt()来取得DNode
    procedure CopyNode(DNode, SNode: TTreeNode);
    var
       ANode, NextNode : TTreeNode;
       Owner : TTreeView;
       SLevel, DLevel :Integer;
    begin
       Owner := DNode.TreeView as TTreeView;
       with Owner do
       begin
          if not DNode.HasAsParent(SNode) then
          begin
             try
                try
                   Items.BeginUpdate;
                   NextNode:=Items.AddChild(DNode,SNode.Text);
                   NextNode.Assign(SNode);
                   ANode:=SNode.GetNext;
                   SLevel:=SNode.Level;
                   DLevel:=DNode.Level + 1;               while ANode.Level>SNode.Level do
                   begin
                      if(ANode.Level-SLevel)=(NextNode.Level-DLevel)then
                      begin
                         NextNode:=Items.AddChild(NextNode.Parent,
                           ANode.Text);
                         NextNode.Assign(ANode);
                      end
                      else if(ANode.Level-SLevel)>
                        (NextNode.Level-DLevel then
                      begin
                         NextNode:=Items.AddChild(NextNode,ANode.Text);
                         NextNode.Assign(ANode);
                      end
                      else if(ANode.Level-SLevel)<
                        (NextNode.Level-DLevel)then
                      begin
                         while(NextNode.Level-DLevel)>
                           (ANode.Level-SLevel)do
                             NextNode := NextNode.Parent;
                         NextNode:=
                           Items.AddChild(NextNode.Parent,ANode.Text);
                         NextNode.Assign(ANode);
                      end;
                      ANode := ANode.GetNext;
                      if not Assigned(ANode) then Break;
                      Application.ProcessMessages;
                   end;            finally
                   Items.EndUpdate;
                end;
             except
                // force repaint on exception
                (Owner as TWinControl).Invalidate;
                raise;
             end;
             PLifeNode(DNode.Data).Sons.Add(SNode.Data);
          end
          else
             Application.MessageBox('不能copy到子节点', '错误',
                MB_OK + MB_DEFBUTTON1);
       end;
    end;
      

  2.   

    设置dragmode属性
    然后在dragover和dragdrop事件里写处理程序