Delphi Tips 
-----------------------------

0218  D1   D2   D3   D4   D5   D6   D7   3.1   95   98    作成: 1999/08/26 西坂良幸 rev 1.2
   B1   B3   B4   B5   B6   B7   NT3   NT4   2K   XP  更新: 1999/09/27 西坂良幸 編集
エクスプローラからファイルをドラッグ&ドロップする

一度はやってみたいんですよね。MLでも多いスレッドです。
「Delphi2.0Q&A120選」(大野元久著)にもあります。

WM_DropFilesメッセージを捕まえて、DragQueryFile関数で処理するわけですが、受け取る側のスタイルを準備しなければなりません。
これは、一般的なフォームのOnCreateイベントで
DragAcceptFiles(Handle,True);
を使うよりも、CreateParamsをオーバーライドするのがベターだそうです。

// 定義部
 type
  TForm1 = class(TForm)
  ・・省略・・
  private
    procedure CreateParams(var Params: TCreateParams);override;
    procedure WMDropFiles(Var Msg: TWMDropFiles); Message WM_DropFiles;
  public
  end;

// 実装部
procedure TForm1.CreateParams(var Params: TCreateParams);
begin
  inherited CreateParams(Params);
  // 受け取れる準備をする
  Params.ExStyle := Params.EXStyle or WS_EX_ACCEPTFILES;
end;

// ファイル1個の場合−−メモに読み込ませる。
procedure TForm1.WMDropFiles(Var Msg: TWMDropFiles);
Var
  FileName: Array[0..MAX_PATH] of Char;
Begin
  Count := DragQueryFile(Msg.Drop, 0, FileName, SizeOf(FileName));
  Memo1.Lines.LoadFromFile(String(FileName));
  DragFinish(Msg.Drop);
End;

//今度は複数の場合−−リストボックスにファイル名
procedure TForm1.WMDropFiles(Var Msg: TWMDropFiles);
Var
  FileName: Array[0..MAX_PATH] of Char;
  i, Count: integer;
Begin
  ListBox1.Items.clear;
  // 第二パラメータを-1にするとドロップ数が取得できる
  Count := DragQueryFile(Msg.Drop, DWord(-1), FileName, SizeOf(FileName));
  for i := 0 to count - 1 do
  begin
    DragQueryFile(Msg.Drop, i, FileName, SizeOf(FileName));
    ListBox1.items.add(String(FileName));
  end;
  DragFinish(Msg.Drop);
End;

最後のDragFinishを忘れないように。
参照: [Delphi-ML:3137] [Delphi-ML:8536] [Delphi-ML:31274] <ShellApi> <Windows> <ファイル>

[新規作成] [最新の情報に更新]

How To
Lounge
KeyWords


Tips
Delphi
Home
Osamu Takeuchi osamu@big.or.jp