Zum Hauptinhalt springen

Drag & Drop-Ereignisse

Drag & Drop-Ereignisse Dynamisches Drag & Drop

Bei einer Reihe von Oberflächen-Objekten kann auf Drag & Drop-Operationen in entsprechenden Ereignissen reagiert werden.

Damit diese Objekte das dynamische Drag & Drop unterstützen, muss in der Eigenschaft OleDropMode des Objekts die Ausprägung _WinOleDynamic gesetzt werden. Zudem muss angegeben werden, ob das Objekt Quelle, Ziel oder beides von Drag & Drop-Operationen sein soll. Folgende Objekte unterstützen das dynamische Drag & Drop:

info

Das Objekt RtfEdit verwendet eine eigene Drag & Drop-Steuerung, in die prozedural nicht eingegriffen werden kann.

Bei der Durchführung eines Drag & Drop-Vorganges spielen mehrere Komponenten zusammen. Das Oberflächen-Objekt, das den Vorgang auslöst (z. B. durch Klick in das Objekt) wird DragSource genannt. Das DragSource-Objekt stellt die Datenformate und zugehörigen Dateninhalte bereit, die gezogen werden sollen. Dazu steht ihm das sogenannte DragData -Objekt als Datencontainer zu Verfügung.

Das Oberflächen-Objekt, welches die gezogenen Daten entgegennimmt, wird DropTarget genannt.

info

Nach dieser Definition kann ein DragSource zugleich auch ein DropTarget sein.

Mit den Tasten Strg und Umschalt kann die gewünschte Aktion verändert werden. Das Verhalten kann über die Eigenschaften OleDropEffectStandard, OleDropEffectCtrl, OleDropEffectShift und OleDropEffectCtrlShift des _App-Objektes angepasst werden. Folgende Aktionen werden von CONZEPT 16 standardmäßig durchgeführt:

info

Die gewünschte Aktion wird mit den erlaubten Aktionen aus EvtDragInit und EvtDropEnter verglichen. Ist die gewünschte Aktion bei einem der Ereignisse nicht gesetzt, kann die Drag & Drop-Operation nicht durchgeführt werden.

info

Damit auf einem Button -Objekt eine Drag & Drop-Operation ausgelöst werden kann, muss die Strg -Taste gedrückt werden.

EvtDragInit

Ein Drag & Drop-Vorgang wird beim DragSource-Objekt gestartet. Befindet sich das Objekt innerhalb von CONZEPT 16, wird das Ereignis EvtDragInit ausgelöst. Innerhalb dieses Ereignisses werden die an das DropTarget zu übermittelnden Daten aufbereitet. Als Container für die Daten dient das DragData -Objekt. In diesem Objekt werden sowohl das Format der Daten, als auch die Daten selbst abgelegt. In dem Objekt können die Daten auch in unterschiedlichen Formaten angegeben werden. Das DropTarget-Objekt bestimmt, welches der Formate benötigt bzw. ausgewertet werden.

Das Format der Daten wird in der Eigenschaft FormatEnum angegeben. Dabei wird der Index des Formats übergeben. Soll zum Beispiel formatierter und unformatierter Text übergeben werden müssen zwei Formate gesetzt werden:

aDataObject->wpFormatEnum(_WinDropDataText) # true;
aDataObject->wpFormatEnum(_WinDropDataRtf) # true;

Die eigentlichen Daten werden in einem Data-Objekt angegeben:

tDataText # aDataObject->wpData(_WinDropDataText);
tDataRtf # aDataObject->wpData(_WinDropDataRtf);

Die zu übertragenden Daten werden in dem Daten-Objekt übergeben. In diesem Fall handelt es sich um unformatierten und formatierten Text. Diese werden in einem Textpuffer aufbereitet und der Eigenschaft Data zugewiesen.

tText # TextOpen(16);
// unformatierten Text aufbereiten
...
tDataText->wpData # tText;

tText # TextOpen(16);
// formatierten Text aufbereiten
...
tDataRtf->wpData # tText;
info

Die Deskriptoren für die Texte oder andere Daten müssen nicht gelöscht werden, sofern die Eigenschaft DataOwner auf true gesetzt ist. Sollen Dateinamen oder benutzerdefinierte Daten übertragen werden, werden diese in Cte-Listen übergeben. Ganze Dateiinhalte können in Memory -Objekten übergeben werden.

Damit die Daten von anderen Programmen ausgewertet werden können, müssen diese in bestimmten Formaten vorliegen. Soll zum Beispiel ein Text in Microsoft Word eingefügt werden, muss der Text formatiert oder unformatiert übergeben werden. Werden beide Texte übergeben, wird der formatierte Text bevorzugt. Soll eine Datei oder mehrere Dateien per Drag & Drop an den Windows Explorer übergeben werden, müssen die Inhalte in Form von Memory -Objekten aufbereitet und in einer Cte-Liste angegeben werden. Befinden sich sowohl das DragSource- als auch das DropTarget-Objekt in einer CONZEPT 16-Applikation, kann das benutzerdefinierte Format (_WinDropDataUser) verwendet werden.

// Übergabe von Dateien an den Explorer
// Binäres Objekt öffnen und in ein Memory-Objekt lesen
tBinObj # BinOpen(0, tBinDirPath + '\' + tName, _BinLock);
tMemObj # MemAllocate(tBinObj->spSizeOrg);
BinReadMem(tBinObj, tMemObj);

// Liste mit Dateiinhalten anlegen und Listenelement mit Inhalt erzeugen
tList # CteOpen(_CteList);
tList->CteInsertItem(tName, tMemObj, '');

// Format für die zu ziehenden Daten festlegen
aDataObject->wpFormatEnum(_WinDropDataContent) # true;

// Daten zum DragData-Objekt zuweisen
tFormatContent # aDataObject->wpData(_WinDropDataContent);
tFormatContent->wpData # tList;

Nach der Aufbereitung der Daten muss noch die Operation angegeben werden, die mit diesen Daten möglich sind. Dazu stehen die Konstanten _WinDropEffectCopy, _WinDropEffectMove und _WinDropEffectLink zur Verfügung. Die möglichen Operatone werden (auch in Kombination) in aEffect zurückgegeben:

aEffect # _WinDropEffectCopy | _WinDropEffectMove;

EvtDropEnter / EvtDropLeave

Diese Ereignisse werden aufgerufen, wenn bei einer Drag & Drop-Operation ein Objekt betreten bzw. verlassen wird. Beim Betreten des Objekts (EvtDropEnter) sollten die gewünschte Operation und die übertragenen Datenformate geprüft werden. In dem Ereignis wird dann definiert, ob die Drag & Drop-Operation durchgeführt werden kann.

// Überprüfung des Formats
if (aDataObject->wpFormatEnum(_WinDropDataFile))
aEffect # _WinDropEffectCopy | _WinDropEffectMove;
else
aEffect # _WinDropEffectNone;

Wurde der Vorgang mit einer Operation gestartet, die nicht erlaubt ist, wird das dem Benutzer durch einen entsprechenden Mauszeiger mitgeteilt. Im Ereignis EvtDropLeave müssen nur dann Anweisungen ausgeführt werden, wenn beim EvtDropEnter Objekte geöffnet wurden. In diesem Ereignis können diese Objekte wieder entfernt werden.

EvtDropOver

Das Ereignis wird während einer Drag & Drop-Operation ausgelöst, wenn der Mauszeiger innerhalb eines Objektes bewegt oder eine der Hilfstasten ( Strg , Alt oder Umschalt ) betätigt wird.

EvtDrop

Das Ereignis wird ausgelöst, sobald der Benutzer die Maustaste loslässt und damit eine zugelassene Drag & Drop-Operation innerhalb der CONZEPT 16-Applikation ausführt. Innerhalb des Ereignisses muss nochmals das Format der übergebenen Daten geprüft und das Daten-Objekt ermittelt werden. Anschließend können die Daten ermittelt und verarbeitet werden. Befindet sich das DragSource-Objekt nicht in einer CONZEPT 16-Applikation können die Daten in unterschiedlichen Formaten übergeben werden. Wird zum Beispiel ein Textausschnitt aus Microsoft Word in die Applikation gezogen, liegt der Text in formatierter (als RTF) und als unformatierter Text vor. Der Text wird in einem Textpuffer übergeben. Beim Drag & Drop von externen Dateien aus dem Explorer oder dem Windows Desktop wird eine Liste mit Pfad- und Dateinamen übergeben.

Die unterschiedlichen Formate der zu übertragenen Daten werden in unterschiedlichen Format-Objekten abgebildet. In einem DragData -Objekt können bis zu fünf Format-Objekte angehängt werden.

// Überprüfung des Formats
if (aDataObject->wpFormatEnum(_WinDropDataFile))
{
tDataFormat # aDataObject->wpData(_WinDropDataFile);
tFileList # tDataFormat->wpData;

// Ermitteln aller Dateinamen
for tDataObj # tFileList->CteRead(_CteFirst);
loop tDataObj # tFileList->CteRead(_CteNext, tDataObj);
while (tDataObj > 0)
{
tExtFile # tDataObj->spName;

// Verarbeitung des Dateinamens
...

// Soll die Quelle gelöscht werden?
if (aEffect & _WinDropEffectMove > 0)
{
FsiDelete(tExtFile);
}
}
}

EvtDropTerm

Das Ereignis wird bei dem Objekt ausgelöst, in dem der Drag & Drop-Vorgang gestartet wurde, sobald die Operation beendet wird. Das Ereignis wird unabhängig davon, ob die Operation erfolgreich war oder nicht, ausgelöst. Hier können Objekte, die in dem Ereignis EvtDragInit angelegt wurde, wieder entfernt werden. Die Objekte, die im DragData -Objekt übergeben werden, müssen nicht entfernt werden.

Eine Beschreibung der beteiligten Objekte beim Drag & Drop befindet sich im Abschnitt Drag & Drop-Objekte . Die Reihenfolge der Ereignisse wird im Abschnitt Ereignisabläufe Drag & Drop erläutert.