4

「標準」の VCL ドラッグ アンド ドロップ イベント OnDragOver および OnDragDrop を使用して、「コピー」操作と「移動」操作を区別するにはどうすればよいですか?

TDragType を使用できないようで、キーボードの Shift 状態がこれらのイベントに渡されません。

4

4 に答える 4

9

イベントはアプリケーションのニーズや機能について何も想定していないため、これはイベントから判断できるものではありません。

特定のドラッグ/ドロップを特定のセマンティクスを持つものとして解釈するのは、アプリケーション自体の責任です。OSは、アプリケーションがファイルのドロップにどのように反応するかを知ることができないため、ドラッグ操作がユーザーに何を意味するかについて推測することはできません。

多くのアプリケーションでは、コピー/移動の区別はなく、ドラッグアンドドロップするだけです。

コピー/移動の区別は、Windowsエクスプローラーがファイル操作に適用するものです。「バニラ」ドラッグアンドドロップの場合、元のドライブボリュームと宛先ドライブボリュームに基づいたルールが適用されます。ボリューム上のファイルのドラッグアンドドロップは、デフォルトでは移動操作です。ボリュームでのドラッグ/ドロップは、デフォルトではコピーです。

ただし、これらはアプリケーション(Windowsエクスプローラー)によって決定されるデフォルトのルールにすぎません。ユーザーは、ドラッグ中および(最も重要な)ドロップ時にキーボードショートカットを使用して、これらのデフォルトをオーバーライドできます。ただし、これらは、OSではなく特定のアプリケーション(つまり、Windowsエクスプローラー)によって定義および解釈されます。

したがって、アプリケーションがWindowsエクスプローラーからドラッグされる可能性のあるファイルのドロップターゲットであり、アプリケーションがコピーと移動を区別することが理にかなっている場合は、Windowsエクスプローラーがサポートするのと同じキーボード修飾子をサポートする必要があります。 。これらが変更可能であるとは思わないので(これを確認することをお勧めしますが)、ドラッグイベントでCtrlキーまたはShiftキーの状態をテストするだけで済みます。

Ctrl         = COPY
Shift        = MOVE
Ctrl + Shift = MAKE SHORTCUT  (if this is applicable to your application)

GetKeyState()を使用して、任意の時点で特定のキーの状態を直接問い合わせることができます。

さまざまな「デフォルト」の動作が必要な場合は、ソース情報に独自のテストを適用して、どのデフォルトが最も理にかなっているのかを判断するか(つまり、Windowsエクスプローラーの「ボリューム境界」のデフォルトルールを模倣する)、または単に最も適切なものを選択する必要があります。または、アプリケーションの直感的なデフォルトアクション。

于 2009-08-18T21:51:40.760 に答える
4

簡単に言えば、そうではありません。VCL に組み込まれているドラッグ アンド ドロップ システムは、この 2 つを区別しません。ただし、独自の TDragObject/Ex クラスを派生させて、実際にドラッグされるデータの種類を制御できます。

于 2009-08-18T20:57:00.853 に答える
4

アプリケーションと他の Windows アプリケーションの間でドラッグ アンド ドロップを使用する場合は、Anders Melander のDrag and Drop Component Suite for Delphi を参照してください。
最新のコードはこちらです。

于 2009-08-18T22:44:20.310 に答える
0

具体的には Delphi についてはわかりませんが、C# ではイベント パラメータの AllowedEffect プロパティを確認します。どちらも Win32 にリンクしているので、大きな違いがあるとは思えません。

http://msdn.microsoft.com/en-us/library/system.windows.forms.drageventargs.aspxに良い例があります。お役に立てれば!

于 2009-08-18T20:56:01.590 に答える