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