TTreeView 节点拖动的程序.

把节点A移动到节点B下,
节点H移动节点C前等

解决方案 »

  1.   

    procedure TForm1.TreeView1DragDrop(Sender, Source: TObject; X, Y: Integer);
    var
      AnItem: TTreeNode;
      AttachMode: TNodeAttachMode;
      HT: THitTests;
    begin
      if TreeView1.Selected = nil then Exit;
      HT := TreeView1.GetHitTestInfoAt(X, Y);
      AnItem := TreeView1.GetNodeAt(X, Y);
      if (HT - [htOnItem, htOnIcon, htNowhere, htOnIndent] <> HT) then
      begin
        if (htOnItem in HT) or (htOnIcon in HT) then AttachMode := naAddChild
        else if htNowhere in HT then AttachMode := naAdd
        else if htOnIndent in HT then AttachMode := naInsert;
        if SourceNode=AnItem then
          Exit;
        TreeView1.Selected.MoveTo(AnItem, AttachMode);
      end;
    end;procedure TForm1.TreeView1DragOver(Sender, Source: TObject; X, Y: Integer;
      State: TDragState; var Accept: Boolean);
    begin
      Accept:=True;
    end;procedure TForm1.TreeView1StartDrag(Sender: TObject;
      var DragObject: TDragObject);
    begin
      SourceNode:=TreeView1.Selected;
    end;
      

  2.   

    上述程序有小问题,编译报错:“SourceNode没有声明,且AttachMode可能没有被初始化”请 DelUser(探索者) 调试通过后在上传,这个程序会很有用的,请 DelUser(探索者) 把它完成好吗?
      

  3.   

    DelUser(探索者) 方法不错,
    但也可只要记录前后位置后,再对数据表进行移动,最后重新生成树,
    这也是一种好办法.
      

  4.   

    var
      SourceNode : TTreeNode;procedure TForm1.TreeView1DragDrop(Sender, Source: TObject; X, Y: Integer);
    var
      AnItem: TTreeNode;
      AttachMode: TNodeAttachMode;
      HT: THitTests;
    begin
      if TreeView1.Selected = nil then Exit;
      HT := TreeView1.GetHitTestInfoAt(X, Y);
      AnItem := TreeView1.GetNodeAt(X, Y);
      AttachMode := naAdd;
      if (HT - [htOnItem, htOnIcon, htNowhere, htOnIndent] <> HT) then
      begin
        if (htOnItem in HT) or (htOnIcon in HT) then AttachMode := naAddChild
        else if htNowhere in HT then AttachMode := naAdd
        else if htOnIndent in HT then AttachMode := naInsert;
        if SourceNode=AnItem then
          Exit;
        TreeView1.Selected.MoveTo(AnItem, AttachMode);
      end;
    end;procedure TForm1.TreeView1DragOver(Sender, Source: TObject; X, Y: Integer;
      State: TDragState; var Accept: Boolean);
    begin
      Accept:=True;
    end;procedure TForm1.TreeView1StartDrag(Sender: TObject;
      var DragObject: TDragObject);
    begin
      SourceNode:=TreeView1.Selected;
    end;
      

  5.   

    var  // 全局变量
      SourceNode : TTreeNode;
      

  6.   

    procedure TfrmMain.TreeView1DragDrop(Sender, Source: TObject; X,
      Y: Integer);
    var
      srcNode, destNode: TTreeNode;
    begin
      if (Source = TreeView1) then
      with TreeView1 do begin
        srcNode  := Selected;
        destNode := GetNodeAt(X, Y);
        if srcNode.Parent = destNode.Parent then  // 若是同级移动
          srcNode.MoveTo(destNode, naInsert);
      end;
    end;procedure TfrmMain.TreeView1DragOver(Sender, Source: TObject; X,
      Y: Integer; State: TDragState; var Accept: Boolean);
    begin
        Accept := True;
    end;