|
Die Phalanx der OLE-Drag&Drop-Ereignisse ist auf den ersten Blick sicher ziemlich verwirrend. Doch wenn Sie das Geschehen erst einmal verstanden haben, können Sie die Technik in Ihren Anwendungen vielfältig nutzen und dem Anwender das aus vielen professionellen Anwendungen gewohnte Feeling beim Ziehen und Ablegen von Daten bieten.
Im einfachsten Fall fügen Sie die zu kopierenden oder verschiebenden Daten gleich im OLEStartDrag-Ereignis in das übergebene Data-Objekt ein. Wollen Sie allerdings mehrere Formate unterstützen - zu diesem Zeitpunkt steht das vom Ziel gewünschte Datenformat ja noch nicht fest -, oder ist die Datenmenge so umfangreich, dass es sinnvoller ist, diese nur einzufügen, wenn tatsächlich ein Ziel gefunden wurde, das die Daten anfordert, können sie die Daten auch an anderer Stelle einfügen. Dazu wird das OLESetData-Ereignis zur Verfügung gestellt.
Allerdings wird das OLESetData-Ereignis im Laufe der Zieh-Operation mehrfach ausgelöst, so dass es gar nicht so einfach ist, den tatsächlich idealen Zeitpunkt zum Einfügen der Daten ins Data-Objekt zu erwischen. Doch wenn Sie sich einmal die Ereignisfolge näher ansehen (dazu am besten einfach Debug.Print-Anweisungen zur Ausgabe des Ereignisnamens in die Ereignisprozeduren von OLEGiveFeedback, OLESetData und OLECompleteDrag einfügen), werden Sie doch eine gewisse Regelmäßigkeit feststellen.
Werden beispielsweise Dateien in ein Explorer-Fenster, auf den Desktop oder in ein anderes Ziel, das Explorer(-Shell)-Funktionalität bietet, kopiert oder verschoben, wird das OLESetData zwar zwischendurch mehrmals ausgelöst - aber doch nur einmal oder zweimal direkt hintereinander. Dazwischen wird viel häufiger das OLEGiveFeedback-Ereignis ausgelöst. Doch unmittelbar vor dem abschließenden OLECompleteDrag-Ereignis wird eine regelrechte Salve von OLESetData-Ereignissen gefeuert - ein halbes Dutzend mal oder mehr.
Eine typische Ereignisfolge könnte etwa wie folgt aussehen (die OLEDragOver-Ereignisse sind nicht angeführt, da sie in diesem Zusammenhang nicht relevant sind):
OLEStartDrag
OLEGiveFeedback
OLESetData
OLEGiveFeedback
OLEGiveFeedback
...
OLEGiveFeedback
OLEGiveFeedback
OLESetData
OLEGiveFeedback
OLEGiveFeedback
...
OLEGiveFeedback
OLEGiveFeedback
OLESetData
OLESetData
OLESetData
OLESetData
OLESetData
OLESetData
OLECompleteDrag
Nun brauchen Sie nur noch die OLESetData-Ereignisse in einer modulweiten Hilfsvariablen mitzuzählen, und diese Hilfsvariable in jedem OLEGiveFeedback auf 0 zurück zu setzen. Im OLESetData-Ereignis prüfen Sie nun, ob eine gewisse Mindestanzahl Auslösungen stattgefunden hat - damit haben Sie den passenden Zeitpunkt zur Übergabe Ihrer Dateiliste an das Data-Objekt gefunden. Und für den Fall, dass das OLESetData-Ereignis danach nochmals ausgelöst werden sollte, setzen Sie nach der Übergabe der Daten den Zähler wieder auf 0 zurück.
Das folgende kurze Beispiel zeigt, wie dies bei einem Ziehvorgang aus einem Form heraus aussehen könnte:
Private mSetDataCount As Integer
Private Sub Form_MouseDown(Button As Integer, Shift As Integer, _
X As Single, Y As Single)
Me.OLEDrag
End Sub
Private Sub Form_OLEGiveFeedback(Effect As Long, _
DefaultCursors As Boolean)
mSetDataCount = 0
End Sub
Private Sub Form_OLESetData(Data As DataObject, _
DataFormat As Integer)
mSetDataCount = mSetDataCount + 1
If mSetDataCount >= 5 Then
'Data.Files.Add ...
mSetDataCount = 0
End If
End Sub
Private Sub Form_OLEStartDrag(Data As DataObject, _
AllowedEffects As Long)
Data.SetData , vbCFFiles
AllowedEffects = vbDropEffectCopy
mSetDataCount = 0
End Sub
|