我在一个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;这样消息没法正确接收。请问有什么方法能接收到该消息吗?
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;这样消息没法正确接收。请问有什么方法能接收到该消息吗?
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.
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;