知识大全 实现应用程序的文件拖放功能

Posted 文件

篇首语:贵在坚持,难在坚持,成在坚持。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 实现应用程序的文件拖放功能相关的知识,希望对你有一定的参考价值。

  在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函数释放文件名缓冲区

cha138/Article/program/Delphi/201311/24695

相关参考

知识大全 Java拖放文件到Swing窗口

Java拖放文件到Swing窗口  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  经过测试是没有问

知识大全 在VB.NET中实现文件的拖放

在VB.NET中实现文件的拖放  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  本文介绍了在VBN

在Wndows资源管理器中,按住__键的同时,用鼠标将选定的文件拖放至同一驱动器的另一文件夹中,可以实现该文件的复

在Wndows资源管理器中,按住_____键的同时,用鼠标将选定的文件拖放至同一驱动器的另一文件夹中,可以实现该文件的复制。A、ShiftB、空格C、AltD、Ctrl答案:D解析:在同一个系统盘下,

知识大全 C#拖放技术的典型应用

C#拖放技术的典型应用  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  在应用程序中有时用户希望将

知识大全 C#中的拖放操作

C#中的拖放操作  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  随着桌面系统的推出利用鼠标的拖放

知识大全 Delphi拖放编程[2]

DELPHI基础教程:Delphi拖放编程[2]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  

知识大全 Delphi拖放编程[1]

DELPHI基础教程:Delphi拖放编程[1]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  

知识大全 Delphi拖放编程[4]

DELPHI基础教程:Delphi拖放编程[4]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  

知识大全 Delphi拖放编程[3]

DELPHI基础教程:Delphi拖放编程[3]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  

知识大全 如何制作可随处拖放的工具栏

  在我们经常使用的软件比如photoshopofficedelphi等等我们经常可以对工具栏进行拖拽操作将相关的工具栏拖拉出来形成独立的小窗口或者将几个工具栏进行互相的组合!(这些就是我们常说的DO