DRAG AND DROP PROPERTIES

4D - Documentation   Français   English   German   Spanish   Japanese   4D Programmiersprache, Befehle nach Themen   4D Programmiersprache, Befehle alphabetisch   4D Programmiersprache, Konstanten nach Themen   Back   Previous   Next

Version 2004.2 (Geändert)


DRAG AND DROP PROPERTIES (Quellobjekt; Quellelement; Quellprozess)

ParameterTypBeschreibung
QuellobjektZeigerZeiger zum Bewegen des Quellobjekts per
Drag&Drop
QuellelementNumerischGezogene Elementnummer des Array oder
gezogener Eintrag der hierarchischen Liste
oder -1, wenn Quellobjekt weder Array, Liste
noch hierarchische Liste ist
QuellprozessNumerischNummer des Quellprozesses

Beschreibung

Mit dem Befehl DRAG AND DROP PROPERTIES können Sie Informationen über das Quellobjekt abfragen, 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&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&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&Drop bewegte Wert eine Zeile einer Listbox, gibt der Parameter Quellelement die Nummer dieser Zeile zurück. Ist der per Drag&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&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&Drop Operation im selben Prozess durch einfaches Kopieren der Quelldaten in das Zielobjekt antworten. Bei einer Drag&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&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&Drop Ereignis, gibt Quellobjekt den Zeiger NIL zurück, Quellelement den Wert -1 und Quellprozess den Wert 0.

Tipp: 4th Dimension verwaltet automatisch die grafische Darstellung von Drag&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&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&Drop Operation akzeptiert. Bei Bestätigen von Drag&Drop gibt die Objektmethode $0:=0 zurück. Bei Annullieren von Drag&Drop gibt die Objektmethode $0:=-1 zurück. Dieser Vorgang wird auf dem Bildschirm grafisch dargestellt. Bei Bestätigen wird das potentielles Ziel der Drag&Drop Operation markiert.

Tipp: Während einem Ereignis On Drag Over wird die Objektmethode des Zielobjekts in der Prozessumgebung des Zielobjekts ausgeführt. Ist das Quellobjekt einer Drag&Drop Operation auf Interprozessebene ein Datenfeld, können Sie über dieses Ereignis die Quelldaten in eine Interprozessvariable kopieren. So müssen Sie später während dem Ereignis On Drop nicht mit dem Quellprozess eine Interprozesskommunikation starten, um den Wert des gezogenen Datenfeldes zu erhalten. Enthält die Drag&Drop Operation auf Interprozessebene eine Variable als Quellobjekt, können Sie während dem Ereignis On Drop den Befehl GET PROCESS VARIABLE einsetzen.

Beispiele

1. Verschiedene Formulare Ihrer Datenbank enthalten rollbare Bereiche, die Sie per Drag&Drop 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&Drop im gleichen Array  
      ` Verwalte Drag&Drop im gleichen Array ( Zeiger ) -> Boolean
      ` Verwalte Drag&Drop im gleichen Array ( -> Array ) -> War Drag&Drop im gleichen Array

   Case of 
      : (Form event=On Drag Over)
         DRAG AND DROP PROPERTIES($vpSrcObj;$vlSrcElem;$vlPID)
         If ($vpSrcObj=$1)
            ` Bestätige Drag&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&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 ELEMENT($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&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 ELEMENT($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 

2. Verschiedene Formulare Ihrer Datenbank enthalten eingebbare Textbereiche, in die Sie per Drag&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&Drop zu bestätigen oder annullieren
      : (Form event=On Drag Over)
            ` Initialisiere $0 für Annullieren    
         $0:=-1
            ` Hole Information über Quellobjekt für Drag&Drop
         DRAG AND DROP PROPERTIES($vpSrcObj;$vlSrcElem;$vlPID)
            ` In diesem Beispiel ist Drag&Drop im gleichen Objekt nicht erlaubt
         If ($vpSrcObj # $1)
               ` Hole Typ der gezogenen Daten    
            $vlSrcType:=Type($vpSrcObj->)
            Case of 
               : ($vlSrcType=Is Alpha Field)
                     ` Alphanumerisches Feld ist OK                    
                  $0:=0                     ` Kopiere Wert nun in eine Interprozessvariable
                  <>vtDraggedData:=$vpSrcObj->
               : ($vlSrcType=Is Text)
                     ` Textfeld oder Variable ist OK          
                  $0:=0
                  RESOLVE POINTER($vpSrcObj;$vsVarName;$vlTableNum;$vlFieldNum)
                     ` Ist es ein Feld
                  If (($vlTableNum>0) & ($vlFieldNum>0))
                        ` Kopiere Wert nun in eine Interprozessvariable            
                     <>vtDraggedData:=$vpSrcObj->
                  End if 
               : ($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)
         RESOLVE POINTER($vpSrcObj;$vsVarName;$vlTableNum;$vlFieldNum)
            ` Ist es ein Feld
         If (($vlTableNum>0) & ($vlFieldNum>0))
               ` Kopiere die während dem Ereignis On Drag Over gesetzten Interprozessvariablen
            $vtDraggedData:=<>vtDraggedData
         Else 
               ` 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 Eintrag($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 
         End if 
            ` Gibt es gerade Etwas zu Bewegen (das Quellobjekt kann leer sein)
         If ($vtDraggedData # "")
               ` Prüfe, dass die Länge der Textvariablen weniger als 32.000 Zeichen enthält   
            If ((Length($1->)+Length($vtDraggedData))<=32000)
               $1->:=$1->+$vtDraggedData
            Else 
               BEEP
               ALERT("Drag&Drop kann nicht abgeschlossen werden, da Text zu lang ist.")
            End if 
         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 

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

 Der Inhalt der Listbox wird aus der Tabelle [Members] erzeugt.

Die Eigenschaften On Drag Over und On Drop event sind für das Formular markiert,

 Die Eigenschaft On Drop ist für den Textbereich markiert.

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

Referenz

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

Anwendung des Befehls

Drag and Drop Data between 4D and Excel


4D - Documentation   Français   English   German   Spanish   Japanese   4D Programmiersprache, Befehle nach Themen   4D Programmiersprache, Befehle alphabetisch   4D Programmiersprache, Konstanten nach Themen   Back   Previous   Next