ABOUT Visual Basic Programmieren Programmierung Download Downloads Tips & Tricks Tipps & Tricks Know-How Praxis VB VBA Visual Basic for Applications VBS VBScript Scripting Windows ActiveX COM OLE API ComputerPC Microsoft Office Microsoft Office 97 Office 2000 Access Word Winword Excel Outlook Addins ASP Active Server Pages COMAddIns ActiveX-Controls OCX UserControl UserDocument Komponenten DLL EXE
Diese Seite wurde zuletzt aktualisiert am 09.01.2000

Diese Seite wurde zuletzt aktualisiert am 09.01.2000
Aktuell im ABOUT Visual Basic-MagazinGrundlagenwissen und TechnologienKnow How, Tipps und Tricks rund um Visual BasicActiveX-Komponenten, Controls, Klassen und mehr...AddIns für die Visual Basic-IDE und die VBA-IDEVBA-Programmierung in MS-Office und anderen AnwendungenScripting-Praxis für den Windows Scripting Host und das Scripting-ControlTools, Komponenten und Dienstleistungen des MarktesRessourcen für Programmierer (Bücher, Job-Börse)Dies&Das...

Themen und Stichwörter im ABOUT Visual Basic-Magazin
Code, Beispiele, Komponenten, Tools im Überblick, Shareware, Freeware
Ihre Service-Seite, Termine, Job-Börse
Melden Sie sich an, um in den vollen Genuss des ABOUT Visual Basic-Magazins zu kommen!
Informationen zum ABOUT Visual Basic-Magazin, Kontakt und Impressum

Zurück...

Zurück...


Anzeige

(-hg) mailto:hg_oleddbug@aboutvb.de

Der Parameter Button liefert beim MSDN Library - VB OLEDragDropOLEDragDrop-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" MSDN Library - VB DragDropDragDrop-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 MSDN Library - VB OLEDragOverOLEDragOver 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


Gedrückte Maustaste auch beim OLEDragDrop-Ereignis auswerten

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.


Beispiel-Projekt OLEDragDropBug (oleddbug.zip - ca. 1,6 KB)






Themen - Allgemeines
Themen - Entwicklungsumgebung (VB-IDE)
Themen - Forms
Themen - Steuerelemente (Controls)
Themen - Grafik
Themen - Dateien
Themen - UserControls
Themen - Einsteiger-Tipps
Themen - Wussten Sie...?

Übersicht nach Titeln in alphabetischer Reihenfolge
Übersicht nach Erscheinungsdatum

Schnellsuche



Zum Seitenanfang

Copyright © 1999 - 2017 Harald M. Genauck, ip-pro gmbh  /  Impressum

Zum Seitenanfang

Zurück...

Zurück...

Download Internet Explorer