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; 能判断出是哪个组件返回的吗?
解决方案 »
- 问下大家如何将QuickReport报表导出成Excel文件?为何我的d6中的quickreport没有TQRExcelFilter?
- 如何判断一个元素是否存在于动态数组中
- report问题
- 请问谁有真正的图片的翻页效果???或者水波效果~~~对处理图片有经验的进来~~!!
- 高手请看:为什么我的dspack连dat播放都出错?
- 如何改变DBGrid的滚动条的颜色
- 各位大虾,你们好!我的简单问题!来者有分!
- 今天仔细研究FlashGet,发现它好象是有自己的数据库驱动!各位大侠发表一下看法!
- 有关类的问题(请高手近来看看)
- 如何用Excell表作ODBC数据源?
- 请高手 调试一个 小问题 不胜感激
- 在软件安装程序中如何设置ODBC,并使它连接Delphi自带的DBASE数据库?
前提是不需要重新编译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的拖拽,这样写感觉有点....还有其他方法吗?