Dies ist die alte 4D Dokumentations-Website. Die neue und aktualisierte Dokumentation finden Sie unter developer.4d.com

Home

 
4D v20 R7
Einführung in Drag and Drop

Einführung in Drag and Drop  


 

4D ermöglicht, Objekte in Ihren Formularen per Drag-and-Drop Technik zu bewegen. Sie können ein Objekt in ein anderes bewegen, egal ob es im gleichen oder einem anderen Fenster liegt. Drag-and-Drop ist also innerhalb eines Prozesses oder von einem Prozess zum nächsten möglich.

Sie können Objekte per Drag-and-Drop zwischen 4D Formularen und anderen Anwendungen bewegen und umgekehrt. Es ist z.B. möglich, ein PNG-Bild per Drag-and-Drop in ein 4D Datenfeld vom Typ Bild zu ziehen. Sie können auch Text in einem Textverarbeitungsprogramm auswählen und in eine 4D Variable vom Typ Text oder in eine Listbox ziehen.
Sie können Objekte direkt in die 4D Anwendung ziehen. Dafür muss kein Formular im Vordergrund sein. Sie können auch ein 4D Write Pro Dokument öffnen, indem Sie es auf das 4D Programm-Icon ziehen. Weitere Informationen dazu finden Sie im Abschnitt Datenbankmethode On Drop.

4D bietet 2 Vorgehensweisen für Drag-and-Drop:

  • Eigener Modus: Hier verwaltet der Programmierer die gesamte Drag-and-Drop Operation. Er kann eine beliebige Oberfläche für Drag-and-Drop einrichten. Das kann auch eine Oberfläche sein, die keine Daten transportiert, sondern Aktionen ausführt, wie Datei öffnen, Berechnung auslösen. Dieser Modus ist eine Kombination aus spezifischen Eigenschaften, Ereignissen und Befehlen aus dem Kapitel Pasteboard
  • Automatischer Modus: Hier kopiert oder bewegt eine Drag-and-Drop Operation automatisch Daten von einem Objekt in ein anderes. Dieser Modus ist für Objekte mit Text und teilweise für Bilder verfügbar und lässt sich durch einfaches Anklicken einer Eigenschaft aktivieren. Weitere Informationen dazu finden Sie im Absatz unten Automatisches Drag-and-Drop.

Beim Einrichten einer Oberfläche mit eigenen Drag-and-Drop Operationen kombinieren Sie in der Regel Eigenschaften, Ereignisse und Befehle aus dem Kapitel “Pasteboard”. Folgendes Diagramm erläutert die wichtigsten Punkte der Vorgehensweise:

  1. Im Ereignis On Begin Drag Over des Quellobjekts (mit der Eigenschaft "Dragfähig") über die Befehle APPEND DATA TO PASTEBOARD, SET FILE TO PASTEBOARD oder andere Befehle aus dem Kapitel Pasteboard geeignete Daten in das Pasteboard setzen. Über den Befehl SET DRAG ICON können Sie auch einen spezifischen Cursor definieren.
  2. Im Ereignis On Drag Over des Zielobjekts (mit der Eigenschaft "Dropfähig") über den Befehl GET PASTEBOARD DATA TYPE oder GET PASTEBOARD DATA die Datentypen oder Datensignaturen aus dem Pasteboard erhalten und prüfen, ob sie mit dem Zielobjekt kompatibel sind.
    Der Befehl Drop position gibt die Elementnummer der Position des Eintrags des Zielelements oder Listeneintrags zurück, wenn das Zielobjekt ein Array, eine hierarchische Liste, ein Text oder eine Combobox, bzw. eine Spaltennummer, wenn das Objekt eine Listbox ist.
    Ist das Zielobjekt oder Element kompatibel, 0 in $0 zurückgeben, um Drop zu akzeptieren, sonst -1 in $0.
  3. Im Ereignis On Drop des Zielobjekts (mit der Eigenschaft "Dropfähig") eine beliebige Aktion als Antwort auf Drop ausführen. Soll Drag-and-Drop die gezogenen Daten kopieren, weisen Sie die Daten einfach dem Zielobjekt zu. Soll Drag-and-Drop keine Daten bewegen, sondern ist dies vielmehr eine Methapher in der Benutzeroberfläche für eine bestimmte Operation, können Sie ausführen, was immer Sie möchten, z.B. über den Befehl Get file from pasteboard Dateipfade erhalten.

Um ein Objekt per Drag-and-Drop in ein anderes Objekt zu ziehen, müssen Sie für dieses Objekt in der Eigenschaftenliste die Eigenschaft Dragfähig auswählen. Das Objekt, das sich ziehen lässt, ist das Quellobjekt.

Um ein Objekt zum Ziel einer Drag-and-Drop Operation zu machen, müssen Sie für dieses Objekt in der Eigenschaftenliste die Eigenschaft Dropfähig auswählen. Das Objekt, das Daten empfangen kann, ist das Zielobjekt.

Hinweis: Die zusätzlichen Eigenschaften Automatisches Drag und Automatisches Drop sind für Textfelder und Variablen sowie Combo Boxen und Listboxen verfügbar. Automatisches Drop ist auch für Felder vom Typ Bild und Variablen verfügbar. Damit können Sie den automatischen Drag-and-Drop Modus aktivieren, d.h. der Inhalt wird kopiert (Die Drag-and-Drop Aktion wird nicht mehr über 4D Formularereignisse verwaltet). Weitere Informationen siehe unten im Abschnitt Automatisches Drag-and-Drop.

Standardmäßig haben neu erstellte Objekte keine Eigenschaften für Drag-and-Drop. Sie entscheiden selbst, ob Sie diese Eigenschaften zuweisen.

Die Drag-and-Drop Technik ist möglich für alle Objekte in einem Eingabeformular, für eigene Elemente in einem Array, z.B. rollbarer Bereich, Einträge einer hierarchischen Liste oder Zeilen einer Listbox. Sie können umgekehrt auch ein Objekt per Drag-and-Drop in ein eigenes Element eines Arrays, in einen Eintrag einer hierarchischen Liste oder in Zeilen einer Listbox bewegen. Sie können dagegen nicht Objekte aus einem Detail-Bereich eines Ausgabeformulars per Drag-and-Drop bewegen.

Über die Datenbankmethode On Drop können Sie Drag-and-Drop in der Anwendung auch außerhalb von Formularen einsetzen.

Da 4D jede Art von aktivem Objekt (Datenfeld oder Variable) als Quell- oder Zielobjekt zulässt, lässt sich eine drag- und drop-fähige Benutzeroberfläche schnell und problemlos erstellen. So können Sie beispielsweise eine Schaltfläche per Drag-and-Drop bewegen.

Hinweise:

  • Um einen Text oder eine Schaltfläche mit dem Attribut "dragfähig" zu ziehen, müssen Sie zuerst unter Windows die Alt-Taste, auf macOS die Wahltaste drücken.
  • Bei Bildvariablen und -feldern werden standardmäßig das Bild und seine Referenz übertragen. Wollen Sie nur die Referenz übertragen, drücken Sie während der Operation unter Windows die Alt-Taste, auf macOS die Wahltaste.
  • Gibt es für ein Objekt vom Typ Listbox die Eigenschaften “dragfähig” und “verschiebbare Zeilen”, hat die Eigenschaft “verschiebbare Zeilen” Vorrang, wenn eine Zeile bewegt wird. In diesem Fall ist keine Drag-Aktion möglich.

Ein Objekt, das sowohl drag- als auch dropfähig ist, lässt sich auch auf sich selbst ziehen, außer Sie schließen diese Operation aus. Weitere Informationen dazu finden Sie in den folgenden Abschnitten.
Folgendes Bild zeigt die Eigenschaftenliste mit den markierten Eigenschaften dropfähig bzw. dragfähig für die ausgewählten Objekte:

4D stellt drei Formularereignisse zur Verfügung: On Begin Drag Over, On Drag Over und On Drop. Beachten Sie, dass On Begin Drag Over im Kontext des Quellobjekts der Drag-Aktion generiert wird, während On Drag Over und On Drop nur zum Zielobjekt gesendet werden.

Das Programm kann diese Ereignisse nur ausführen, wenn sie in der Eigenschaftenliste für das jeweilige Quell- und Zielobjekt entsprechend aktiviert wurden:

Das Formularereignis On Begin Drag Over lässt sich für jedes dragfähige Formularobjekt wählen und wird immer erzeugt, wenn das Objekt die Eigenschaft dragfähig hat.

Hinweis: Im Gegensatz zum Formularereignis On Drag Over wird On Begin Drag Over im Quellobjekt der Drag-Aktion aufgerufen.

Dieses Ereignis  ist hilfreich zur Vorbereitung der Drag-Aktion. Sie können damit folgendes ausführen:

  • Daten und Signaturen in das Pasteboard legen (über den Befehl APPEND DATA TO PASTEBOARD).
  • Während der Drag-Aktion einen eigenen Icon verwenden (über den Befehl SET DRAG ICON).
  • Über $0 in der Methode des zu ziehenden Objekts Drag erlauben oder verweigern: Um anzuzeigen, dass Drag-Aktionen erlaubt sind, muss die Methode des Quellobjekts 0 (Null) zurückgeben, Sie müssen also $0:=0 ausführen. Um anzuzeigen, dass Drag-Aktionen verweigert werden, muss die Methode des Quellobjekts -1 zurückgeben, Sie müssen also $0:=-1 ausführen. Wird kein Ergebnis zurückgegeben, geht 4D davon aus, dass Drag-Aktionen akzeptiert werden.

4D Daten werden vor Aufrufen des Ereignisses in das Pasteboard gelegt. Wird z.B. Drag ohne die Option Automatisches Drag ausgeführt, liegt der gezogene Text bereits im Pasteboard, wenn das Ereignis aufgerufen wird.

Das Ereignis On Drag Over wird erneut zum Zielobjekt gesendet, immer wenn der Mauszeiger über das Objekt bewegt wird. Als Antwort auf dieses Ereignis:

  • Erhalten Sie Daten und Signaturen aus dem Pasteboard (über Befehl _o_DRAG AND DROP PROPERTIES).
  • Bestätigen oder Annullieren Sie Drag-and-Drop je nach Natur und Typ der Daten im Pasteboard

Zum Bestätigen von Drag muss die Methode des Zielobjekts 0 (Null) zurückgeben. Sie schreiben also $0:=0. Zum Abweisen von Drag muss die Methode des Zielobjekts -1 (minus eins) zurückgeben. Sie schreiben also $0:=-1. Während einem Ereignis On Drag Over behandelt 4D die Objektmethode wie eine Funktion. Wird kein Ergebnis zurückgegeben, nimmt 4D an, dass Drag akzeptiert wird.

Bei Bestätigen von Drag wird das Zielobjekt markiert, bei Abweisen von Drag wird das Zielobjekt nicht markiert. Bestätigen von Drag bedeutet jedoch nicht, dass die bewegten Daten in das Zielobjekt gesetzt werden. Es bedeutet lediglich, dass bei Loslassen der Maustaste an dieser Stelle das Zielobjekt die bewegten Daten aufnehmen und das Ereignis On Drop ausgelöst würde.

Legen Sie für ein dropfähiges Objekt kein Ereignis On Drag Over fest, wird dieses Objekt für alle "drag over" Operationen markiert, egal welcher Art die bewegten Daten sind.

Mit dem Ereignis On Drag Over können Sie die erste Phase einer Drag-and-Drop Operation steuern. Sie können einerseits testen, ob die bewegten Daten mit dem Zielobjekt kompatibel sind und dann Drag bestätigen oder annullieren. Sie können andererseits auch den Benutzer darüber informieren, denn – je nach Ihrer Entscheidung – wird das Zielobjekt markiert oder nicht markiert.

Das Code-handling für ein Ereignis On Drag Over sollte kurz sein und schnell ausgeführt werden, da dieses Ereignis bei jeder Mausbewegung erneut an das aktuelle Zielobjekt gesendet wird.

On Drop  

Das Ereignis On Drop wird an das Zielobjekt gesendet, wenn der Mauszeiger auf das Objekt losgelassen wird. Dieses Ereignis ist die zweite Phase der Drag-and-Drop Operation. Sie wird als Folge der Benutzeraktion ausgeführt.

Dieses Ereignis wird nur an das Objekt gesendet, wenn Drag während den Ereignissen On Drag Over bestätigt wurde. Führen Sie für ein Objekt das Ereignis On Drag Over aus und weisen Drag zurück, tritt das Ereignis On Drop nicht ein. Haben Sie also während dem Ereignis On Drag Over bereits die Kompatibilität der Daten zwischen Quell- und Zielobjekten getestet und ein mögliches Drag bestätigt, müssen Sie die Daten während des Ereignisses On Drop nicht erneut testen. Sie wissen bereits, dass die Daten für das Zielobjekt geeignet sind.

Ein interessanter Aspekt bei der Integration von Drag-and-Drop ist, dass 4D Ihnen freie Hand lässt. Beispiele:

  • Beim Bewegen eines Items aus einer hierarchischen Liste bestimmen Sie selbst, ob er am Anfang, Ende und in der Mitte des Textfeldes eingefügt wird.
  • Ihr Formular enthält eine Bildschaltfläche mit zwei unterschiedlichen Bildern, das kann z.B. ein voller oder ein leerer Papierkorb sein. Bewegen Sie ein Objekt in diese Schaltfläche, kann das aus der Sichtweise des Benutzers bedeuten “lösche das per Drag-and-Drop Technik in den Papierkorb gelegte Objekt.” Hier transportiert Drag-and-Drop nicht Daten von einem Punkt zu einem anderen; sondern führt stattdessen eine Aktion aus.
  • Bewegen Sie ein Array-Element von einem Palettenfenster in ein Formularobjekt, kann das bedeuten “Zeige in diesem Fenster den Kundendatensatz, dessen Namen Sie gerade per Drag-and-Drop Technik aus dem Palettenfenster entnommen haben, welches die in der Datenbank gespeicherten Kunden anzeigt.”
  • Usw.

Die Drag-and-Drop Oberfläche ist ein Komplex, mit dem Sie jede Metapher in der Benutzeroberfläche integrieren können.

Textbereiche (Felder, Variablen, Combo Boxen und Listboxen) sowie Objekte vom Typ Bild ermöglichen automatisches Drag-and- Drop, d.h. Verschieben oder Kopieren einer Text- oder Bildauswahl von einem Bereich in einen anderen durch einen Klick. Diese Operation lässt sich im gleichen 4D Bereich, zwischen zwei verschiedenen 4D Bereichen oder zwischen 4D und einer anderen Anwendung, z.B. WordPad verwenden.
Hinweis: Bei automatischem Drag-and-Drop zwischen zwei 4D Bereichen werden die Daten verschoben, d.h. sie werden aus dem Quellbereich entfernt. Wollen Sie die Daten nur kopieren, halten Sie während der Aktion unter Windows die Strg-Taste, auf macOS die Wahltaste gedrückt. Auf macOS müssen Sie erst klicken, dann die Wahltaste drücken und dann den Eintrag ziehen.
Automatisches Drag-and-Drop lässt sich für jedes Formularobjekt separat konfigurieren. Dazu stehen in der Eigenschaftenliste die beiden Optionen Automatisches Drag und Automatisches Drop zur Verfügung.

  • Automatisches Drag (nur Objekte vom Typ Text): Ist diese Option markiert, wird der automatische Drag-Modus für das Objekt aktiviert. In diesem Modus wird das Formularereignis On Begin Drag nicht generiert.
    Wollen Sie das standardmäßige Drag erzwingen, wenn automatisches Drag aktiviert ist, drücken Sie während der Aktion unter Windows die Alt-Taste, auf macOS die Wahltaste. Auf macOS müssen Sie erst die Wahltaste drücken, dann klicken und dann den Eintrag ziehen. Diese Option ist für Bilder nicht verfügbar.
  • Automatisches Drop: Diese Option aktiviert den automatischen Drop-Modus. In diesem Modus verwaltet 4D automatisch das Einfügen bewegter Daten vom Typ Text oder Bild, die auf das Objekt gezogen wurden (die Daten werden in das Objekt kopiert). In diesem Fall werden die Formularereignisse On Drag Over und On Drop nicht erzeugt. Die Ereignisse On After Edit (während einem Drop) und On Data Change (wenn ein Objekt Fokus verliert) werden dagegen erzeugt.
    Bei per Drop bewegten Daten, die nicht vom Typ Text oder Bild sind, also z.B. ein anderes 4D Objekt, eine andere Datei, oder bei komplexen Daten, richtet sich die Anwendung nach der Option Dropfähig: Ist sie markiert, werden die Formularereignisse On Drag Over und On Drop erzeugt. Ist sie nicht markiert, wird Drop verweigert. Dabei spielt auch die Option "Drag-and-Drop von außerhalb von 4D verweigern" eine Rolle.

4D erlaubt ab Version 11 Drag-and-Drop für Auswahlen, Objekte bzw. externe Dateien in 4D, z.B. eine Bilddatei. Der Code der Datenbank muss diese Möglichkeit unterstützen.
Diese Möglichkeit kann jedoch die Funktionsweise für Datenbanken beeinträchtigen, die aus früheren 4D Versionen konvertiert wurden, wenn der vorhandene Code nicht entsprechend angepasst wird. Dafür gibt es in den Einstellungen der Datenbank auf der Seite Anwendung>Kompatibilität die Option Drag-and-Drop von außerhalb von 4D verweigern. Sie ist in konvertierten Datenbanken standardmäßig markiert.
Ist diese Option markiert, wird das Ziehen von externen Objekten per Drop-Technik in 4D Formulare verweigert. Beachten Sie, dass sich externe Objekte weiterhin in Objekte mit der Eigenschaft Automatisches Drop einfügen lassen, wenn die Anwendung diese Objekte interpretieren kann (Text oder Bild).

Dieses einfache Beispiel zeigt, wie Sie einen Textbereich mit Daten aus einer Listbox vom Typ Array per Drag-and-Drop füllen können:

Die Objektmethode der Listbox lautet:

  //Objektmethode: ListBox
 If(Form event code=On Begin Drag Over)
    SET TEXT TO PASTEBOARD(arrFirstname{arrFirstname}+" "+arrLastname{arrFirstname})
 End if

Die Objektmethode des Textbereichs lautet:

  // Objektmethode: label1
 If(Form event code=On Drop//Erfordert Aktivierung der Aktion Dropfähig über die Eigenschaftsliste
    ARRAY TEXT($signatures_at;0)
    ARRAY TEXT($nativeTypes_at;0)
    ARRAY TEXT($formatNames_at;0)
    GET PASTEBOARD DATA TYPE($signatures_at;$nativeTypes_at;$formatNames_at)
    If(Find in array($signatures_at;"com.4d.private.text.native")#-1) // es gibt 4D Text im Pasteboard
       OBJECT Get pointer(Object current)->:=Get text from pasteboard
    End if
 End if

Kombinieren von eigenen und automatischen Drag-and-Drop Features ermöglicht einfache und leistungsstarke Oberflächen. In diesem Beispiel füllen wir einen Textbereich mit Daten per Drag aus der Listbox:

  • Listbox: Eigenschaft "Dragfähig" und Ereignis "On Begin Drag Over" sind markiert
  • Textbereich: Eigenschaft "Automatisches Drop" ist markiert.

  //Objektmethode für Listbox
 Case of
    :(Form event code=On Begin Drag Over)
       LOAD RECORD([Clients])
       $label:=[Clients]Name+Char(CR ASCII code)+[Clients]Contact+Char(CR ASCII code)+\
       [Clients]Address1+Char(CR ASCII code)+[Clients]City+", "+[Clients]State+" "+[Clients]ZipCode)
       SET TEXT TO PASTEBOARD($label)
 End case

Bewegen und Formatieren der Daten wird durch Drag-and-Drop ausgeführt:

Der Benutzer soll eine Datei auf der Festplatte auswählen und diese per Drag-and-Drop in eine eingebbare Variable (vom Typ Objekt) ziehen, um eine json Beschreibung der Datei anzuzeigen.

Die Objektmethode der Variable lautet:

 C_LONGINT($0)
 Case of
 
    :(Form event code=On Drag Over)
  // Ereignis On Drop nur akzeptieren, wenn das Pasteboard Dateien enthält, sonst abweisen
       If(Get file from pasteboard(1)="") //keine Datei in Pasteboard
          $0:=-1 //Drop abweisen
       End if
 
    :(Form event code=On Drop//Erfordert Aktivierung der Aktion Dropfähig über die Eigenschaftenliste
       C_TEXT($path_t)
       C_OBJECT(path_o)
       $path_t:=Get file from pasteboard(1)
       If($path_t#"")
          path_o:=Path to object($path_t)
       End if
 
 End case

Der Benutzer soll Dateititel auf der Festplatte auswählen und per Drag-and-Drop in eine Listbox setzen, um die Dateipfade anzuzeigen.

Die Objektmethode der Listbox lautet:

 C_LONGINT($0)
 Case of
 
    :(Form event code=On Drag Over)
  // Das Ereignis On Drop nur akzeptieren, wenn das Pasteboard Dateien enthält, andernfalls abweisen.
       If(Get file from pasteboard(1)#"") //mindestens eine Datei ist vorhanden
          $0:=0 //Drop akzeptieren
       Else //keine Datei in Pasteboard
          $0:=-1 //Drop abweisen
       End if
 
    :(FORM Event=On Drop//Erfordert Aktivierung der Aktion Dropfähig in der Eigenschaftenliste
       ARRAY TEXT(importedPath_at;0)
       C_TEXT($path_t)
       C_LONGINT($index_l)
       $index_l:=1
       Repeat
          $path_t:=Get file from pasteboard($index_l)
          If($path_t#"")
             APPEND TO ARRAY(importedPath_at;$path_t)
          End if
          $index_l:=$index_l+1
       Until($path_t="")
 End case



Siehe auch 

_o_DRAG AND DROP PROPERTIES
Drop position
Form event code
GET PROCESS VARIABLE
Is a list
RESOLVE POINTER
Type

 
EIGENSCHAFTEN 

Produkt: 4D
Thema: Drag and Drop

 
SEITENINHALT 
 
GESCHICHTE 

 
ARTIKELVERWENDUNG

4D Programmiersprache ( 4D v20 R7)