Wenn Sie sich bereits mit dem OLE-Drag&Drop-Mechanismus
beschäftigt haben, werden Sie sich vielleicht gefragt haben, wie
Sie nicht nur Text-Strings, Picture-Objekte oder Dateinamen bzw.
-Listen, sondern vielleicht komplette Objekte über das die Daten
transportierende Data-Objekt verschicken können.
In der Visual Basic-Dokumentation steht dazu, dass auch andere
Werte anstelle der vorgegebenen Clipboard-Format-Konstanten als
Format gesetzt werden können. Dann können die zu transportierenden
Daten allerdings nur als Byte-Array an die Methode SetData des
Data-Objekts übergeben, und umgekehrt auch wieder nur als
Byte-Array ausgelesen werden. Sie brauchen Ihre Objekte also nur
irgendwie in ein Byte-Array zu packen.
Irgendwie? Ja, wie denn? Das ist gar nicht so schwierig: Seit
Visual Basic 6 können Sie selber Instanzen eines
PropertyBag-Objekts anlegen und serialisierbare Objekte direkt als
Daten-Packet dort hineinschreiben. Die Contents-Eigenschaft des
PropertyBag-Objekts liefert Ihnen dann den Inhalt als Byte-Array
(siehe auch "Bilder
zu Bytes"). Dieses Byte-Array können Sie nun der
SetData-Methode des Data-Objekts mit der Angabe Ihres eigenen
Formats übergeben.
Private Sub Quelle_OLEStartDrag(Data As DataObject, ...)
' ...
With New PropertyBag
.WriteProperty "MeinObjekt", MyObject
Data.SetData .Contents, constMeinFormat
End With
' ...
End Sub
Wenn das Ziel Ihr Format kennt, kann es selbst wieder ein leeres
PropertyBag-Objekt instanzieren und die über die GetData-Methode
mit Angabe des Formats das Byte-Array aus dem Data-Objekt wieder
hervorholen und der Contents-Eigenschaft des neuen
PropertyBag-Objekts zuweisen. Dann kann es unter der Angabe des
Schlüssels, den es natürlich ebenfalls kennen muss, das
transportierte Objekt aus dem PropertyBag-Objekt auslesen.
Private Sub Ziel_OLEDragDrop(Data As DataObject, ...)
' ...
If Data.GetFormat(constMeinFormat) Then
With New PropertyBag
.Contents = Data.GetData(constMeinFormat)
Set MyObject = .ReadProperty("MeinObjekt")
End With
End If
' ...
End Sub
Voraussetzung ist natürlich, dass sich das Objekt selbst
serialisieren kann (etwa wie das Picture- und das Font-Objekt das
können). Seit Visual Basic 6 setzen Sie dazu bei
öffentlichen Klassen in einem ActiveX-Objekt die Eigenschaft
Persistable auf "1 - Persistable". Dann
erhalten Sie für diese Klasse u.a. die zusätzlichen
Ereignisse Class_ReadProperties und Class_WriteProperties, in denen
Sie, ähnlich wie in einem UserControl, die internen Daten Ihrer
Klasse in ein PropertyBag-Objekt hineinschreiben und daraus wieder
herauslesen können.
Dieses den Ereignissen übergebene PropertyBag-Objekt ist jedoch
nicht das oben erwähnte! Es wird vielmehr von Visual Basic im
Hintergrund angelegt und dient nur zur Umsetzung des eingebauten
Serialisierungs-Mechanismus von Klassen. Allerdings steckt das
gleiche Prinzip dahinter - in das von Ihnen instanzierte
PropertyBag-Objekt wird nämlich wiederum nichts anderes als der
Byte-Array-Inhalt des hier den Ereignissen übergebenen
PropertyBag-Objekts hineingeschrieben und wieder ausgelesen.
Über das von Ihnen instanzierte PropertyBag-Objekt können Sie
natürlich auch beliebige Daten in nahezu beliebiger Menge und
Vielfalt an das Data-Objekt übergeben. Das können etwa mehrere
Objekte auf einmal oder sogar komplexe Collection- oder
Array-Strukturen sein (siehe "Verschachtelte
Schachteln").
Das Beispiel-Projekt OLEDragObjectTest, das Sie zu diesem Artikel
herunterladen können, zeigt Ihnen, wie das insgesamt und konkret
realisiert werden kann.
|