Delphiメモ

No014:実行中にドラッグアンドドロップでファイルを開く

実行中のプログラムにファイルをドラッグアンドドロップしてファイルを開くという機能は多くのソフトで採用されている。
それを実現するにはDragAcceptFilesとDragQueryFile、DragFinishの3つのAPIが必要。
どちらもShellAPIユニットが必要だ。

procedure DragAcceptFiles(Wnd: HWND; Accept: BOOL);
function DragQueryFile(Drop: HDROP; FileIndex: UINT; FileName: PCHAR; cb: UINT): UINT;
procedure DragFinish(Drop: HDROP);

まず対象のFormのCreate時に以下のように記述する
(ここでは対象のFormをForm1と仮定する)

procedure TForm1.Create(Sender: TObject);
begin
  DragAcceptFiles(Form1.Handle,True);
end;

DragAcceptFilesの第1引数にはドラッグを受け付けるフォームのハンドルを指定する。
そして第2引数には受け付けるかどうかを指定する。
次にそのFormに以下のような手続きを追加する。

procedure DropFiles(var Msg: TWMDROPFILES); message WM_DROPFILES;

次に実現部で以下のように記述する。

procedure TForm1.DropFiles(var Msg: TWMDROPFILES);
var
  i, Count: Integer;
  FileName: array [0..255] of Char;
begin
  Count:= DragQueryFile(Msg.Drop, Cardinal(-1), nil, 0);
  for i:= 0 to Count - 1 do
  begin
    DragQueryFile(Msg.Drop, i, FileName, SizeOf(FileName)-1)
    {オープン処理の内容}
  end;
  DragFinish(Msg.Drop);
end;

解説すると、まず1行目でファイルの総数を取得する。
DragQueryFileの第2引数に-1を指定するとファイルの総数を返すためだ。
次のfor文でファイル名を取得している。
仮にドロップ数を1つしか許さないのであるならば、
ここはfor文にせずにDragQueryFileの第2引数に0を指定すればいい。
後はファイル名が取得できたので、オープン処理を記述すればいい。
ループを抜けたらDragFinishでメモリを解放する。
これを忘れるとメモリリークが発生するのでご注意。

トップに戻る

関連ページ