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; 能判断出是哪个组件返回的吗?

解决方案 »

  1.   

    能不能给TPanel增加接收 WM_DROPFILES 的方法呢。
    前提是不需要重新编译TPanel控件。编写一个继承类的话就不能放在界面上了。除非编成可视控件。
      

  2.   

    Uses 
        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.
      

  3.   

    以上只是定义一个类,你可以将它做成一个控件,直接继承WINDOWS控件然后修改DragFileProc就可以了。
      

  4.   

    woshihaoge(支离破碎) 说的方法我知道啊。
    但这样的话,如果要直接放在界面上,就要做成控件了。我想让 edit,panel, listview....等一些控件都支持explorer的拖拽,这样写感觉有点....还有其他方法吗?