分享

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

 changkongzhi 2013-03-25

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

  首先要说明的是下面的三个API函数,为通用起见, 函数说明,

1.DragAcceptFiles(

HWNDhWnd,

BOOLfAccept);

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

2.DragQueryFile(

HDROPhDrop,

UINTiFile,

LPTSTRlpszFile,

UINTcch)

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

3.DragFinish(HDROPhDrop);

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

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

unit Unit1;

interface

  uses  
      Windows,   Messages,   SysUtils,   Classes,   Graphics,   Controls,   Forms,   Dialogs,  
      shellapi,   StdCtrls;  


type
  TForm1 = class(TForm)
    listbox1: TListBox;
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
     procedure   dropfile(var   msg:   tmessage);message   wm_dropfiles;

  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure   TForm1.dropfile(var   msg:   tmessage);
  var
      i,number:integer;
      filename:array[0..255]   of   char;  
      pfilename:pchar;
begin
    pfilename:=@filename;
    number:=dragqueryfile(msg.wParam,$ffffffff,nil,0);//或的文件的个数
    for   i:=0   to   number-1   do     //穷举所有的文件
    begin
        dragqueryfile(msg.wParam,i,pFileName,255);
        listbox1.Items.Add(pFileName);
    end;
    DragFinish(msg.wParam);             //处理完毕
end;

procedure   TForm1.FormCreate(Sender:   TObject);
begin
  DragAcceptFiles(handle,True);
end;

end.

 

var
  Form1: TForm1;
  OldPannelDisplayWindowProc: TWndMethod;
implementation

{$R *.dfm}

procedure TForm1.dropfile(var msg: tmessage);
  var
      i,number:integer;
      filename:array[0..255]   of   char;
      pfilename:pchar;
begin
    pfilename:=@filename;
    number:=dragqueryfile(msg.wParam,$ffffffff,nil,0);//或的文件的个数
    for   i:=0   to   number-1   do     //穷举所有的文件
    begin
        dragqueryfile(msg.wParam,i,pFileName,255);
        listbox1.Items.Add(pFileName);
    end;
    DragFinish(msg.wParam);             //处理完毕
end;

procedure TForm1.FormCreate(Sender:   TObject);
begin
    //DragAcceptFiles(handle,True);
    OldPannelDisplayWindowProc := Panel1.WindowProc;
    Panel1.WindowProc := PanelWindowProc;
   DragAcceptFiles(Panel1.Handle,True);
    DragAcceptFiles(Handle,True);

end;


procedure TForm1.Panel1DragOver(Sender, Source: TObject; X, Y: Integer;
  State: TDragState; var Accept: Boolean);
begin
  Accept :=True;
end;

procedure TForm1.PanelWindowProc(var Message: TMessage);
begin
  try
    if Message.Msg = WM_DROPFILES then
      dropfile(Message);
    OldPannelDisplayWindowProc(Message);

  finally
  end;
end;

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多