Programmierung

Drag & Drop (Teil 3)

Drag & Drop (Teil 3)

Im Artikel Drag Drop Teil 2 wurde das DragData-Objekt erläutert. Es wurde die Funktion GenerateDragData entwickelt, die ein Memory-Objekt erstellt, welches die per Drag & Drop zu übertragenden Daten enthält. Im heutigen und letzten Teil der Artikel-Reihe wird gezeigt, wie der eigentliche Drag & Drop-Vorgang abläuft.

Mit der Windows-Anwendung Notepad lassen sich einfache Texte erstellen. Sie können eine Datei per Drag & Drop ins Notepad ziehen. Der umgekehrte Weg ist jedoch nicht möglich. Unsere Anwendung NoteDrag schafft hier Abhilfe (siehe Abb. 1).

Anwendung NoteDragAbb. 1: Anwendung NoteDrag

Die Oberfläche der Anwendung besteht lediglich aus einem Frame-Objekt, welches wiederum ein TextEdit-Objekt beinhaltet. Der dort eingegebene Text soll auf den Desktop gezogen werden können. Damit nicht jedes Mal nachgefragt werden muss, wie die zu erstellende Datei heißen soll, bekommt sie zunächst einfach den Name “unbenannt.txt”.

Drag and Drop-Aktivierung
OleDropMode-EigenschaftAbb. 2: OleDropMode

Um das TextEdit-Objekt Drag & Drop fähig zu machen, muss dessen Eigenschaft wpOleDropMode gesetzt werden. Dies kann bereits im Designer geschehen (Abb. 2). Mit der Auswahl von _WinOleSource wird das TextEdit-Objekt als DragSource gekennzeichnet. Durch betätigen der linken Maustaste bei gehaltener Strg-Taste kann dann zur Laufzeit der Drag-Vorgang gestartet werden. Das Setzen von _WinOleDynamic ist zusätzlich notwendig, da für die Generierung der zu ziehenden Daten ein Ereignis benötigt wird.

Prozedur-Erstellung

Um die Anwendung lauffähig zu machen, erstellen wir die Prozedur “NoteDrag” im Code-Editor und ergänzen diese um die Funktion “main”. Wenn Sie die Prozedur starten und in das TextEdit klicken, werden Sie jedoch feststellen, dass noch kein Ziehen des Inhaltes möglich ist.

Ereignis-Generierung

Um diesen Umstand zu ändern, muss beim TextEdit-Objekt das Ereignis EvtDragInit eingetragen werden. Das Ereignis wird dann aufgerufen, wenn der Anwender den Zieh-Vorgang mit der Maus startet. Der folgende Quelltext zeigt die Implementation.

sub EvtDragInit
(
  aEvt                 : event;    // Ereignis
  aDataObject          : handle;   // Drag-Datenobjekt
  aEffect              : int;      // Rückgabe der erlaubten Effekte
  aMouseBtn            : int;      // Verwendete Maustasten
)
: logic;
{
  aDataObject->GenerateDragData('unbenannt.txt', $Text->wpCaption);
  aEffect # _WinDropEffectMove | _WinDropEffectCopy;
  return(true);
}

Im Argument aDataObject wird das bereits behandelte DragData-Objekt übergeben. Dieses wird durch die (im letzten Artikel entwickelte) Funktion GenerateDragData mit dem Inhalt der Eigenschaft wpCaption des TextEdit-Objektes gefüllt. Das Argument aEffect muss in der Ereignis-Funktion gesetzt werden und gibt Auskunft darüber, ob der Inhalt kopiert, verschoben oder verlinkt werden darf. Wir erlauben das Kopieren (_WinDropEffectCopy) sowie das Verschieben (_WinDropEffectMove). Durch die Rückgabe von _WinDropEffectNone wird der Drag-Vorgang abgebrochen. Gleiches bewirkt die Rückgabe von false durch EvtDragInit.

Ausführung der Anwendung

Wenn Sie nun die Prozedur übersetzen und ausführen, dann können Sie durch Drag & Drop mit der linken Maustaste den Text z.B. als Datei auf dem Desktop ablegen. Die Kombination aus Strg- und Shift-Taste bestimmt, welche Operation durchgeführt werden soll:

  • Strg-Taste: Der Inhalt soll kopiert werden.
  • Shift-Taste: Der Inhalt soll verschoben werden.
  • Strg- und Shift-Taste: Der Inhalt soll verlinkt werden.

Die Durchführung der entsprechenden Operation muss von der Anwendung vorgenommen werden. Windows signalisiert dies dem Anwender nur optisch (durch die Veränderung des Mauszeigers), führt die Operation jedoch nicht aus.

Abschluss

Ich hoffe, dass ich mit dieser Artikel-Reihe einen kleinen Einblick in die Drag & Drop-Thematik geben konnte.

Download

NoteDrag-Beispiel NoteDrag.zip (1.62 KB)
Sie müssen angemeldet sein, um die Datei herunterladen zu können.

Keine Kommentare

Kommentar abgeben