versión 2004.2 (Modificado)
DRAG AND DROP PROPERTIES (srcObjeto; srcElemento; srcProceso)
Parámetro | Tipo | Descripción | |
srcObjeto | Puntero | Puntero hacia el objeto fuente de arrastrar y soltar | |
srcElemento | Numérico | Número del elemento del array arrastrado o | |
Número de la fila de la list box arrastrada o | |||
Elemento de la lista jerárquica arrastrada o | |||
-1 si el objeto arrastrado no es ni un elemento de array | |||
ni de list box ni de lista jerárquica | |||
srcProceso | Numérico | Número de proceso fuente |
Descripción
El comando DRAG AND DROP PROPERTIES le permite obtener información sobre el objeto fuente cuando un evento On Drag Over u On Drop ocurre para un objeto "complejo" (array, list box o lista jerárquica).
Generalmente, se utiliza DRAG AND DROP PROPERTIES desde dentro del método de objeto del objeto (o desde una de las subrutinas que llama) para el cual el evento On Drag Over u On Drop occure (el objeto de destino).
Importante: Los datos pueden soltarse en un objeto de formulario si la propiedad Soltable ha sido seleccionada. Igualmente, su método de objeto debe ser activado por On Drag Over y/u On Drop, para procesar estos eventos.
Después de la llamada:
El parámetro srcObjeto es un puntero hacia el objeto fuente (el objeto que ha sido arrastrado y soltado). Note que este objeto puede ser el objeto de destino (el objeto para el cual el evento On Drag Over u On Drop occure) o un objeto diferente. Arrastrar y soltar datos desde y hacia el mismo objeto es útil en los arrays y listas jerárquicas es una manera simple de permitir al usuario ordenar un array o un lista manualmente.
Si los datos arrastrados y soltados son un elemento de un array (siendo el objeto fuente un array), el parámetro srcElemento devuelve el número de este elemento. Si los datos arrastrados y soltados son una fila de un list box, el parámetro srcElemento devuelve el número de esta fila. Si los datos arrastrados y soltados son un elemento de lista (siendo el objeto fuente una lista jerárquica), el parámetro srcElemento devuelve la posición de este elemento. De lo contrario, si el objeto fuente no pertenece a ninguna de estas categorías, srcElemento es igual a -1.
Las operaciones arrastrar y soltar pueden ocurrir entre procesos. El parámetro srcProceso es igual al número del proceso al cual pertenece el objeto fuente. Es importante probar el valor de este parámetro. Usted puede responder a un arrastrar y soltar dentro del mismo proceso simplemente copiando los datos fuente en el objeto de destino. Por otra parte, cuando está tratando un arrastrar y soltar interproceso, debe utilizar el comando GET PROCESS VARIABLE para obtener los datos fuente a partir de la instancia del objeto del proceso fuente. Si el objeto fuente es un campo, debe obtener el valor del proceso fuente a través de comunicación interproceso o manejar ese caso en particular mientras responde el evento On Drag Over (ver a continuación). Sin embargo, generalmente usted implementa arrastrar y soltar en la interfaz del usuario desde variables fuente (arrays y listas) hacia áreas de entrada de datos (campos o variables).
Si llama a DRAG AND DROP PROPERTIES cuando no hay ningún evento arrastrar y soltar, srcObjeto devuelve un puntero NIL, srcElemento devuelve -1 y srcProceso devuelve 0.
Consejo: 4D administra automáticamente el aspecto gráfico de arrastrar y soltar. Entonces usted debe responder al evento de manera apropiada. En los siguientes ejemplos, la respuesta es copiar los datos que han sido arrastrados. De manera alternativa, puede implementar interfaces de usuario sofisticadas donde, por ejemplo, arrastrar y soltar un elemento de array de una ventana flotante hace que la ventana de destino se llene (la ventana donde el objeto de destino está ubicado) con datos estructurados (como varios campos que provienen de un registro único identificado por el elemento de array fuente).
Usted utiliza DRAG AND DROP PROPERTIES durante un evento On Drag Over para decidir si el objeto de destino acepta la operación arrastrar y soltar, dependiendo del tipo y/o la naturaleza del objeto fuente (o de cualquier otra razón). Si acepta arrastrar y soltar, el método de objeto debe devolver $0:=0. Si no acepta arrastrar y soltar, el método de objeto debe devolver $0:=-1. La aceptación o rechazo de arrastrar y soltar se refleja en la pantallael objeto se resalta o no como destino potencial de la operación arrastrar soltar.
Consejo: Durante un evento On Drag Over, el método de objeto del objeto de destino se ejecuta dentro del contexto del proceso del objeto fuente. Si arrastrar y soltar es interproceso y si el objeto fuente es un campo, puede aprovechar la oportunidad de este evento para copiar los datos fuentes en una variable interproceso. Al hacer esto, más adelante, durante el evento On Drop, no tendrá que iniciar una comunicación interproceso con el proceso fuente para obtener el valor del campo que fue arrastrado. Si un interproceso arrastrar y soltar involucra una variable como objeto fuente, puede utilizar el comando GET PROCESS VARIABLE durante el evento On Drop.
Ejemplos
1. En varios de los formularios de su base, hay áreas de desplazamiento donde usted quiere reordenar manualmente los elementos simplemente arrastrándolos y soltándolos al interior de cada área. En lugar de escribir código específico para cada caso, puede implementar un método de proyecto genérico que maneje todas las áreas de desplazamiento. Puede escribir un código como este:
` Método de proyecto Manejo arrastrar y soltar interno en un array ` Manejo arrastrar y soltar interno en un array ( Puntero ) -> Booleano ` Manejo arrastrar y soltar interno en un array ( -> Array ) -> Es un arrastrar y soltar interno en un array Case of : (Form event=On Drag Over) DRAG AND DROP PROPERTIES($vpSrcObj;$vlSrcElem;$vlPID) If ($vpSrcObj=$1) ` Aceptar arrastrar y soltar si es interno del array $0:=0 Else $0:=-1 End if : (Form event=On Drop) ` Obtener la información sobre el objeto fuente de arrastrar y soltar DRAG AND DROP PROPERTIES($vpSrcObj;$vlSrcElem;$vlPID) ` Obtener el número del elemento de destino $vlDstElem:=Drop position ` Si el elemento no fue soltado sobre si mismo If ($vlDstElem # $vlSrcElem) ` Guardar el elemento arrastrado en el elemento 0 del array $1->{0}:=$1->{$vlSrcElem} ` Borrar el elemento arrastrado DELETE FROM ARRAY($1->;$vlSrcElem) ` Si el elemento de destino estaba más allá del elemento arrastrado If ($vlDstElem>$vlSrcElem) ` Decremento del número del elemento de destino $vlDstElem:=$vlDstElem-1 End if ` Si arrastrar y soltar ocurre más allá del último elemento If ($vlDstElem=-1) ` Definir el número del elemento de destino para un nuevo elemento al final del array $vlDstElem:=Size of array($1->)+1 End if ` Insertar este nuevo elemento INSERT IN ARRAY($1->;$vlDstElem) ` Fijar su valor el cual fue almacenado previamente en el elemento cero del array $1->{$vlDstElem}:=$1->{0} ` El elemento se convierte en el nuevo elemento seleccionado del array $1->:=$vlDstElem End if End case
Una vez haya implementado este método de proyecto, puede utilizarlo de la siguiente forma:
` Método de objeto del área de desplazamiento anArray Case of `... : (Form event=On Drag Over) $0:=Manejo arrastrar y soltar interno en un array (Self) : (Form event=On Drop) Manejo arrastrar y soltar interno en un array (Self) ` ... End case
2. En varios de los formularios de su base, tiene áreas de texto editables en las cuales quiere arrastrar y soltar datos de varias fuentes. En lugar de escribir código específico para cada caso, puede implementar un método de proyecto genérico que maneje todas las áreas de texto editables. Puede escribir el método siguiente:
` Método de proyecto Manejo soltar en área de texto ` Manejo soltar en área de texto ( Puntero ) ` Manejo soltar en área de texto ( -> Texto o cadena variable ) Case of ` Utilice este evento para aceptar o rechazar arrastrar y soltar : (Form event=On Drag Over) ` Inicializar $0 para rechazo $0:=-1 ` Obtener la información sobre el objeto fuente de arrastrar y soltar DRAG AND DROP PROPERTIES($vpSrcObj;$vlSrcElem;$vlPID) ` En este ejemplo, no permitimos arrastrar y soltar un objeto sobre si mismo If ($vpSrcObj # $1) ` Obtener el tipo de los datos arrastrados $vlSrcType:=Type($vpSrcObj->) Case of : ($vlSrcType=Is Alpha Field) ` OK para los campos alfanuméricos $0:=0 ` Copiar el valor ahora en una variable interproceso <>vtDraggedData:=$vpSrcObj-> : ($vlSrcType=Is Text) ` OK para los campos o variables texto $0:=0 RESOLVE POINTER($vpSrcObj;$vsVarName;$vlTableNum;$vlFieldNum) ` Si es un campo If (($vlTableNum>0) & ($vlFieldNum>0)) ` Copiar el valor ahora en una variable IP <>vtDraggedData:=$vpSrcObj-> End if : ($vlSrcType=Is String Var) ` OK para las variables cadena $0:=0 : (($vlSrcType=String array) | ($vlSrcType=Text array)) ` OK para los arrays cadena y texto $0:=0 : (($vlSrcType=Is LongInt) | ($vlSrcType=Is Real) If (Is a list($vpSrcObj->)) ` OK para las listas jerárquicas $0:=0 End if End case End if ` Utilización de este evento para efectuar realmente la acción de arrastrar y soltar : (Form event=On Drop) $vtDraggedData:="" ` Obtener la información sobre el objeto fuente de arrastrar y soltar DRAG AND DROP PROPERTIES($vpSrcObj;$vlSrcElem;$vlPID) RESOLVE POINTER($vpSrcObj;$vsVarName;$vlTableNum;$vlFieldNum) ` Si es un campo If (($vlTableNum>0) & ($vlFieldNum>0)) ` Recuperamos la variable interproceso creada durante el evento On Drag Over $vtDraggedData:=<>vtDraggedData Else ` Obtener el tipo de la variable que ha sido arrastrada $vlSrcType:=Type($vpSrcObj->) Case of ` Si es un array : (($vlSrcType=String array) | ($vlSrcType=Text array)) If ($vlPID # Current process) ` Leer el elemento desde la instancia de la variable en el proceso fuente GET PROCESS VARIABLE($vlPID;$vpSrcObj->{$vlSrcElem};$vtDraggedData) Else ` Copiar el elemento del array $vtDraggedData:=$vpSrcObj->{$vlSrcElem} End if ` Si es una lista : (($vlSrcType=Is Real) | ($vlSrcType=Is LongInt)) ` Si esta es una lista de otro proceso If ($vlPID # Current process) `Obtener la lista de referencia de otro proceso GET PROCESS VARIABLE($vlPID;$vpSrcObj->;$vlList) Else $vlList:=$vpSrcObj-> End if ` Si la lista existe If (Is a list($vpSrcObj->)) `Obtener el texto del elemento del que obtuvo la posición GET LIST ITEM($vlList;$vlSrcElem;$vlItemRef;$vsItemText) $vtDraggedData:=$vsItemText End if Else ` Es una variable cadena o texto If ($vlPID # Current process) GET PROCESS VARIABLE($vlPID;$vpSrcObj->;$vtDraggedData) Else $vtDraggedData:=$vpSrcObj-> End if End case End if ` Si hay efectivamente algo para soltar (el objeto fuente puede estar vacío) If ($vtDraggedData # "") ` Verifique que la longitud de la variable de texto no pase de 32 000 caracteres If ((Length($1->)+Length($vtDraggedData))<=32000) $1->:=$1->+$vtDraggedData Else BEEP ALERT("Arrastrar y soltar no puede completarse porque el texto se volvería muy largo.") End if End if End case
Una vez haya implementado este método de proyecto, puede utilizarlo de la siguiente forma:
` Método de objeto del campo de texto [unaTabla]unTexto Case of ` ... : (Form event=On Drag Over) $0:=Manejo soltar en área de texto (Self) : (Form event=On Drop) Manejo soltar en área de texto (Self) ` ... End case
3. Queremos llenar un área de texto (por ejemplo, una etiqueta) con los datos arrastrados de una list box.
Este es el método de objeto de etiqueta1:
Case of :(Form event=On Drag Over ) DRAG AND DROP PROPERTIES($source;$arrayrow;$processnum) If ($source=Get pointer("listbox1")) $0:=0 `Se acepta soltar Else $0:=-1 `Se rechaza arrastrar End if :(Form event=On Drop ) DRAG AND DROP PROPERTIES($source;$arrayrow;$processnum) QUERY([Empleados1];[Empleados1]Apellido=arrApellidos{$arrayrow}) If (Records in selection([Empleados1])#0) etiqueta1:=[Empleados1]Nombre+" "+[Empleados1]Apellido+Char(Carriage return )+[Empleados1]Direccion+Char(Carriage return )+[Empleados1]Ciudad+","+" "+[Empleados1]Departamento+" "+[Empleados1]Codigopostal End if End case
Luego se hace posible efectuar la siguiente acción:
Ver también
Arrastrar y soltar, Drop position, Form event, GET PROCESS VARIABLE, Is a list, RESOLVE POINTER.