我现在可以通过dragDrop和DragDown两个函数实现拖动子节点到另一组,现在我想实现同时移动多个节点到另外一组,怎么实现?

解决方案 »

  1.   

    把你的代码改一下应该就可以了。1、设置 TreeView.MultiSelect := True;
      然后就可以CTRL+单击选中多个节点了2、在DragDrop中套上一个循环:  for I := TTreeView(Source).SelectionCount-1 downto 0 do begin循环对 TTreeView(Source).Selections[I]进行操作(就是选中的多个节点)自己试一下
      

  2.   

    同意楼上,
    先让节点可以多选,
    然后在触发Drag事件时,
    循环找选中的节点,
    在新的树里加上就可以了。
      

  3.   

    procedure TForm1.TreeView1DragDrop(Sender, Source: TObject; X, Y: Integer);
    var
      selectedNode: TTreeNode;
      toNode: TTreeNode;
      i: integer;
    begin
      if Source=TreeView1 then
      begin
        if self.TreeView1.SelectionCount>0 then
        begin
          toNode:=self.TreeView1.GetNodeAt(X,Y);
          for i:=TreeView1.SelectionCount-1 downto 0 do
          begin
            selectedNode:=self.TreeView1.Selections[i];
            selectedNode.MoveTo(toNode,naAddChild);
          end
        end
      end
    end;
      

  4.   

    我这样写,会出错,而且也不能同时移多个
     另外DragOver函数如下
    procedure TForm1.TreeView1DragOver(Sender, Source: TObject; X, Y: Integer;
      State: TDragState; var Accept: Boolean);
    var
      selectedNode: TTreeNode;
      toNode: TTreeNode;
      i: integer;
    begin
      if Source=TreeView1 then
      begin
        if self.TreeView1.SelectionCount>0 then
        begin
          toNode:=self.TreeView1.GetNodeAt(X,Y);
          for i:=0 to TreeView1.SelectionCount-1 do
          begin
            selectedNode:=self.TreeView1.Selections[i];
            if (selectedNode.Level=2) and (toNode.Level=1) and (toNode<>selectedNode.Parent) then
            begin
              Accept:=true;
            end
            else
            begin
              Accept:=false;
            end
          end
        end
      end
      else
      begin
      Accept:=false;
      end
    end;
      

  5.   


    //按楼主的写法改的procedure TForm1.TreeView1DragOver(Sender, Source: TObject; X, Y: Integer;
      State: TDragState; var Accept: Boolean);
    begin
      Accept := Source is TTreeView;
    end;procedure TForm1.TreeView1DragDrop(Sender, Source: TObject; X, Y: Integer);
    var
      I: integer;
      sNode, tNode : TTreeNode;
    begin
      tNode := TTreeView(Source).GetNodeAt(X, Y);
      for I := 0 to TTreeView(Source).SelectionCount-1 do begin
        Showmessage(inttostr(i));
        sNode := TTreeView(Source).Selections[I];
        sNode.MoveTo(tNode, naAddChild);
      end;
    end;
      

  6.   

    上面忘记了把Showmessage一句去掉。另外,设置TreeView1.MultiSelect := True,前面已经说了
      

  7.   

    看不出您的跟我的有多个差虽,不过我还是试了下您说的,还是不能多点同时拖动
    另外MultiSelect我有设置
      

  8.   

    但是我试了可以。确实可以。注意一下我与你的代码不同之处在:for循环 一个是for to  一个是 for downto
      

  9.   

    最初(在1楼)之所以给你写for downto 循环,是因为,我以为你的做法是:先拷贝节点,再删除原节点。后来你公布了你的代码,用的MoveTo,于是就不用 for downto 循环,改用了 for to 循环。
      

  10.   

    我的会跳出个错误提示,你的也会,List index out of bands(1),