Your Ad Here
首页 | 编程语言 | 网站建设 | 游戏天堂 | 冲浪宝典 | 网络安全 | 操作系统 | 软件时空 | 硬件指南 | 病毒相关 | IT 认证
软讯网络 > 软件时空 > 软件相关 > delphi实现应用程序的文件拖放功能
【标  题】:delphi实现应用程序的文件拖放功能
【关键字】:delphi
【来  源】:http://blog.chinaunix.net/article.php?articleId=23960&blogId=484

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

Your Ad Here 在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;

public

end;
var
Form1:TForm1;
implementation
usesshellapi;

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中通过.

几种体系结构的寄存器:【上一篇】
一个delphi常用函数中文说:【下一篇】
【相关文章】
  • Floating Palette for Delphi 7
  • MSDN Lookup expert for Delphi
  • Delphi & C++Builder IDE Palette Menu
  • Delphi2005免安装精简版
  • Delphi: A Cool and Easy Method for Resizing and Mo
  • 经验: Delphi2005
  • 发现一个 Delphi6 VCL 的 BUG!
  • delphi中第三方控件的安装方法
  • 几个获取Windows系统信息的Delphi程序
  • Delphi 类的静态属性
  • 【随机文章】
  • [PHP]进程篇
  • 读书笔记之<<Learning the bash shell>> 之四
  • Aix下使用rman备份oracle数据库
  • 编写简单的未确定参数的函数.使用了stdarg头文件里的宏。va_list, va_start, va_end, va_arg.
  • 软件保护
  • Primer C 4th(第4章习题)
  • 静态分析技术-W32Dasm简介 下
  • Photoshop 7.0 裁切工具和切片工具组
  • VLAN的网络管理(网管必看)
  • 用C#通过网址得到域名
  • 【相关评论】
    没有相关评论
    【发表评论】
    姓名:
    邮件:
    随机码*
    评论*
          
    |  首 页  |  版权声明  |  联系我们   |  网站地图  |
    CopyRight © 2004-2007 软讯网络 All Rigths Reserved.