我在一个Form上 给一个 panel 注册了一个能接收外部拖拽的事件
DragAcceptFiles(panel1.Handle, Enabled);这样当拖拽外部文件到该Panel上,并释放鼠标后,windows会发送消息:WM_DROPFILES 给Panel1.Handle 这个句柄。消息接收函数:procedure DropFiles(var Mes:TMessage);message WM_DROPFILES;但我这个函数是写在 Form 类中的。
type
  Form1 = class(TForm)
  public
    ...
    procedure DropFiles(var Mes:TMessage);message WM_DROPFILES;
    ...
  end;这样消息没法正确接收。请问有什么方法能接收到该消息吗?

解决方案 »

  1.   

    给你个例子,窗体上有一个memo,接受从外部拖动来的文件,并显示文件名在memo中unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs,shellapi, StdCtrls;type
      TForm1 = class(TForm)
        Memo1: TMemo;
        Label1: TLabel;
        procedure FormCreate(Sender: TObject);
      private
        { Private declarations }
      public
        procedure DropFiles(var Mes:TMessage);message WM_DROPFILES;
      end;var
      Form1: TForm1;implementation{$R *.dfm}procedure TForm1.DropFiles(var Mes: TMessage);
    var
    char1:array[0..128]of char; // 缓冲区
    char2 : PChar;
    i,sum : Integer;
    begin
    // 获得拖拉的文件数目,该功能由第二个参数决定
    sum := DragQueryFile(mes.WParam,$FFFFFFFF,nil,0);
    Label1.Caption := inttostr(sum);
    char2 := @char1;
    for i:=0 to Sum-1 do
    begin
    // 获取第i个拖拉文件的名字,并保存在缓冲区c h a r 2中
      DragQueryFile(mes.WParam,i,char2,128);
      Memo1.Lines.Add(char2);
    // 在M e m o 1中显示拖拉文件的名字
    end;// 释放应用程序为传递文件名而开辟的内存空间
    DragFinish(mes.WParam);
    end;procedure TForm1.FormCreate(Sender: TObject);
    begin
       DragAcceptFiles(Handle,true);
    end;end.
      

  2.   

    wudi_1982 的列子 
    procedure TForm1.FormCreate(Sender: TObject);
    begin
       DragAcceptFiles(Handle,true);//接收的是Form,而不是memo
    end;具体方法我已经找到了。谢谢 wudi_1982 帮助设置全局量
    type
      TForm1 = TForm(class)
      private
        procedure DragFileProc(var Msg:TMessage);message WM_DROPFILES;
      end;var
      OLDWndProc:TWndMethod;implementationprocedure TForm1.SetDrag(Sender: TObject);
    begin
      DragAcceptFiles(Memo1.Handle,Enabled);
      OLDWndProc:= pn_ImgIcon.WindowProc;//保存原来的WindowProc
      pn_ImgIcon.WindowProc:= DragFileProc;//设置新的WindowProc
    end;procedure TForm1.DragFileProc(var Msg: TMessage);
    var
      FileName:array [0..MAX_PATH-1] of Char;
      sFileName:String;
      Count:integer;
    begin
      if Msg.Msg=WM_DropFiles then
      begin
        Count:=DragQueryFile(Msg.WParam,$FFFFFFFF,@FileName[0], MAX_PATH);//得到拖放文件的个数
        if Count > 0 then
        begin
          FillChar(FileName, SizeOf(FileName), #0);
          DragQueryFile(Msg.WParam, 0, @FileName[0], MAX_PATH);//查询文件名称
          sFileName:= PChar(@FileName[0]);
          
          memo1.lines.add(sFileName);
        end;
        DragFinish(Msg.WParam); //释放所使用的资源
      end else
        OLDWndProc(Msg);
    end;