Delphi

Delphiでドラッグ&ドロップを受け付ける方法

More than 1 year has passed since last update.

テスト投稿を兼ねて。

1.usesの追加

uses
  ShellAPI, ActnList;

2.FormCreateなどで受け付け

procedure Sample.FormCreate(Sender: TObject);
begin
  DragAcceptFiles(Handle, true);
end;

3.ドラッグ&ドロップ用メソッドの実装

procedure Sample.WMDropFiles(var msg: TWMDROPFILES);
var
  DropCount: Integer;
  DropFile: Integer;
  pFileName: PChar;
begin
  try
    DropCount := DragQueryFile(msg.Drop, $ffffffff, nil, 0);
    if DropCount  <> 1 then begin
      MessageDlg('ファイルは1つずつドラッグしてください。', mtWarning, [mbOk], 0);
      end;
    end;
    //ドロップされたファイル名のサイズを取得
    DropFile:= DragQueryFile(msg.Drop, 0, nil, 0) + 1;
    //pFilenameに上で得たサイズ分のメモリを確保
    pFileName := AllocMem(DropFile);
    try
      //pFilenameにファイル名を取得
      DragQueryFile(msg.Drop, 0, pFilename, DropFile);
      //後はファイル名を使って読み込むなりなんなり
      LoadCSV(pFileName);
    finally
      //メモリ開放
      FreeMem(pFilename);
    end;
  finally
    //処理の終了をOSに通知
    DragFinish(msg.Drop);
  end;
end;

上記はファイルを1つだけドラッグ&ドロップする場合だが、

for idx := 0 to DropCount-1 do begin
  DropFile:= DragQueryFile(msg.Drop, idx, nil, 0) + 1;
  DragQueryFile(msg.Drop, idx, pFilename, DropFile);
end;

とすれば複数ファイルも受け付けられる。