Programmierung

Drag & Drop (Teil 2)

Drag & Drop (Teil 2)

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 Eigenschaft spName 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 Eigenschaft spName hinterlegt. Die Eigenschaft spID 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.

Keine Kommentare

Kommentar abgeben