Version 2004.2 (Geändert)
DRAG AND DROP PROPERTIES (Quellobjekt; Quellelement; Quellprozess)
Parameter | Typ | Beschreibung | |
Quellobjekt | Zeiger | Zeiger zum Bewegen des Quellobjekts per | |
Drag&Drop | |||
Quellelement | Numerisch | Gezogene Elementnummer des Array oder | |
gezogener Eintrag der hierarchischen Liste | |||
oder -1, wenn Quellobjekt weder Array, Liste | |||
noch hierarchische Liste ist | |||
Quellprozess | Numerisch | Nummer 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
Drag and Drop, Drop position, Form event, GET PROCESS VARIABLE, Is a list, RESOLVE POINTER.