两个TreeView之间的拖拉时能够带着子节点一起拖动,并且一边的TreeView为空时,另一边的TreeView节点可以连子节点一起拖动到这个空TreeView中

解决方案 »

  1.   

    procedure TForm1.TreeView1EndDrag(Sender, Target: TObject; X, Y: Integer);
    var
       TempNode3,T:TtreeNode;
       AttachMode2 : TNodeAttachMode;
    begin
        if target <> nil then
        begin
           T:=(target as TTreeview).GetNodeAt(x,y);
           if T<>nil then
              begin
                 if Target <> Sender then
                    begin
                       AttachMode2 := naAddChild;
                       (target as TTreeview).Items.BeginUpdate;
                       TempNode3 := (target as TTreeview).Items.AddChild( (Sender as TTreeview).DropTarget,'Temp' );
                       (Sender as TTreeview).Selected.MoveTo(T, AttachMode2 );
                       TempNode3.Free;
                       (target as TTreeview).Items.EndUpdate;
                    end;
              end
           else
              begin
                    if Target <> Sender then
                       (target as TTreeview).Items.Add(nil,(sender as  TTreeview).Selected.Text);
              end;
        end;
    end;在(Sender as TTreeview).Selected.MoveTo(T, AttachMode2 );TempNode3.Free;两处地方都报错,下面如果没有根的树中也只能拖动根节点,而叶子节点移不过来,是怎么回事呀?
      

  2.   

    能给出两TreeView之间拖动的源码吗?
      

  3.   

    參考explore資源管理器中文件夾移動的實現
    Assign()
      

  4.   


    procedure TfrmPopedom.CopyAllNode(SouNode,DesParentNode:TfCTreeNode;des:TfcTreeView);
    var node:TfcTreeNode;
    begin
        node := des.Items.AddChild(DesParentNode,SouNode.Text);
        node.Imageindex := SouNode.imageindex;
        node.selectedindex := SouNode.Selectedindex;
        node.Stringdata := SouNode.StringData;    while SouNode.GetFirstChild <>nil do
          begin
            copyAllNode(SouNode.GetFirstChild,node,des);
            SouNode.GetFirstChild.delete;
          end;end;procedure TfrmPopedom.MoveNode(SouNode,DesNode:TfcTreeNode;des:TfcTreeView);
    var child,node:TfcTreeNode;
    begin
        child := sounode.getfirstchild;
        while child<>nil do
          begin
            node := FindNode(child.StringData,des);
            if node=nil then
                 copyAllNode(child,DesNode,des)
            else moveNode(child,node,des);
            Child.Delete;
            Child := sounode.getfirstchild;
          end;end;function  TfrmPopedom.FindNode(FindStr:string;ATreeView:TfcTreeView):TfcTreeNode;
    var i:integer;
    begin
        result := nil;
        for i:=0 to ATreeView.Items.Count-1 do
          if ATreeView.Items[i].StringData = FindStr then
            begin
              result:= ATreeView.Items[i];
              break;
            end;
    end;