LISTVIEW中拖动ICON ?(50分)

  • 主题发起人 主题发起人 87150
  • 开始时间 开始时间
8

87150

Unregistered / Unconfirmed
GUEST, unregistred user!
请问在LISTVIEW中拖动ICON之后,怎样让它显示在当前位置?
 
当前位置是指什么位置?
 
to ganglu:

指拖动ICON时显示的位置
想 DESKTOP 那样,鼠标UP 后ICON显示位置不变
但如果在ONENDDRAG 写成

Listitem.Left:=x;
Listitem.top: =y;

则ICON 移动到当前鼠标箭头位置


 
试试下列代码!
我就是这样用的,但还是有一点小问题(几乎看不出)
procedure TFrmmain.listview1MouseDown(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
if lvShortCut.Selected = nil then
exit;
if Button = mbleft then
begin
dx := x - lvShortCut.Selected.Left;
dy := Y - lvShortCut.Selected.Top;
end;

end;


procedure TFrmmain.listview1DragDrop(Sender, Source: TObject; X,
Y: Integer);
begin
(Sender as TListview).Selected.Left := x - dx;
(Sender as TListview).Selected.Top := y - dy;
end;
 
TO 冷叶风:
如果是Muti Select会如何? 谢谢!
 
不好意思!今天才看到!
对于多选和单选有另外一种方法其实原理和现在差不多。
procedure TFrmmain.listview1MouseDown(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
if lvShortCut.Selected = nil then
exit;
if Button = mbleft then
begin
dx := x;
dy := Y;
end;

end;


procedure TFrmmain.listview1DragDrop(Sender, Source: TObject; X,
Y: Integer);
var
dxx,dyy : integer
i : integer
begin
//算出当前鼠标离拖动前的距离。
dxx := x-dx; dyy := y-dy;
//来一个For循环找出所有选中的节点
for i:=0 to ListView1.Items.Count-1 do
if ListView1.Items.Selected = True
begin
ListView1.Items.Left :=ListView1.Items.Left + dx;
ListView1.Items.Top := ListView1.Items.Top + dy;
end;
end;
这样就可以实现整体拖动了!

Delphi中的BeginDrag事件还重新发了一个Mouse消息
源码!
Perform(WM_LBUTTONUP, 0, Longint(PointToSmallPoint(P)));
所以定位的好像有点不准。MouseDown的事件被触发两次!
我也就知道这么多了!

 
后退
顶部