Help us understand the problem. What is going on with this article?

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

More than 5 years have 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;

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

sakuramochi702
暇なエンジニアです。
http://sakuramochi702.hatenablog.com/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away