AsuYuHomepage
トップページ サイトの説明 子供の成長記録 JM BAR Delphi リンク集
Home>>プログラミング>>Tips&Tricks>>VCLコントロール間のドラッグ&ドロップ
Delphi Tips
Delphi Win32API
ダウンロード

Delphi Tips & Tricks

VCLコントロール間のドラッグ&ドロップ

 Windowsは様々なところでドラッグ&ドロップをサポートしており、アプリケーションを視覚的に操作できるようになっています。Delphiのコンポーネントは、アプリケーション設計者がこのドラッグ&ドロップを簡単に操作できるように実装されています。

 このサンプルでは自アプリのコントロール間のドラッグ&ドロップという初歩的な使い方を紹介します。
procedure TForm1.FormCreate(Sender: TObject);
begin
  //本来は設計時に設定してください
  Listbox1.DragMode :=dmAutomatic;
end;

procedure TForm1.Edit1DragOver(Sender, Source: TObject; X, Y: Integer;
  State: TDragState; var Accept: Boolean);
begin
  //ドラッグ元がTListboxで項目が選択されている場合のみ受入れ可に
  Accept :=(Source is TListbox) and
           (Listbox1.ItemIndex <> -1);
end;

procedure TForm1.Edit1DragDrop(Sender, Source: TObject; X, Y: Integer);
begin
  //ListBox1の選択文字列ををEdit1にコピー
  Edit1.Text :=(Source as TListBox).Items[Listbox1.ItemIndex];
end;

このサンプルでは、TListBoxからTEditへドラッグ&ドロップして、Listboxでで選択されている項目をTEditへコピーします。
まず設計時にドラッグを始めるコントロール(今回はListbox1)の、DragModeプロパティを dmAutoMatic にしておきます。受け入れ側のコントロールではOnDragOverとOnDragDropの2つのイベントハンドラに処理を書きます。

OnDragOverイベントではイベントの引数である Sourceパラメータと Acceptパラメータを使ってドラッグを受け入れるかどうかを、VCLに知らせます。「Accept :=true」で受入れ可になりますが、ドラッグもとのコントロールの種類を指定する場合などは、サンプルのようにSourceパラメータの型を is演算子 を使ってチェックするなどして条件を指定します。
OnDragDropイベントでは、コントロールにドロップされたときに発生し、ドロップ時の処理を書きます。引数のSourceパラメータは、ドラッグもとのコントロールSenderパラメータははこのイベントを起こした(ドロップされた)コントロールの参照が入っています。サンプルコードのように、Sourceパラメータを as演算子で型キャストすることで、そのプロパティ等が参照できます。