文件拖放功能

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实现应用程序的文件拖放功能

时间:2008-04-09 04:17来源:互联网

在Delphi中有许多控件支持拖放操作,但仅限于应用程序内部,而不能实现从Windows 环境里向应用程序拖放文件,本文将要介绍的就是如何用Delphi编写支持文件拖放的应用程序,由于主要使用WindowsAPI函数,因此也可供其它语言使用者参考. 首先要说明的是下面的三个API函数

在Delphi中有许多控件支持拖放操作,但仅限于应用程序内部,而不能实现从Windows环境里向应用程序拖放文件,本文将要介绍的就是如何用Delphi编写支持文件拖放的应用程序,由于主要使用WindowsAPI函数,因此也可供其它语言使用者参考.

首先要说明的是下面的三个API函数,为通用起见, 函数说明使用C语言格式,

1.VOIDDragAcceptFiles(

HWNDhWnd,

BOOLfAccept);

DragAcceptFiles函数是用来为拖放文件作初始化, 它的第一个参数hWnd 指明目标窗体的句柄,第二个参数fAccept是一个布尔型变量,为True时则hWnd所指向的窗体可以接受拖放的文件.

2.UINTDragQueryFile(

HDROPhDrop,

UINTiFile,

LPTSTRlpszFile,

UINTcch)

DragQueryFile函数用来查询拖放文件的文件名,其本身的返回值是一个无符号整数,参数hDrop是一个存放所拖放文件名称的数据结构的句柄, 也就是文件名缓冲区的句柄,需要从Windows消息WM_DROPFILES中获得.iFile指明所要查询文件的序号,它有两种取值方式,1.值为十六进制数FFFFFFFF

时,DragQueryFile的返回值为所拖放文件的数目;2.值在0到拖放文件总数之间时,DragQueryFile函数将相应序号的文件名放入参数lpszFile所指向的缓冲区内,若此时lpszFile的值为NULL,则DragQueryFile会返回相应文件名的长度.参数cch决定缓冲区的长度,由于Windows95支持长文件名,它的值不能设得太小.

3.VOIDDragFinish(HDROPhDrop);

使用DragFinish函数告诉Windows拖放操作结束,使其释放文件名缓冲区,它的参数hDrop与DragQueryFiles函数中的一样,也由Windows消息

WM_DROPFILES 的hDrop参数获得.

下面将结合一个我编写的例子来说明具体的编程步骤.本例中窗体上放置了一个Memo控件memo1,在Windows中选取数个文件拖至程序窗体放下,则memo1中便会显示所选文件的总数及每个文件的各自名称.程序代码如下:

unitUnit1;

interface

uses

Windows,Messages,SysUtils,Classes,

Graphics,Controls,Forms,Dialogs,

StdCtrls;

type

TForm1=class(TForm)

Memo1:TMemo;

procedureFormCreate(Sender:TObject);

procedureLabel3Click(Sender:TObject);

procedureLabel4Click(Sender:TObject);

private

PROCEDUREFinishDropped(VARMsg:TMessage);

MessageWM_DropFiles;

{Privatedeclarations}

public

{Publicdeclarations}

end;

var

Form1:TForm1;

implementation

usesshellapi;

{$R*.DFM}

pro ureTForm1.FormCreate(Sender:TObject);

begin

//initializethedragprocess;

DragAcceptFiles(Handle,True);

end;

ProcedureTForm1.FinishDropped(VARMsg:TMessage);

Var

hDrop:THandle;

iFile:Uint;

lpszFile:pchar;

CountOfFiles:integer;

FileIndex:integer;

ReSults:string;

begin

hDrop:=Msg.WParam;

getmem(pchar,255);

iFile:=$FFFFFFFF;

CountOfFiles:=DragQueryFile(hDrop,iFile,lpszFile,254); ReSults:=;

forFileIndex:=0CountOfFiles-1do

begin

iFile:=FileIndex;

DragQueryFile(hDrop,iFile,lpszFile,254);

//GettheFilenamesbyorder;

ReSults:=ReSults #13#10 lpszFile;

end;

Dispose(lpszFile);

memo1.Clear;

memo1.lines.add(拖放了 IntToStr

(CountOfFiles) 个文件: ReSults);

DragFinish(hDrop);

end;

end.

从以上代码可以看出,首先应该在窗体的OnCreate事件中用DragAccepteFiles来说明程序窗体支持文件的拖放.

另外,除了调用以上3个API函数,在Delphi中还应编写针对WM_DROPFILES 的消息处理过程FinishDropped,截取了WM_DROPFILES,由其wParam 才能够得到文件名缓冲区的句柄.

在FinishDropped过程里,有两处DragQueryFile 函数,第一处其iFile参数为$FFFFFFFF,得到拖放文件的总数;第二处iFile参数为每个文件的序号,则可在lpszFile中可得到相应的文件名.当然,为了明显的对比iFile的值对DragQueryFile 函数的影响,这里的代码不够简练.有一点需要注意的

是,lpszFile是Pchar型的变量,为了程序运行安全,它使用前需用getmem过程为其分配内存,使用后再用dispose过程将其释放. 在FinishDropped过程的最后,用DragFinish函数释放文件名缓冲区.

以上范例代码在Delphi4中通过.

相关文档
最新文档