DRAG AND DROP PROPERTIES

4D - Documentation   Français   English   German   Español   English   4D v11 SQL, Comandos por temas   4D v11 SQL, Lista alfabética de comandos   4D v11 SQL, Constantes por temas   Regresar   Anterior   Siguiente

versión 2004.2 (Modificado)


DRAG AND DROP PROPERTIES (srcObjeto; srcElemento; srcProceso)

ParámetroTipoDescripción
srcObjetoPunteroPuntero hacia el objeto fuente de arrastrar y soltar
srcElementoNuméricoNú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
srcProcesoNuméricoNú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 pantalla—el 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.


4D - Documentation   Français   English   German   Español   English   4D v11 SQL, Comandos por temas   4D v11 SQL, Lista alfabética de comandos   4D v11 SQL, Constantes por temas   Regresar   Anterior   Siguiente