項目のドロップ
コントロールの利用:インデックス への移動
ドラッグした項目を受け入れることを意思表示したコントロールは,ドロップした項目を処理する必要があります。ドロップした項目を処理するには,ドロップを受け入れるコントロールの OnDragDrop イベントに対応するイベントハンドラを定義します。ドラッグオーバーイベントと同様に,ドラッグアンドドロップイベントは,受け入れるコントロール上のマウスカーソルの座標と,ドラッグした項目のソースを通知します。マウスポインタの座標を示すパラメータにより,ドラッグ中に項目がとる経路を監視できます。このような仕様になっているので,たとえば,項目がドロップされた場合にコンポーネントの色を変更できます。
次の VCL 例では,ファイルリストボックスからドラッグした項目をディレクトリツリービューが受け入れ,ドロップ先のディレクトリにファイルを移動するという応答をしています。
procedure TFMForm.DirectoryOutline1DragDrop(Sender, Source: TObject; X,
Y: Integer);
begin
if Source is TFileListBox then
with DirectoryOutline1 do
ConfirmChange('Move', FileListBox1.FileName, Items[GetItem(X, Y)].FullPath);
end;
void __fastcall TForm1::TreeView1DragDrop(TObject *Sender, TObject *Source)
if (Source->InheritsFrom(__classid(TFileListBox)))
{
TTreeNode *pNode = TreeView1->GetNodeAt(X,Y); // pNode はドロップターゲット
AnsiString NewFile = pNode->Text + AnsiString("//") +
ExtractFileName(FileListBox1->FileName); // ドロップターゲットのファイル名の作成
MoveFileEx(FileListBox1->FileName.c_str(), NewFile.c_str(),
MOVEFILE_REPLACE_EXISTING | MOVEFILE_COPY_ALLOWED); // ファイルを移動
}
}