unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, ShellAPI;
type
TForm1 = class(TForm)
Panel1: TPanel;
procedure FormCreate(Sender: TObject);
private
OLDWndProc:TWndMethod;
procedure DragFileProc(var Msg:TMessage);message WM_DROPFILES;
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
{ TForm1 }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:= string(FileName); end;
DragFinish(Msg.WParam); //释放所使用的资源
end else
OLDWndProc(Msg);
end;procedure TForm1.FormCreate(Sender: TObject);
begin
DragAcceptFiles(panel1.Handle, Enabled);
OLDWndProc:= panel1.WindowProc; // 保存原来的 WindowProc
panel1.WindowProc:= DragFileProc; // 设置新的 WindowProce
end;end.我想请问下,如果我在一个界面上同时有多个WinControl组件需要支持windows外部文件拖拽,要怎么做?通过(var Msg:TMessage);message WM_DROPFILES; 能判断出是哪个组件返回的吗?
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, ShellAPI;
type
TForm1 = class(TForm)
Panel1: TPanel;
procedure FormCreate(Sender: TObject);
private
OLDWndProc:TWndMethod;
procedure DragFileProc(var Msg:TMessage);message WM_DROPFILES;
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
{ TForm1 }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:= string(FileName); end;
DragFinish(Msg.WParam); //释放所使用的资源
end else
OLDWndProc(Msg);
end;procedure TForm1.FormCreate(Sender: TObject);
begin
DragAcceptFiles(panel1.Handle, Enabled);
OLDWndProc:= panel1.WindowProc; // 保存原来的 WindowProc
panel1.WindowProc:= DragFileProc; // 设置新的 WindowProce
end;end.我想请问下,如果我在一个界面上同时有多个WinControl组件需要支持windows外部文件拖拽,要怎么做?通过(var Msg:TMessage);message WM_DROPFILES; 能判断出是哪个组件返回的吗?
前提是不需要重新编译TPanel控件。编写一个继承类的话就不能放在界面上了。除非编成可视控件。
StdCtrls,ShellApi;
type TDragMemo = class(TMemo)
procedure DragFileProc(var Msg:TMessage);message WM_DROPFILES;
end; TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;implementation{$R *.dfm}procedure TForm1.FormCreate(Sender: TObject);
var
Memo:TDragMemo;
begin
Memo:= TDragMemo.Create(nil);
memo.Parent:=self;
end;procedure TDragMemo.DragFileProc(var Msg:TMessage);
begin
//your code
end;end.
但这样的话,如果要直接放在界面上,就要做成控件了。我想让 edit,panel, listview....等一些控件都支持explorer的拖拽,这样写感觉有点....还有其他方法吗?