エクスプローラからファイルをドラッグ&ドロップする
|
一度はやってみたいんですよね。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を忘れないように。 |
|