Im Gegensatz zu seinem Drag&Drop-Urahn in Visual Basic ist
die OLE-Drag&Drop-Technik als modernere, aber um einiges
komplizierte Variante hervorragend für den Datenaustausch zwischen
verschiedenen Anwendungen geeignet (siehe auch: "OLE-gedroppte
Dateien"). Beliebige Daten oder Dateilisten, und
selbst Objekte und Objektstrukturen, lassen sich über das als
"Kofferraum" dienende Data-Objekt hin und her
transportieren - das ist ein weiterer Fortschritt gegenüber dem
Urahn. Dieser Fortschritt scheint jedoch auch seinen Preis zu haben:
Die paar Datenformate, die das OLE-Drag&Drop in VB zu kennen
scheint, kennen auch viele andere Anwendungen. Vor allem dann, wenn
Datenpäckchen im reinen Textformat (vbCFText) über oder gar auf
die OLE-Drag&Drop-sensibilisierten Steuerelemente Ihrer
Anwendung gezogen werden, können Sie in Ihrer Anwendung
offensichtlich kaum die Herkunft und die tatsächliche
Erwünschtheit der Daten kontrollieren.
Sie merken es schon: Ich rede wieder einmal von
"scheint", "offensichtlich" und dergleichen. Und
Sie ahnen auch ganz richtig: Es gibt Möglichkeiten, die OLE-Drag&Drop-Kommunikation
ganz privat und abgeschottet innerhalb einer Anwendung oder
zumindest zwischen "befreundeten" Anwendungen zu nutzen.
Ihre Anwendung und deren Freundeskreis brauchen sich dazu lediglich
einer "Geheimsprache" bedienen - nämlich sowohl eigener
Datenformate als auch eigener Kennungen für die
DropEffect-Meldungen in den beteiligten OLDDrag-Ereignissen.
Dass Sie eigene Datenformate verwenden können, ist Ihnen
vielleicht schon bekannt. Schließlich weist die VB-Hilfe selbst
darauf hin, jedoch etwas kryptisch und recht wenig erhellend (Den
Einsatz eines eigenen Datenformats habe ich Ihnen auch schon
beiläufig im Artikel "OLE-Drag&Drop
mit Objekten" vorgeführt). Bei den
DropEffect-Kennungen klingt der Tonfall der VB-Hilfe allerdings
erheblich rigoroser, wenn da fest und ohne wenn und aber behauptet
wird, man müsse eine der vorgegebenen Konstanten verwenden.
Falls Sie bereits ein wenig Erfahrung mit OLE-Drag&Drop
haben, sei es aus der praktischen Nutzung oder aus Experimenten,
werden Sie sicher schon festgestellt haben, dass als Effect-Werte
hin und wieder ungewöhnliche Werte bzw. Konstanten-Kombinationen
mit unbekannten Bitmuster-Anteilen eingeschleust werden. So kennt
auf der einen Seite etwa der Explorer (alias Desktop, alias Shell)
eine Kennung, die anzeigt, dass neben dem Kopieren und Verschieben
auch das Anlegen einer Verknüpfung mit einer im Data-Objekt
mitgelieferten Datei möglich sein könnte. Auf der anderen Seite
scheint es wohl kaum eine konkrete Verwendung für die dennoch im
VB-Objekt-Katalog ausdrücklich angeführte Effect-Kennung
vbDropEffectScroll zu geben.
Das Prinzip der "Geheimsprache" für ein privates
OLE-Drag&Drop-Vergnügen ist also eigentlich ganz einfach. Sie
definieren Ihre eigenen Kennungen für Datenformate und Drop-Effekte
- und schon haben Sie Ruhe vor der Klinkenputzerei anderer
Anwendungen. Allerdings ist das nicht ganz dasselbe wie ein
"Bitte nicht stören"-Anhänger an der Klinke einer
Hotel-Zimmertür. Denn die OLEDrag-Ereignisse werden nach wie vor
ausgelöst, wenn fremde Datenpäckchen über Ihre Anwendung
hinwegfegen oder um Aufnahme bitten. Die Kennungen sorgen lediglich
dafür, dass nur die Daten Einlass finden und berücksichtigt
werden, die die richtige Parole kennen.
Die folgenden Implementierungsbeispiele der OLEDrag-Ereignisse
zeigen Ihnen die "richtigen" Stellen, an denen Sie die
Parolen ausgeben und abfragen sollten. Zugleich zeige ich Ihnen hier
auch, wie Sie eigene Mauszeiger ins Spiel bringen und wie Sie diese
im gleichen Sinne voll privatisieren können.
Private Sub MyControl_MouseDown(Button As Integer, _
Shift As Integer, x As Single, y As Single)
Set Screen.MouseIcon = MyIcon
End Sub
Private Sub MyControl_MouseUp(Button As Integer, _
Shift As Integer, x As Single, y As Single)
With Screen
.MousePointer = vbDefault
Set .MouseIcon = Nothing
End With
End Sub
Private Sub MyControl_OLECompleteDrag(Effect As Long)
With Screen
.MousePointer = vbDefault
Set .MouseIcon = Nothing
End With
If Effect = &H800000 Then
'...
End If
End Sub
Private Sub MyControl_OLEDragDrop(Data As DataObject, _
Effect As Long, Button As Integer, Shift As Integer, _
x As Single, y As Single)
MyData As Variant
If Data.GetFormat(9999) Then
'...
'z.B.:
MyData = Data.GetData(9999)
End If
End Sub
Private Sub MyControl_OLEDragOver(Data As DataObject, _
Effect As Long, Button As Integer, Shift As Integer, _
x As Single, y As Single, State As Integer)
If Data.GetFormat(9999) Then
Effect = &H800000
Else
Effect = vbDropEffectNone
End If
End Sub
Private Sub MyControl_OLEGiveFeedback(Effect As Long, _
DefaultCursors As Boolean)
If Effect = &H800000 Then
Screen.MousePointer = vbCustom
DefaultCursors = False
Else
DefaultCursors = True
End If
End Sub
Private Sub MyControl_OLESetData(Data As DataObject, _
DataFormat As Integer)
If DataFormat = 9999 Then
'...
End If
End Sub
Private Sub MyControl_OLEStartDrag( _
Data As MSComctlLib.DataObject, AllowedEffects As Long)
Data.SetData , 9999
AllowedEffects = &H800000
End Sub
|