エクスプローラーからファイルをドラッグ&ドロップした時のファイル名を取得する(FMX) ~Delphiでお手軽プログラミング

エクスプローラーからファイルをドラッグ&ドロップした時のファイル名を取得する(FMX) ~Delphiでお手軽プログラミング

(FMX)エクスプローラーからファイルやフォルダをフォームやコントロールにドラッグ&ドロップした時のファイル名を取得する

プロジェクトとフォームの作成

Delphi IDEを起動し、「ファイル」⇒「新規作成」⇒「マルチデバイス アプリケーション -Delphi」をクリックします
「空のアプリケーション」を選択して「OK」ボタンを押します。
フォーム上にTListBox×1個をドラッグ&ドロップします。

ソースコードの記述

unit Unit1;

interface

uses
  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
  FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.Layouts,
  FMX.ListBox,
  FMX.Platform.Win, //FormToHWND関数が定義されている
  winapi.Windows,   //HWND型等が定義されている
  Winapi.ShellAPI,  //DragAcceptFiles関数が定義されている
  Winapi.Messages;  //WM_DROPFILESなどのメッセージが定義されている

type
  TForm1 = class(TForm)
    ListBox1: TListBox;
    procedure FormCreate(Sender: TObject);
  private
    { private 宣言 }
  public
    { public 宣言 }
  end;

  //置き換えるウィンドウプロシージャ
  function NewWndProc(hwnd:HWND;uMsg:UINT;wParam:WPARAM;lParam:LPARAM):LRESULT;stdcall;

var
  Form1: TForm1;
  OldWndProc:NativeInt;//元々のウィンドウプロシージャを保存する変数
  wHandle:HWND;        //自分自身のウィンドウハンドル保存用

implementation

{$R *.fmx}

//置き換えるウィンドウプロシージャ
function NewWndProc(hwnd: HWND; uMsg: UINT; wParam: WPARAM;
  lParam: LPARAM): LRESULT;
var DropCount:Cardinal;
    i:Integer;
    FileName:array[0..4096] of Char;
begin
  //Form1にファイルやフォルダがドロップされた場合
  if uMsg=WM_DROPFILES then
  begin
    try
      //ドロップされたファイル、フォルダ数を取得
      DropCount := DragQueryFile(wParam, Cardinal(-1), nil, 0);
      for i := 0 to DropCount-1 do
      begin
        DragQueryFile(wParam, i, FileName, Length(FileName));
        // ドロップされたファイル、フォルダをListBox1に表示する
        Form1.ListBox1.Items.Add(FileName);
        //Form1.Memo1.Lines.Add(FileName);
      end;
    finally
      DragFinish(wParam);
    end;
  end;
  //元のウィンドウプロシージャを呼ぶ
  Result:=CallWindowProc(Pointer(oldWndProc),WHandle,uMsg,wParam,LParam);
end;


procedure TForm1.FormCreate(Sender: TObject);
begin
  //以下で自分自身のウィンドウハンドルを取得できる
  wHandle := FormToHWND(self);
  //以下でも自分自身のウィンドウハンドルを取得できる
  //wHandle := WindowHandleToPlatform(self.Handle).Wnd;

  //Window Procedureの置き換え
  oldWndProc:=SetWindowLong(WHandle,GWL_WNDPROC,NativeInt(@NewWndProc));

  //Form1でファイルのドロップ処理を受け付ける場合
  DragAcceptFiles(wHandle, True);
end;

end.

実行する

フォーム(ウィンドウ)にファイルやフォルダをドラッグ&ドロップすると、ListBox1にドロップしたファイルやフォルダが表示されます