如何实现类似于桌面上图标的自由拖动,用TListView(50分)

  • 主题发起人 主题发起人 guzlc
  • 开始时间 开始时间
G

guzlc

Unregistered / Unconfirmed
GUEST, unregistred user!
如何实现类似于桌面上图标的自由拖动,用TListView
 
搞定~~~

在FORM1上放一个ListView1,建立几个Items,一个ImageList1,ImageList1里面放几个图标~~
设置ListView1.LargeImages :=ImageList1;

procedure TForm1.ListView1DragOver(Sender, Source: TObject; X, Y: Integer;
State: TDragState; var Accept: Boolean);
begin
accept:=Source is TlistView;
end;

procedure TForm1.ListView1DragDrop(Sender, Source: TObject; X, Y: Integer);
var
PosPoint:TPoint;
begin
PosPoint.x:=x;
PosPoint.y:=Y;
(Source As TListView).Selected.SetPosition(PosPoint);
end;

procedure TForm1.ListView1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if button=mbleft then
begin
with sender as TListview do
begin
if GetItemAt(x,y)<>nil then
begindrag(false);
end;
end;
end;

一切OK~~~
 
这里有个问题,当拖动结束时,我先前也这样做的,图标的定位不准确,会产生跳动,
不像桌面拖动的很平滑。所以还要考虑TListItem的坐标,另外,怎么解决当图标拖动出
TListView的范围后它自动出现滚动条?
 
关于图标的定位:你在拖动时,鼠标的位置对应的是图标的左上角的位置,所以你应该
在这里 PosPoint.x:=x;
PosPoint.y:=Y; 分别减去图标的宽度和高度的一半;默认是图标是16×16大小.
 
鼠标拖动的位置是不定的,只要在所选图标范围内就行了
sx,sy: integer;
procedure TForm1.ListView1StartDrag(Sender: TObject;
var DragObject: TDragObject);
begin
if Sender is TListView then
begin
sx := TListView(Sender).Selected.Left - sx;
sy := TListView(Sender).Selected.Top - sy;
end;
end;

procedure TForm1.ListView1EndDrag(Sender, Target: TObject; X, Y: Integer);
begin
if Sender is TListView then
TListView(Sender).Selected.SetPosition(Point(X + sx,Y + sy));
end;

procedure TForm1.ListView1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if button=mbleft then
begin
with sender as TListview do
begin
if GetItemAt(x,y)<>nil then
begin
sx := X;
sy := Y;
end;
end;
end;
end;
可以平滑拖动,但在拖动图标超出TListView范围时,出现滚动条,如何消除?
不知道修改TListView是否有效
 
多人接受答案了。
 
后退
顶部