はじめに
DelphiのVCL環境では、標準機能によりフォーム内コンポーネント間のドラッグ&ドロップは可能です。しかし、Chromeやエクスプローラーなど、Delphi以外のアプリケーションへのD&Dには非対応であり、ドキュメントや実装例もほとんど存在しません。
Delphi環境において、外部アプリケーションへの ドラッグ&ドロップ(D&D)操作 を実装するには、IDataObject
を介した COM 実装が必要です。
しかし、これを自力で記述するのは非常に煩雑です。
本記事では、Delphiで簡単に D&D を実現できる 2つのユーティリティクラス:
-
TDragShellFile
(ファイルのD&D) -
TDragText
(テキスト/HTMLのD&D)
について紹介します。
主な特徴
- VCLアプリケーションに対応
- TListBox、TListView、TMemoなど様々なコンポーネントに対応
- クラスを生成してアタッチするだけで簡単に利用可能
🗂 TDragShellFile - ファイルを外部にドラッグする
✅ 機能概要
TDragShellFile
は複数のファイルを仮想的に IDataObject
に変換し、外部アプリ(Explorer、エディタなど)に向けてドロップ可能にするクラスです。
📦 使用例
uses DragShellFile;
procedure TForm1.DoDragFiles;
var
Files: TStringList;
DataObj: IDataObject;
begin
Files := TStringList.Create;
try
Files.Add('C:\Users\User\Pictures\image1.png');
Files.Add('C:\Users\User\Pictures\image2.jpg');
DataObj := TDragShellFile.CreateFromFiles(Files);
DoDragDrop(Handle, DataObj, DROPEFFECT_COPY, nil);
finally
Files.Free;
end;
end;
🔍 内部処理
CFSTR_FILEDESCRIPTORW
CFSTR_FILECONTENTS
CF_HDROP
を自動構築。ストリーム不要で、実ファイルベースの安全なドラッグに対応。
🛑 注意:D&D先が実ファイルを要求するため、指定するパスは存在するファイルである必要があります。存在しないパスを指定すると受け取り側で無視される場合があります。
📝 TDragText - テキストやHTMLを外部にドラッグ
✅ 機能概要
TDragText
は、プレーンテキストとHTMLテキストを外部アプリ(例:ブラウザ、テキストエディタ)に向けてD&Dするための簡易クラスです。
📦 使用例
uses DragText;
procedure TForm1.DoDragText;
var
DataObj: IDataObject;
begin
DataObj := TDragText.Create(
'これはプレーンテキストです',
'<p>これは<b>HTML</b>形式のテキストです</p>'
);
DoDragDrop(Handle, DataObj, DROPEFFECT_COPY, nil);
end;
🧩 補足
- 内部で
CF_UNICODETEXT
,text/html
をサポート - HTMLは自動で
<html><body>...</body></html>
にラップされます(簡易整形)
🛠 共通仕様と補足
機能 | 内容 |
---|---|
IDataObject 実装 |
両クラスともOLE標準形式で対応済 |
メモリ安全性 | Delphi側で管理、COM解放も安全 |
複数形式同時送信 |
TDragText で Text + HTML 対応 |
Explorer互換性 |
TDragShellFile は完全対応(ファイルドロップ) |
配布場所
ライセンス表記
このソースの利用にライセンス表記は不要です。
あればうれしいだけ
ソースの改変や再配布も可能です。
「私が作りました」と勝手に名乗るのだけはお止めください。
おわりに
情報の少ないこの分野において、少しでも参考になれば幸いです。
たかがドラッグアンドドロップ操作と思いますが制作に1年近くかかっています。
改良案やフィードバックがあればぜひコメントください。