电脑故障

位置:IT落伍者 >> 电脑故障 >> 浏览文章

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


发布日期:2020/11/7
 

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

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

VOIDDragAcceptFiles(

HWNDhWnd

BOOLfAccept);

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

UINTDragQueryFile(

HDROPhDrop

UINTiFile

LPTSTRlpszFile

UINTcch)

DragQueryFile函数用来查询拖放文件的文件名其 本身的返回值是一个无符号整数参数hDrop是一个存放所拖放文件名称的数据结构的句柄 也就是文件名缓沖区的句柄需要从Windows消息WM_DROPFILES中获得iFile指明所要查询 文件的序号它有两种取值方式值为十六进制数FFFFFFFF时DragQueryFile的返回值为 所拖放文件的数目;值在到拖放文件总数之间时DragQueryFile函数将相应序号的文件 名放入参数lpszFile所指向的缓沖区内若此时lpszFile的值为NULL则DragQueryFile会返 回相应文件名的长度参数cch决定缓沖区的长度由于Windows支持长文件名它的值不能 设得太小

VOIDDragFinish(HDROPhDrop);

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

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

unitUnit;

interface

uses

WindowsMessagesSysUtilsClasses

GraphicsControlsFormsDialogs

StdCtrls;

type

TForm=class(TForm)

Memo:TMemo;

procedureFormCreate(Sender:TObject);

procedureLabelClick(Sender:TObject);

procedureLabelClick(Sender:TObject);

private

PROCEDUREFinishDropped(Varmsg:TMessage);

MessageWM_DropFiles;

{Privatedeclarations}

public

{Publicdeclarations}

end;

var

Form:TForm;

implementation

usesshellapi;

{$R*DFM}

pro ureTFormFormCreate(Sender:TObject);

begin

//initializethedragprocess;

DragAcceptFiles(HandleTrue);

end;

ProcedureTFormFinishDropped(Varmsg:TMessage);

Var

hDrop:THandle;

iFile:Uint;

lpszFile:pchar;

CountOfFiles:integer;

FileIndex:integer;

ReSults:string;

begin

hDrop:=MsgWParam;

getmem(pchar);

iFile:=$FFFFFFFF;

CountOfFiles:=DragQueryFile(hDropiFilelpszFile);

ReSults:=;

forFileIndex:=CountOfFilesdo

begin

iFile:=FileIndex;

DragQueryFile(hDropiFilelpszFile);

//GettheFilenamesbyorder;

ReSults:=ReSults+##+lpszFile;

end;

Dispose(lpszFile);

memoClear;

memolinesadd(拖放了+IntToStr

(CountOfFiles)+个文件:+ReSults);

DragFinish(hDrop);

end;

end

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

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

在FinishDropped过程里有两处DragQueryFile 函数第一处其iFile参数为$FFFFFFFF得到拖放文件的总数;第二处iFile参数为每个文 件的序号则可在lpszFile中可得到相应的文件名当然为了明显的对比iFile的值对DragQueryFile 函数的影响这里的代码不够简练有一点需要注意的是lpszFile是Pchar型的变量为了 程序运行安全它使用前需用getmem过程为其分配内存使用后再用dispose过程将其释放 在FinishDropped过程的最后用DragFinish函数释放文件名缓沖区

以上范例代码在Delphi中通过

上一篇:在Windows XP以幻灯片方式浏览图片

下一篇:主从表的添加保存处理实现方法