上一篇:Word文件缩放打印
下一篇:蓝鸟影音捕手

使应用程序支持文件拖放

发布于: 2015-1-15 10:57:41   |  发布在: Delphi文章   |  点击:

        支持文件拖放是指,用户从Windows资源管理器中把一个或多个文件的图标拖动到你的应用程序窗口,你的应用程序对用户这一动作执行相应的响应,如打开文件、添加到播放列表等操作,以增加程序的用户访问友好性。

        本文就使用Delphi开发应用程序如何实现这一技术做个简单介绍。要支持文件拖放,关键是两点:第一,让你的窗体支持拖放操作;第二,响应Windows发出文件拖放消息(WM_DROPFILES)。这要用到两Windows API函数,DragAcceptFiles和DragQueryFile,所以你需要引用单元文件:ShellAPI,具体过程如下:

        首先,新建一个Delphi工程,在主窗体上放置一个TMemo控件,用于显示用户拖放来的文件名。

        然后,在单元文件Unit1.PasUses部分增加ShellAPI的引用。

        接着,添加代码:

1. 主窗体的OnCreate事件响应代码:

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

2. 在Public部分,添加消息响应函数申明:

  public
    procedure WMDrops(var message:TMessage);message WM_DROPFILES;

3. 在implementation部分添加该函数的具体代码:

procedure TForm1.WMDrops(var message:TMessage);
var
  i, iFileCount: Integer;
  P:array[0..254of Char;
begin
  //获取文件个数
  iFileCount := DragQueryFile(Message.wParam, $FFFFFFFFnil0);
  //循环获取文件名
  for i:=0 to iFileCount - 1 do
  begin
    DragQueryFile(Message.wParam, i, P, SizeOf(P));
    Memo1.Lines.Add(StrPas(P));
  end;
end;

最后,按F9编译运行就可以了。

补充:如果想让窗体的某个控件支持文件拖放操作,如:窗体上有两个TMemo控件,用户拖放到Memo1的文件用Memo1显示,拖放到Memo2的文件用Memo2显示。一般有两种方法,第一种方法:重载TMemo控件类,在派生的TMemo的类增加WM_DROPFILES消息响应事件;第二种方法:自定义应用程序的消息响应函数,对WM_DROPFILES消息进行处理。第一种方法比较困难,这里介绍第二种方法:

1. 在Public部分增加一个消息处理函数的申明:

  public
    procedure AppMessage(var Msg: tagMsg; var Handled: Boolean);

2. 在implementation部分添加该函数的具体代码:

procedure TForm1.AppMessage(var Msg: tagMsg; var Handled: Boolean);
var
  i, iFileCount: Integer;
  P:array[0..254of Char;
begin
  if Msg.message = WM_DROPFILES then
  begin
    //获取文件个数
    iFileCount := DragQueryFile(Msg.wParam, $FFFFFFFFnil0);
    //循环获取文件名
    for i:=0 to iFileCount - 1 do
    begin
      DragQueryFile(Msg.wParam, i, P, SizeOf(P));
      if Msg.hwnd = Memo1.Handle then
        Memo1.Lines.Add(StrPas(P))
      else if Msg.hwnd = Memo2.Handle then
        Memo2.Lines.Add(StrPas(P));
    end;
    Handled := True;
  end;
end;

 3. 修改主窗体的OnCreate事件响应代码:

procedure TForm1.FormCreate(Sender: TObject);
begin
  DragAcceptFiles(Memo1.Handle, True); //Memo1支持文件拖放
  DragAcceptFiles(Memo2.Handle, True); //Memo2支持文件拖放
  Application.OnMessage := AppMessage; //设置自定义消息响应函数
end;

最后,按F9编译运行。

(以下代码在WinXP+Delphi7环境下调试通过)

文件控件文件拖放