-->



实例149 在TListView中拖动图标

本实例演示如何在程序运行过程中动态拖动TListView组件中的图标。

在窗体中添加一个TImageList组件,并且为它添加3个图像文件。然后添加一个TListView组件,设置它的LargeImagesSmallImages属性为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 程序运行结果