在Delphi中支持文件拖放的程序

Author: 黄慧强 Date: 1998年 第27期 13版

  Windows中应用程序间的文件拖放操作非常简单、快捷、实用,通常我们在Windows中做拷贝、移动文件操作时,常常是使用支持文件拖放的程序来进行,如Windows 3.X中的文件管理器,Windows 95资源管理器等。实现文件拖放并不复杂,以下面的例子来简单说明它的原理:
  文件管理器或资源管理器向程序Project1发一个WM_ DROPFILES消息,Project1获取WM_ DROPFILES消息后调用WinAPI函数DragAcceptFiles()、DragQueryFile()处理WM_ DROPFILES消息。
  以下是用Delphi实现这个功能的过程:
  1.新建一个工程Project1,在Unit1的uses保留字后加上ShellApi单元。
  2.在Form1的OnCreate事件中添加下面一行,使Form1可以接收WM_ DROPFIELS消息。
  DragAcceptFiles(Form1.Handle, True);
  3.从构件面板上拖一个Memo1到Form1上,设Memo1的Align属性为alClient。
  4.在Form1的公有域添加如下代码,声名一个处理WM_ DROPFIELS消息的过程。
  public
  {Public declarations}
  procedure WMDropFiles(var message:TMessage);message WM_ DROPFILES;
  end;
  5.在implementation后面编写过程WMDropFiles()的代码。
  procedure Tform1.WMDropFiles(var message:TMessage);
  var
  P:array[0..254] of Char;
  I:word;
  begin
  Inherited;
  Memo1.Lines.Clear;
  {$IFDEF WIN32}
  I:=DragQueryFile(Message.wParam,$ffffffff,nil,0);
  {$ELSE}
  I:=DragQueryFile(Message.wParam,$ffff,nil,0);
  {$ENDIF}
  Caption:=IntToStr(i);
  for I:=0 to I-1 do
  begin
  DragQueryFile(Message.wParam,I,P,255);
  Memo1.Lines.Add(StrPas(P));
  end;
  end;
  运行Project1,从Windows 3.X的文件管理器或Windows 95中的资源管理器里拖一些文件或目录到Project1窗口上,释放鼠标左键后可以看到Project1窗口标题上显示了拖放文件或者目录的数目,并且Memo1详细列出这个文件或目录的全路径名。