4D v16.3

DRAG AND DROP PROPERTIES

Inicio

 
4D v16.3
DRAG AND DROP PROPERTIES

DRAG AND DROP PROPERTIES 


 

DRAG AND DROP PROPERTIES ( srcObjeto ; srcElemento ; srcProceso ) 
Parámetro Tipo   Descripción
srcObjeto  Puntero in Puntero hacia el objeto fuente de arrastrar y soltar
srcElemento  Entero largo in 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  Entero largo in Número de proceso fuente

El comando DRAG AND DROP PROPERTIES 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. 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. Generalmente, el arrastrar y soltar en una interfaz usuario se efectúa desde las variables (arrays y listas) hacia las áreas de entrada de datos (campos o variables). 
Nota de compatibilidad: a partir de la versión 11 de 4D, se recomienda administrar las operaciones de arrastrar y soltar, especialmente interproceso, con la ayuda del evento On Begin Drag Over y de los comandos del tema .

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).

Se 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.

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

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 Tratamiento de soltar en variable Texto
  ` Tratamiento de soltar en variable Texto ( Puntero )
  ` Tratamiento de soltar en variable Texto ( -> variable texto o cadena )
 
 Case of
  ` Uso de este evento para aceptar o rechazar el arrastrar y soltar
    :(Form event=On Drag Over)
  ` Inicializar $0 para rechazar
       $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 desde un objeto hacia sí mismo
       If($vpSrcObj # $1)
  ` Obtener el tipo de los datos arrastrados
          $vlSrcType:=Type($vpSrcObj->)
          Case of
             :($vlSrcType=Is text)
  ` OK para las variables texto
                $0:=0
             :($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
 
  ` Uso 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)
  ` Obtener el tipo de los datos arrastrados
       $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 es una lista de otro proceso
             If($vlPID # Current process)
  `Obtener la referencia de la lista en el 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 cuya posición se obtuvo
                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
  ` Si hay efectivamente a soltar (el objeto fuente puede estar vacío)
       If($vtDraggedData # "")
          $1->:=$1->+$vtDraggedData
       End if
 End case

Una vez haya implementado este método de proyecto, puede utilizarlo de este forma:

  ` Método de objeto del campo de texto [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

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
Evento formulario
GET PROCESS VARIABLE
Is a list
RESOLVE POINTER

 
PROPIEDADES 

Producto: 4D
Tema: Arrastrar y soltar
Número 607

 
HISTORIA 

Modificado: 4D 2004.2

 
ARTICLE USAGE

Manual de lenguaje 4D ( 4D v16)
Manual de lenguaje 4D ( 4D v16.1)
Manual de lenguaje 4D ( 4D v16.2)
Manual de lenguaje 4D ( 4D v16.3)