エクスプローラーからドラッグ&ドロップに応答(FMX) ~Delphiソースコード集
(FMX)エクスプローラーからファイルやフォルダをフォームやコントロールにドラッグ&ドロップした時のファイル名を取得する
プロジェクトとフォームの作成
Delphi IDEを起動し、「ファイル」⇒「新規作成」⇒「マルチデバイス アプリケーション -Delphi」をクリックします「空のアプリケーション」を選択して「OK」ボタンを押します。
ソースコードの記述
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.