4D v14.3

DRAG AND DROP PROPERTIES

Home

 
4D v14.3
DRAG AND DROP PROPERTIES

DRAG AND DROP PROPERTIES 


 

DRAG AND DROP PROPERTIES ( Quellobjekt ; Quellelement ; Quellprozess ) 
Parameter Typ   Beschreibung
Quellobjekt  Zeiger in Zeiger zum Bewegen des Quellobjekts per Drag-and-Drop
Quellelement  Lange Ganzzahl in Gezogene Elementnummer des Array oder gezogener Eintrag der hierarchischen Liste oder -1, wenn Quellobjekt weder Array, Liste noch hierarchische Liste ist
Quellprozess  Lange Ganzzahl in Nummer des Quellprozesses

Hinweis zur Kompatibilität: Ab 4D Version 11 empfehlen wir, Drag-and-Drop Operationen, insbesondere auf Interprozessebene, über das Ereignis On Begin Drag Over und die Befehle im Kapitel Pasteboard zu verwalten.

Der Befehl DRAG AND DROP PROPERTIES fragt Informationen über das Quellobjekt ab, wenn für ein "komplexes" Objekt (Array, Listbox, hierarchische Liste) ein Ereignis On Drag Over oder On Drop eintritt.

Sie verwenden DRAG AND DROP PROPERTIES innerhalb der Objektmethode des Objekts bzw. innerhalb einer Unterroutine, die das Objekt aufruft, für die das Ereignis On Drag Over oder On Drop eintritt (das Zielobjekt).

Wichtig: Ein Formularobjekt akzeptiert bewegte Daten nur, wenn die Eigenschaft dropfähig zugewiesen ist. Außerdem muss die dazugehörige Objektmethode für On Drag Over und/oder On Drop aktiviert sein, damit diese Ereignisse durchgeführt werden.

Nach dem Aufruf gilt folgendes:

  • Der Parameter Quellobjekt ist ein Zeiger auf das Quellobjekt (das per Drag&Drop bewegte Objekt). Beachten Sie, dass dieses Objekt das Zielobjekt sein kann (das Objekt, für welches das Ereignis On Drag Over oder On Drop eintritt) oder ein anderes Objekt. Werte per Drag-and-Drop aus und in dasselbe Objekt bewegen ist nützlich für Arrays und hierarchische Listen — ein einfacher Weg für den Benutzer, um ein Array oder eine Liste manuell zu sortieren.
  • Ist der per Drag-and-Drop bewegte Wert ein Array-Element (das Quellobjekt ist ein Array), gibt der Parameter Quellelement die Nummer dieses Elements zurück. Ist der per Drag-and-Drop bewegte Wert eine Zeile einer Listbox, gibt der Parameter Quellelement die Nummer dieser Zeile zurück. Ist der per Drag-and-Drop bewegte Wert ein Listeneintrag (das Quellobjekt ist eine hierarchische Liste), gibt der Parameter Quellelement die Position dieses Eintrags zurück. Gehört das Quellelement dagegen zu keiner dieser Kategorien, hat Quellelement den Wert -1 (minus 1).
  • Drag-and-Drop Operationen sind auch zwischen Prozessen möglich. Der Parameter Quellprozess ist gleich der Prozessnummer, zu der das Quellobjekt gehört. Sie müssen den Wert dieses Parameters testen. Sie können auf eine Drag-and-Drop Operation im selben Prozess durch einfaches Kopieren der Quelldaten in das Zielobjekt antworten. Bei einer Drag-and-Drop Operation auf Interprozessebene erhalten Sie die Quelldaten aus dem Objekt des Quellprozesses über den Befehl GET PROCESS VARIABLE. Ist das Quellobjekt ein Datenfeld, müssen Sie den Wert aus dem Quellprozess via Interprozesskommunikation holen oder in diesem speziellen Fall auf das Ereignis On Drag Over antworten (siehe nachfolgend). Im Normalfall integrieren Sie die Drag-and-Drop Benutzeroberfläche aus Quellvariablen, wie z.B. Arrays und Listen in Dateneingabebereiche (Datenfelder oder Variablen).

Rufen Sie DRAG AND DROP PROPERTIES auf, und es gibt kein Drag-and-Drop Ereignis, gibt Quellobjekt den Zeiger NIL zurück, Quellelement den Wert -1 und Quellprozess den Wert 0.

Tipp: 4D verwaltet automatisch die grafische Darstellung von Drag-and-Drop. Sie müssen dann in geeigneter Weise auf das Ereignis antworten. Wie Sie aus den folgenden Beispielen ersehen, ist eine Möglichkeit, die gezogenen Daten zu kopieren. Sie können alternativ dazu auch ausgeklügelte Benutzeroberflächen integrieren, wo z.B. ein per Drag-and-Drop bewegtes Array-Element aus einem Palettenfenster das Zielfenster (das Fenster, welches das Zielobjekt enthält) mit strukturierten Daten füllt (z.B. mehrere Datenfelder aus einem Datensatz, der nur von dem Element des Quell-Arrays erkannt wird).

Sie verwenden DRAG AND DROP PROPERTIES während einem Ereignis On Drag Over, um je nach Typ und Natur des Quellobjekts zu entscheiden, ob das Zielobjekt die Drag-and-Drop Operation akzeptiert. Bei Bestätigen von Drag-and-Drop gibt die Objektmethode $0:=0 zurück. Bei Annullieren von Drag-and-Drop gibt die Objektmethode $0:=-1 zurück. Dieser Vorgang wird auf dem Bildschirm grafisch dargestellt: Bei Bestätigen wird das potentielle Ziel der Drag-and-Drop Operation markiert.

Verschiedene Formulare Ihrer Datenbank enthalten rollbare Bereiche, die Sie per Drag-and-Drop von einem Teil des rollbaren Bereichs in einen anderen Teil darin manuell umsortieren wollen. Anstatt für jeden Fall einen spezifischen Code zu schreiben, können Sie eine generische Projektmethode integrieren, die all diese rollbaren Bereiche verwaltet:

  ` Verwalte Projektmethode für Drag-and-Drop im gleichen Array
  ` Verwalte Drag-and-Drop im gleichen Array ( Zeiger ) -> Boolean
  ` Verwalte Drag-and-Drop im gleichen Array ( -> Array ) -> War Drag-and-Drop im gleichen Array
 
 Case of
    :(Form event=On Drag Over)
       DRAG AND DROP PROPERTIES($vpSrcObj;$vlSrcElem;$vlPID)
       If($vpSrcObj=$1)
  ` Bestätige Drag-and-Drop, wenn aus dem gleichen Array
          $0:=0
       Else
          $0:=-1
       End if
    :(Form event=On Drop)
  ` Hole Information über das Quellobjekt für Drag-and-Drop
       DRAG AND DROP PROPERTIES($vpSrcObj;$vlSrcElem;$vlPID)
  ` Hole Nummer des Zielelements
       $vlDstElem:=Drop position
  ` Wurde das Element nicht auf sich selbst bewegt
       If($vlDstElem#$vlSrcElem)
  ` Sichere bewegtes Element in Element 0 des Array
          $1->{0}:=$1->{$vlSrcElem}
  ` Lösche das bewegte Element
          DELETE FROM ARRAY($1->;$vlSrcElem)
  ` War das Zielelement außerhalb des bewegten Elements
          If($vlDstElem>$vlSrcElem)
  ` Setze Nummer des Zielelements zurück
             $vlDstElem:=$vlDstElem-1
          End if
  ` Geschah Drag-and-Drop außerhalb des letzten Elements
          If($vlDstElem=-1)
  ` Setze Nummer des Zielelements auf ein neues Element am Ende des Array
             $vlDstElem:=Size of array($1->)+1
          End if
  ` Füge dieses neue Element ein
          INSERT IN ARRAY($1->;$vlDstElem)
  ` Setze seinen zuvor im Element Null des Array gesicherten Wert
          $1->{$vlDstElem}:=$1->{0}
  ` Das Element wird das neu ausgewählte Element des Array
          $1->:=$vlDstElem
       End if
 End case

Diese Projektmethode können Sie folgendermaßen einsetzen:

  ` Objektmethode für rollbaren Bereich in Array
 
 Case of
  `...
    :(Form event=On Drag Over)
       $0:=Handle self array drag and drop(Self)
    :(Form event=On Drop)
       Handle self array drag and drop(Self)
  ` ...
 End case

Verschiedene Formulare Ihrer Datenbank enthalten eingebbare Textbereiche, in die Sie per Drag-and-Drop Daten aus unterschiedlichen Quellen bewegen wollen. Anstatt für jeden Fall einen spezifischen Code zu schreiben, können Sie eine generische Projektmethode integrieren, die all diese eingebbaren Textbereiche verwaltet:

  ` Verwalte Projektmethode für Bewegen in Textbereich
  ` Verwalte Bewegen in Textbereich ( Zeiger )
  ` Verwalte Bewegen in Textbereich ( -> Text oder String Variable )
 
 Case of
  ` Verwende dieses Ereignis, um Drag-and-Drop zu bestätigen oder abzuweisen
    :(Form event=On Drag Over)
  ` Initialisiere $0 für Abweisen
       $0:=-1
  ` Hole Information über Quellobjekt für Drag-and-Drop
       DRAG AND DROP PROPERTIES($vpSrcObj;$vlSrcElem;$vlPID)
  ` In diesem Beispiel ist Drag-and-Drop im gleichen Objekt nicht erlaubt
       If($vpSrcObj#$1)
  ` Hole Typ der gezogenen Daten
          $vlSrcType:=Type($vpSrcObj->)
          Case of
             :($vlSrcType=Is text)
  ` OK für Textvariablen
                $0:=0
             :($vlSrcType=Is string var)
  ` String Variable ist OK
                $0:=0
             :(($vlSrcType=String array)|($vlSrcType=Text array))
  ` String und Text Arrays sind OK
                $0:=0
             :(($vlSrcType=Is LongInt)|($vlSrcType=Is real)
                If(Is a list($vpSrcObj->))
  ` Hierarchische Liste ist OK
                   $0:=0
                End if
          End case
       End if
 
  ` Zeigen Sie mit diesem Ereignis die aktuelle Drag&Drop Aktion an
    :(Form event=On Drop)
       $vtDraggedData:=""
  ` Hole Information über Quellobjekt für Drag&Drop
       DRAG AND DROP PROPERTIES($vpSrcObj;$vlSrcElem;$vlPID)
  ` Hole Typ der gezogenen Variablen
       $vlSrcType:=Type($vpSrcObj->)
       Case of
  ` Ist es ein Array
          :(($vlSrcType=String array)|($vlSrcType=Text array))
             If($vlPID#Current process)
  ` Lies Element aus der Quellprozessinstanz der Variablen
                GET PROCESS VARIABLE($vlPID;$vpSrcObj->{$vlSrcElem};$vtDraggedData)
             Else
  ` Kopiere das Array-Element
                $vtDraggedData:=$vpSrcObj->{$vlSrcElem}
             End if
  ` Ist es eine Liste
          :(($vlSrcType=Is real)|($vlSrcType=Is LongInt)
  ` Ist es eine Liste aus einem anderen Prozess
             If($vlPID#Current process)
  ` Hole Listenreferenz aus dem anderen Prozess
                GET PROCESS VARIABLE($vlPID;$vpSrcObj->;$vlList)
             Else
                $vlList:=$vpSrcObj->
             End if
  ` Existiert die Liste
             If(Is a list($vpSrcObj->)
  ` Hole Text aus dem Eintrag der entsprechenden Position
                GET LIST ITEM($vlList;$vlSrcElem;$vlItemRef;$vsItemText)
                $vtDraggedData:=$vsItemText
             End if
          Else
  ` Es ist eine String oder Text Variable
             If($vlPID#Current process)
                GET PROCESS VARIABLE($vlPID;$vpSrcObj->;$vtDraggedData)
             Else
                $vtDraggedData:=$vpSrcObj->
             End if
       End case
  ` Gibt es gerade etwas zu Bewegen (das Quellobjekt kann leer sein)
       If($vtDraggedData#"")
          $1->:=$1->+$vtDraggedData
       End if
 End case

Diese Projektmethode können Sie folgendermaßen einsetzen:

  ` Objektmethode [anyTable]aTextField
 
 Case of
  ` ...
    :(Form event=On Drag Over)
       $0:=Handle dropping to text area(Self)
 
    :(Form event=On Drop)
       Handle dropping to text area(Self)
  ` ...
 End case

Wir wollen einen Textbereich, z.B. ein Etikett, mit Daten füllen, die per Drag-and-Drop aus einer Listbox entnommen werden.

Die Objektmethode label1 lautet:

 Case of
    :(Form event=On Drag Over)
       DRAG AND DROP PROPERTIES($source;$arrayrow;$processnum)
       If($source=Get pointer("list box1"))
          $0:=0 ` Drop ist angenommen
       Else
          $0:=-1
       End if
    :(Form event=On Drop)
       DRAG AND DROP PROPERTIES($source;$arrayrow;$processnum)
       QUERY([Members];[Members]LastName=arrNames{$arrayrow})
       If(Records in selection([Members])#0)
          label1:=[Members]FirstName+" "+[Members]LastName+Char(Carriage return)+[Members]Address+
          Char(Carriage return)+[Members]City+","+" "+[Members]State+" "+[Members]ZipCode
       End if
 End case

Nun lässt sich folgende Aktion ausführen

 
EIGENSCHAFTEN 

Produkt: 4D
Thema: Drag and Drop
Nummer: 607

 
GESCHICHTE 

Geändert: 4D 2004.2

 
SIEHE AUCH 

Drop position
Einführung in Drag and Drop
Form event
GET PROCESS VARIABLE
Is a list
RESOLVE POINTER

 
ARTIKELVERWENDUNG

4D Programmiersprache ( 4D v11 SQL Release 6)
4D Programmiersprache ( 4D v14 R3)
4D Programmiersprache ( 4D v14 R2)
4D Programmiersprache ( 4D v12.4)
4D Programmiersprache ( 4D v13.5)
4D Programmiersprache ( 4D v14.3)
4D Programmiersprache ( 4D v14 R4)