ドラッグ操作の開始
コントロールの利用:インデックス への移動
どのコントロールにも DragMode プロパティがあります。DragMode は,ドラッグ操作の開始方法を決定するプロパティです。DragMode に dmAutomatic を設定すると,ユーザーがコントロールにポインタを置いてマウスボタンを押すと自動的にドラッグが始まります。しかし,dmAutomatic を設定すると通常のマウス動作を制御できなくなる可能性があるため,一般には DragMode に dmManual(デフォルト)を設定し,マウスボタンを押したことを示すイベントを処理することでドラッグを開始します。
コントロールのドラッグを(自動的にでなく)明示的に開始するには,そのコントロールの BeginDrag メソッドを呼び出します。BeginDrag は Immediate という論理パラメータを使用します。加えて,オプションとして Threshold という整数パラメータをとることもできます。Immediate を True で渡すと,すぐにドラッグが始まります。False を渡すと,Threshold で指定したピクセル数だけユーザーがマウスを動かすまで,ドラッグは開始しません。次のコードを呼び出すと,
BeginDrag (False);
false, -1
コントロールをクリックしただけではドラッグ操作は開始されません。
BeginDrag を呼び出す前に,マウスボタンが押されたことを示すイベントのパラメータをチェックし,ユーザーが押したボタンを調べてから,条件が合う場合にのみドラッグを開始することもできます。たとえば,次のコードは,マウスボタンが押されたことを示すファイルリストボックスのイベントに応答して,有効な項目の上で左ボタンが押された場合にのみ,ドラッグ操作を開始します。
procedure TFMForm.FileListBox1MouseDown(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
if Button = mbLeft then { 左ボタンが押されたときのみドラッグ }
with Sender as TFileListBox do { Sender を TFileListBox として扱う }
begin
if ItemAtPos(Point(X, Y), True) >= 0 then { 項目があるかどうかをチェック }
BeginDrag(False); { 項目がある場合はドラッグする }
end;
end;
void __fastcall TFMForm::FileListBox1MouseDown(TObject *Sender,
{
if (Button == mbLeft)
{
TFileListBox *pLB = dynamic_cast<TFileListBox *>(Sender); // TFileListBox にキャスト
if (pLB && pLB->ItemAtPos(Point(X,Y), true) >= 0) // 項目があるかどうかをチェック
pLB->BeginDrag(false, -1); // 項目がある場合はドラッグする
}
}