一个TreeView,我设置手动拖放,在Treeview的MouseDown事件里面
procedure TForm1.TreeView1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
var
  Node : TTreeNode;
begin
  node := TreeView1.GetNodeAt(x,y);
  if ( Button = mbLeft ) and (Node <> nil)
    and (Node.Level <> 0 ) then
    Treeview1.BeginDrag(False);
end;
这样是可以实现拖放的,但是有个问题,如果我把一个ImageList关联到TreeView上,然后点击树上的节点,请注意,鼠标没有移动,只是点击,这个时候就已经触发了BeginDrag,然后在节点旁边会显示一个开始拖拉的节点,这是为什么?
如果没有ImageList或者让TreeView自动拖放都没有这个问题。

解决方案 »

  1.   

    大家帮帮忙啊,我查了一下帮助BeginDrag有两个参数,第二个是设置鼠标移动多少可以拖拉的,但是即时我设置成1000,也还是会立即拖拉。
      

  2.   

    procedure TForm1.tvDragDrop(Sender, Source: TObject; X, Y: Integer);
    var
      AnItem: TTreeNode;
      AttachMode: TNodeAttachMode;
      HT: THitTests;
    begin
      if tv.Selected = nil then Exit;
      HT := tv.GetHitTestInfoAt(X, Y);
      AnItem := tv.GetNodeAt(X, Y);
      edit1.Text:=anitem.Text;
      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;
        Tv.Selected.MoveTo(AnItem, AttachMode);
      end;
    end;
    procedure TForm1.tvDragOver(Sender, Source: TObject; X, Y: Integer;
      State: TDragState; var Accept: Boolean);
    begin
      if source is TTreeView then
        accept:=true
      else
        accept:=false;end;
      

  3.   

    在ondrag事件中写就行,一个接收的,一个托放的。
      

  4.   

    不好意思,看样子是我没有说清楚。
    因为我的树是2层结构,只有子节点才能拖拉,父节点是不能拖拉的,所以我在TreeView的OnMouseDown事件来做,判断是否是子节点,如果是,则BeginDrag,但是现在的问题在于我在子节点上按下鼠标左键,还没有移动鼠标,就已经开始拖这个节点了(效果就是在该节点的旁边又出现了一个该节点的图像),我主要是想解决这个问题,就是按下鼠标左键不要拖,只有当移动鼠标到一定距离以后才开始拖。
    不知道这样说,大家是否明白?