|
Der Parameter Button liefert beim OLEDragDrop-Ereignis
immer den Wert 0, egal welche Maustaste vor dem Zeitpunkt des
Ablegens gedrückt gewesen ist. Zunächst scheint dieses Verhalten
seltsam. Vielleicht werden auch Sie sich darüber gewundert und zu
einer ausgiebigen Fehlersuche aufgemacht haben. Denn beim
"einfachen" DragDrop-Ereignis
des "uralten" VB-Drag-Mechanismus sind wir es gewohnt,
dass wir in Button einen Wert für die beim Ziehen zuvor
niedergedrückte Maustaste erhalten.
Gemessen daran scheint das Ausbleiben des Maustasten-Wertes beim
OLEDragDrop-Ereignis unverständlich und ein dummer Bug zu
sein. Genau genommen konfrontiert uns jedoch der
OLE-Drag-Mechanismus bloß mit eiskalter Logik: Solange die
Maustaste noch niedergedrückt ist, kann noch niemand etwas von
einem Ende des Ziehvorgangs wissen. Das OLEDragDrop-Ereignis meldet
schlicht und ergreifend nichts anderes, als dass der Ziehvorgang
beendet worden ist - eben genau durch das Loslassen der Maustaste.
Eine losgelassene Maustaste aber ist gerade keine niedergedrückte
Maustaste. Und somit ist der in Button übergebene Wert 0 einfach
nur 100%ig korrekt - und für uns darum nutzlos. Von den
VB-Schöpfern ist das wahrscheinlich so gar nicht beabsichtigt
gewesen.
Hat der Anwender zusätzlich beim Ziehen die Umschalt-, Strg-
und/oder die Alt-Taste gedrückt, lässt er sie meist erst nach dem
Ablegen los - oder er lässt sie zu früh los: Der Shift-Parameter
ist gleichermaßen korrekt und übermittelt uns treuherzig und
wahrheitsgemäß den tatsächlichen Shift-Wert für den Zeitpunkt
des Loslassens der Maustaste.
Sie brauchen jedoch nicht gleich die Flinte ins Korn zu werfen,
falls Sie etwa in Erfahrung bringen wollen, ob vielleicht mit der
rechten Maustaste gezogen worden ist, um daraufhin zum Beispiel wie
im Windows-Explorer ein Kontextmenü zur näheren Spezifizierung des
Ziehvorgangs anzuzeigen, ehe die eigentliche Bearbeitung des
Ablegens erfolgt.
Alternativ liefert uns nämlich das Ereignis OLEDragOver
hingegen sehr wohl den korrekten Maustastenwert, ganz wie vom
VB-Drag her gewohnt. Den definitiv letzten Wert erhalten Sie
schließlich, der gleichen eiskalten Logik folgend, exakt für die
Bewegung zu dem in X und Y angegebenen Punkt, an dem das Ablegen
erfolgt, das mit dem darauf folgenden OLEDragDrop-Ereignis (mit den
gleichen Werten für Shift als auch für X und Y) gemeldet wird.
Die Lösung ist einfach und mit wenigen Code-Zeilen erledigt.
Halten Sie den Button-Wert im OLEDragOver-Ereignis in einer
modulweit (Form, UserControl, PropertyPage, UserDocument) gültigen
Variablen fest und werten Sie diese dann wie ursprünglich gedacht
im OLEDragDrop-Ereignis aus.
Private mDragButton As Integer
Private Sub Form_OLEDragOver(data As DataObject, Effect As Long, _
Button As Integer, Shift As Integer, X As Single, Y As Single, _
State As Integer)
mDragButton = Button
End Sub
Private Sub Form_OLEDragDrop(data As DataObject, Effect As Long, _
Button As Integer, Shift As Integer, X As Single, Y As Single)
Select Case mDragButton
Case vbLeftButton
MsgBox "Linke Maustaste"
Case vbMiddleButton
MsgBox "Mittlere Maustaste"
Case vbRightButton
MsgBox "Rechte Maustaste"
End Select
End Sub
 |
So erhalten Sie den fehlenden Button-Wert im
OLEDragDrop-Ereignis

|
Ziehen Sie ein Symbol mit niedergedrückter linker, mittlerer
oder rechter Maustaste von Ihrem Desktop auf das Beispiel-Form und
legen Sie es dort ab. Um den scheinbar möglichen Fall, dass
tatsächlich keine Maustaste niedergedrückt gewesen sein könnte,
brauchen Sie sich bei der Auswertung im OLEDragDrop-Ereignis
herzlich wenig zu kümmern. Ohne gedrückte Maustaste will nämlich
das Ziehen und Ablegen irgendwie nicht so recht klappen... Mit
mehreren zugleich gedrückten Maustasten übrigens auch nicht, wenn
Sie so Dateien oder Verknüpfungen zu ziehen versuchen sollten - da
spielt Windows nicht mit. Die zusätzliche Auswertung der
verschiedenen Button-Kombinationen können Sie sich also ebenfalls
getrost schenken.
|