Im Artikel Drag Drop Teil 1 wurde das Drag & Drop-Modell von Windows vorgestellt. Es wurden auch die vom DragData-Objekt unterstützten Formate erklärt. Der heutige Artikel stellt das DragData-Objekt in den Mittelpunkt.
Wie bereits im letzten Artikel erläutert, enthält das DragData-Objekt die von der DragSource bereitgestellten Daten.
Lesen von Daten
Mit der Eigenschaft wpFormatEnum
kann ermittelt werden, für welche Formate Daten vorliegen.
if (DataObject->wpFormatEnum(_WinDropDataText))
// Daten im Text-Format vorhanden
if (DataObject->wpFormatEnum(_WinDropDataRtf))
// Daten im RichText-Format vorhanden
Das zu prüfende Format wird hierbei in runden Klammern an die Eigenschaft übergeben. Sind Daten im angegebenen Format vorhanden, liefert die Eigenschaft den Wert true
ansonsten false
.
DragDataFormat
Das DragData-Objekt enthält Daten für jedes Format, dass von der DragSource angeboten wird. Die eigentlichen Daten zu einem bestimmten Format werden deshalb vom sogenannten DragDataFormat-Objekt gespeichert. Dieses wird über die Eigenschaft wpData
des DragData-Objektes ermittelt. Beim Aufruf der Eigenschaft muss das Format angegeben werden. Der zurückgelieferte Deskriptor zeigt dann auf das entsprechende DragDataFormat-Objekt. Sind keine Daten in diesem Format enthalten, liefert die Eigenschaft den Wert 0.
// DragDataFormat-Objekt f. Daten im Text-Format
tDragData # aDataObject->wpData(_WinDropDataText);
// DragDataFormat-Objekt f. Daten im RichText-Format
tDragData # aDataObject->wpData(_WinDropDataRtf);
Über die Anweisung tDragData->wpData
können die Daten referenziert werden.
Je nach gewähltem Format hat der zurückgegebene Wert eine andere Bedeutung.
_WinDropDataUser
Die Eigenschaft enthält einen Deskriptor auf eine CTE-Liste oder einen CTE-Baum. Die in der CTE-Struktur vorhandenen Daten werden nicht interpretiert._WinDropDataFile
Die Eigenschaft liefert einen Deskriptor auf eine CTE-Liste. Für jede Datei ist ein CteItem enthalten. Die EigenschaftspName
enthält den vollständigen Datei-Pfad inklusive Name._WinDropDataContent
Die Eigenschaft liefert ebenfalls einen Deskriptor auf eine CTE-Liste. Die Beschreibung des Inhaltes ist in der EigenschaftspName
hinterlegt. Die EigenschaftspID
des CteItem enthält einen Deskriptor auf ein Memory-Objekt. Die dort hinterlegten Daten sind anwendungs-spezifisch._WinDropDataText
und_WinDropDataRtf
Die Eigenschaft enthält einen Deskriptor auf einen Textpuffer. Dieser kann mit den Text-Befehlen (z.B.TextLineRead()
) verarbeitet werden.
Besondere Eigenschaften
Für den Austausch von Daten zwischen CONZEPT 16-Anwendungen hält das DragData-Objekt einige besondere Eigenschaften bereit. Über wpDbaName
, wpDbaUserID
und wpDbaUserName
kann Datenbank-Pfad, Benutzer-ID sowie Benutzer-Name ermittelt werden, wenn die Daten von einer CONZEPT 16-Anwendung stammen. Die Eigenschaften werden automatisch von CONZEPT 16 gesetzt und sind nur lesbar.
Über die Eigenschaften wpName
und wpCustom
kann der CONZEPT 16-Entwickler frei definierbare Informationen hinterlegen. Hier kann z.B. eine Beschreibung der enthaltenen Daten erfolgen.
Erstellen von Daten
Der CONZEPT 16-Entwickler kann die vorgestellten Formate natürlich auch setzen. Dadurch ist es dann z.B. möglich, Dateien an den Windows-Explorer zu übergeben. Hier finden dieselben Eigenschaften Verwendung.
sub GenerateDragData
(
aDataObject : handle;
aFileName : alpha;
aText : alpha;
)
local
{
tMemObj : handle;
tCteItem : handle;
tCteList : handle;
tDragData : handle;
}
{
// Memory-Objekt erstellen
tMemObj # MemAllocate(_MemAutoSize);
tMemObj->spCharset # _CharsetWCP_1252;
// Text im Windows-Zeichensatz schreiben
tMemObj->MemWriteStr(1,aText,_CharsetC16_1252);
// CteItem aufbereiten
tCteItem # CteOpen(_CteItem);
tCteItem->spName # aFileName;
tCteItem->spID # tMemObj;
// CteItem in CteList einfügen
tCteList # CteOpen(_CteList);
tCteList->CteInsert(tCteItem);
// Format definieren
aDataObject->wpFormatEnum(_WinDropDataContent) # true;
// CteList dem DragDataFormat-Objekt zuweisen
tDragData # aDataObject->wpData(_WinDropDataContent);
tDragData->wpData # tCteList;
}
Die Funktion generiert Daten im Format _WinDropDataContent
. Sie erstellt ein CteItem dessen Eigenschaft spName
den Datei-Name angibt. Die Eigenschaft spID
enthält den Deskriptor auf ein Memory-Objekt, dass den Inhalt der Datei enthält.
aDataObject->GenerateDragData('TextFile.txt','Diese Datei enthält Text.');
Der Aufruf stellt die Daten im DragData-Objekt bereit.
Ausblick
In diesem Teil wurde gezeigt, wie Daten für die Übertragung mit Drag & Drop generiert werden können. Im nächsten Artikel zeige ich die Übergabe an das DropTarget.