treeview同级节点托动怎么实现阿?谢谢

解决方案 »

  1.   

    (Sender as TTreeView).Selected.MoveTo(dNode, naInsert)
      

  2.   

    谢谢,不过能不能告诉我具体在哪里写这些代码阿?是在MouseDown中设置dNode:=MyTreeView.Selected;再在MouseUp中写这句代码吗?我没弄成,嘿嘿能不能说明白一点阿
      

  3.   

    procedure TForm1.TreeViewMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    begin
      with Sender as TTreeView do
      begin
        if (Button = mbLeft) and (htOnItem in GetHitTestInfoAt(X,Y)) then
          BeginDrag(false);
      end;
    end;
    procedure TForm1.TreeViewDragOver(Sender, Source: TObject; X, Y: Integer;
      State: TDragState; var Accept: Boolean);
    var
      aNode : TTreeNode;
      ks: TkeyBoardState;
    begin
      Accept := (Source is TTreeView);
      with Sender as TTreeView do
      begin
        aNode := GetNodeAt(X, Y);
        if aNode <> nil then
        begin
          //Accept := true; // 允许拖动
          FMoveAsChild := false;
          GetKeyboardState(ks);
          if ks[VK_CONTROL] and $80 <> 0 then
            FMoveAsChild := true;
    //      Items.BeginUpdate;
          // 控制向上滚动
          if Y <= 15 then
            SendMessage(Handle, WM_VSCROLL, SB_LINEUP, 0)
          else // 控制向下滚动
            if (Height-Y <= 25) then
              SendMessage(Handle, WM_VSCROLL, SB_LINEDOWN, 0);
          //Refresh;
    //      Items.EndUpdate;
        end;
      end;
    end;procedure TForm1.myMoveNodes(tv: TTreeView; dNode, NeedMoveNodes: TTreeNode; MoveAsChild: boolean);
    var
      aNode: TTreeNode;
      i: integer;
    begin
      if MoveAsChild then
        aNode := tv.Items.AddChild(dNode, NeedMoveNodes.Text)
      else
        aNode := tv.Items.Insert(dNode, NeedMoveNodes.Text);  for i:= 0 to NeedMoveNodes.Count-1 do
      begin
        myMoveNodes(tv, aNode, NeedMoveNodes.Item[i], true);
      end;
    end;procedure TForm1.TreeViewDragDrop(Sender, Source: TObject; X, Y: Integer);
    var
      sNode, dNode, aNode: TTreeNode;
    begin
      sNode := (Source as TTreeView).Selected;
      if sNode = nil then exit;  dNode := (Sender as TTreeView).GetNodeAt(X, Y);
      if dNode = nil then exit;  (Sender as TTreeView).Items.BeginUpdate;
      if FMoveAsChild then  // 作为孩子, 这段代码不够优化,为的是更好地移动对应节点内容
        begin
          aNode := dNode.GetNextSibling;
          if aNode = nil then
            begin
              if Sender = Source then
                begin
                  aNode := (Sender as TTreeView).Items.AddChild(dNode, 'Temp');
                  sNode.MoveTo(aNode, naInsert);
                  aNode.Delete;
                end
              else begin
                myMoveNodes(Sender as TTreeView, dNode, sNode, true);
                (Sender as TTreeView).Selected := dNode;
              end;
            end
          else begin
            if Sender = Source then
              (Sender as TTreeView).Selected.MoveTo(dNode, naAddChild)
            else begin
              myMoveNodes(Sender as TTreeView, dNode, sNode, true);
              (Sender as TTreeView).Selected := dNode;
            end;
          end;
        end
      else begin  // 移到前面
        if Sender = Source then
          (Sender as TTreeView).Selected.MoveTo(dNode, naInsert)
        else begin
          myMoveNodes(Sender as TTreeView, dNode, sNode, false);
          (Sender as TTreeView).Selected := dNode;
        end;
      end;
      (Sender as TTreeView).Items.EndUpdate;  FMoveAsChild := false;
    end;
      

  4.   

    procedure TEditSubClassFrm.ClassTreeDragDrop(Sender, Source: TObject; X,
      Y: Integer);
    var targetnode,sourcenode:TTreenode;
      MyHitTest : THitTests;
    begin
       targetnode:=ClassTree.getnodeat(x,y); //获得源节点
      sourcenode:=ClassTree.selected; //获得目标节点
      MyHitTest := ClassTree.GetHitTestInfoAt(X,Y);
      if htOnIcon in MyHitTest then begin
        SwapNode(targetnode,sourcenode);
        if (Fini.LogSet>0) then
          RecordLog('拖动频道['+sourcenode.Text+']改变顺序');
      end else begin
    //修改数据库中当前节点的父节点号parent_id,使其等目标节点标识号;
        ClassTree.items.beginupdate; //禁用TreeView重绘操作
        try
          copynodeunder(ClassTree,sourcenode,targetnode); //启动移动过程
          ClassTree.selected:=targetnode;
        finally
          ClassTree.items.endupdate; //重新设置
        end;
      end;
    end;
    procedure CopyNodeUnder(treeview:TTreeview;sourcenode,targetnode:ttreenode);
    var newnode:ttreenode;
    i:integer;
    begin
      newnode:=TreeView.items.addchildfirst(targetnode,''); //建立目标项
      newnode.assign(sourcenode); //复制源项属性
    //  pMyid(newnode.Data)^.nodeParent:=pMyid(targetnode.Data)^.nodeid;
      for i:=sourcenode.count-1 downto 0 do //递归调用,按倒序移动其所有子项
        CopyNodeUnder (treeview,sourcenode.item[i],newnode);
      treeview.items.delete(sourcenode); //删除源项
    end;procedure SwapNode(targetnode,sourcenode:TTreeNode);
    begin
      Sourcenode.MoveTo(targetnode,naInsert);
    end;