4
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Delphiのコンポーネントから外部アプリへドラッグ&ドロップする方法(ソース公開)

Last updated at Posted at 2025-05-30

はじめに

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解放も安全
複数形式同時送信 TDragTextText + HTML 対応
Explorer互換性 TDragShellFile は完全対応(ファイルドロップ)

配布場所

ライセンス表記

このソースの利用にライセンス表記は不要です。
あればうれしいだけ
ソースの改変や再配布も可能です。
「私が作りました」と勝手に名乗るのだけはお止めください。


おわりに

情報の少ないこの分野において、少しでも参考になれば幸いです。
たかがドラッグアンドドロップ操作と思いますが制作に1年近くかかっています。
改良案やフィードバックがあればぜひコメントください。

4
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?