2

multiselect と ExtendedSelect の両方が true に設定された TListBox があります。リスト ボックス内の複数の項目をドラッグして再配置できるようにする必要があります。私の問題は、ユーザーが CTRL または SHIFT キーを押さずに既に選択されている項目をクリックするとどうなるかです。

ケース 1: DragMode が dmManual に設定されている場合 マウスが押される前に選択がクリアされます。これにより、複数のアイテムをドラッグできなくなります。

ケース 2: DragMode が dmAutomatic に設定されている場合 MouseDown イベントは発生しません。選択はクリアされないのでドラッグは問題ありませんが、ユーザーは選択された項目の 1 つをクリックして選択をクリアすることはできません。これは、すべてのアイテムが選択されている場合、またはユーザーが選択したい次のアイテムが現在の選択の一部である場合に、実際に問題を引き起こします。

この問題は、OnStartDrag プロシージャで DragObject に何かを割り当てた場合にのみ発生することに注意してください。ユーザーがマウスを動かした後にのみ OnStartDrag が開始されれば、問題は解決すると思います。Mouse.DragImmediate := false が設定されていますが、リスト ボックス内の項目をクリックするとすぐに StartDrag が起動されます。

このプロジェクトでは Delphi 7 を使用していますが、Delphi 2007 でも同じ動作が見られます。

4

4 に答える 4

0

これが違いを生む理由はわかりませんが、DragObjectを(TDragObjectExではなく) TDrag Control ObjectExに変更すると、探している動作が得られます。ドラッグモードは自動に設定されています。

これが何に影響しているのかを調べてみましたが、理解できませんでした。

于 2008-10-21T15:20:35.983 に答える
0

私はしばらくこれで遊んできました。そして、同じ効果を観察します。

Case2 を使用して、(すべて選択/すべて選択解除) ボタンをリストに追加します。さらに機能を追加し、問題の最も厄介な部分を解決します。

于 2008-10-11T19:10:07.880 に答える
0

ケース 2 を使用し、TListBox.OnMouseUp イベントが発生したときに、複数の項目が選択されてドラッグされたかどうかを確認します。複数のアイテムが選択されているが、ドラッグされていない場合は、クリックされたアイテム以外のすべてのアイテムの選択を解除します。

Windows エクスプローラーはこのように動作するため、この方法を使用します。

于 2008-12-28T00:55:44.820 に答える