不属于图形图像文件的是 实现应用程序的文件拖放功能
实现应用程序的文件拖放功能
在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
Windows Messages SysUtils Classes
Graphics Controls Forms Dialogs
StdCtrls;
type
TForm =class(TForm)
Memo :TMemo;
procedureFormCreate(Sender:TObject);
procedureLabel Click(Sender:TObject);
procedureLabel Click(Sender:TObject);
private
PROCEDUREFinishDropped(Varmsg:TMessage);
MessageWM_DropFiles;
{Privatedeclarations}
public
{Publicdeclarations}
end;
var
Form :TForm ;
implementation
usesshellapi;
{$R* DFM}
pro ureTForm FormCreate(Sender:TObject);
begin
//initializethedragprocess;
DragAcceptFiles(Handle True);
end;
ProcedureTForm FinishDropped(Varmsg:TMessage);
Var
hDrop:THandle;
iFile:Uint;
lpszFile:pchar;
CountOfFiles:integer;
FileIndex:integer;
ReSults:string;
begin
hDrop:=Msg WParam;
getmem(pchar );
iFile:=$FFFFFFFF;
CountOfFiles:=DragQueryFile(hDrop iFile lpszFile );
ReSults:=;
forFileIndex:= CountOfFiles do
begin
iFile:=FileIndex;
DragQueryFile(hDrop iFile lpszFile );
//GettheFilenamesbyorder;
ReSults:=ReSults+# # +lpszFile;
end;
Dispose(lpszFile);

memo Clear;
memo lines add(拖放了+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函数释放文件名缓冲区
lishixinzhi/Article/program/Delphi/201311/24695相关文章
- 有没有可以做动图的app 图中图图片是什么软件做的
- 真正免费照片恢复软件 为什么我手机一下载软件,相册里就出现了很多莫名其妙的图片,还直接删不掉,只有卸载软件图片才自动消失
- 图库里的微信图片文件夹找不到了 为什么百度下载的图片在手机的图片文件夹中找不到
- 图片软件哪个好 这个图片是个什么应用软件嘛?
- 为什么图库照片删不掉 下了快图浏览,但快图浏览里的照片图库里没有。为什么
- 把照片变成视频的软件免费 有什么软件可以把图片批成这样?
- 应用找不到图标怎么办 电脑上显示桌面图标没有了,怎么调出来
- 桌面图标不让拖拽 电脑桌面上的图标拖拽之后不是移动到另一个文件夹里而是复制过去了,要怎么办
- 档案数量 对视讯或者图片档案选择开启方式时总是显示:该档案没有程式与之关联来执行该操作。请在控制面板的资料夹
- 比photoshop简单的软件 photoshop的简单操作处理图片
爱学记

微信收款码
支付宝收款码