第8章 组件应用实例 实例149 在TListView中拖动图标
本实例演示如何在程序运行过程中动态拖动TListView组件中的图标。
在窗体中添加一个TImageList组件,并且为它添加3个图像文件。然后添加一个TListView组件,设置它的LargeImages和SmallImages属性为TImageList组件,为TListView组件添加3个列表项,并且设置列表项的ImageIndex属性分别对应TImageList组件中的图像索引编号。添加组件后的窗体如图8-47所示。
图8-47 添加组件后的窗体
当用户在TListView组件中用鼠标左键选中一个列表项后,就通过调用BeginDrag函数进行拖动操作,响应代码如下: 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; 在鼠标拖动过程中,要不停改变选中列表项的位置,代码如下: 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; 释放鼠标后,通过设置OnDragOver事件中的Accept参数来决定是否接受拖动操作。在本实例中如果拖动源为TListView组件,那么就设置Accept参数为True,即接受操作,响应代码如下: procedure TForm1.ListView1DragOver(Sender, Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean); begin Accept:=Source Is TListView; end;
程序代码如下: unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ImgList, ComCtrls, Menus, StdCtrls;
type TForm1 = class(TForm) ListView1: TListView; ImageList1: TImageList; procedure ListView1DragDrop(Sender, Source: TObject; X, Y: Integer); procedure ListView1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure ListView1DragOver( Sender, Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean); private { Private declarations } public { Public declarations } end;
var Form1: TForm1; implementation {$R *.dfm}
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;
procedure TForm1.ListView1DragOver(Sender, Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean); begin Accept:=Source Is TListView; end;
end.
保存文件,然后按F9键运行程序,程序运行的初始画面如图8-48所示。
图8-48 程序运行的初始画面 在TListView组件中可以动态拖动图标,程序运行的结果如图8-49所示。
图8-49 程序运行结果 |