Este es el sitio web histórico de la documentación de 4D. La documentación se está trasladando progresivamente a developer.4d.com

Inicio

 
4D v20 R7
Arrastrar y soltar

Arrastrar y soltar  


 

4D dispone de funciones integradas que le permiten arrastrar y soltar objetos en sus formularios y aplicaciones. Es posible arrastrar y soltar un objeto sobre otro, ubicado en la misma ventana o en otra ventana. En otras palabras, usted puede arrastrar y soltar al interior de un proceso o entre diferentes procesos.

Igualmente usted puede arrastrar y soltar objetos entre formularios 4D y otras aplicaciones y viceversa. Por ejemplo, es posible arrastrar y soltar un archivo de imagen PNG en un campo imagen 4D. También es posible seleccionar texto en una aplicación de procesamiento de texto y soltarla en una variable de texto 4D o en un list box.

Finalmente, es posible soltar objetos directamente en la aplicación sin tener necesariamente un formulario de fondo. El Método base On Drop puede utilizarse para administrar la acción de arrastrar y soltar en este caso. Esto significa, por ejemplo, que puede abrir un documento 4D Write soltándolo en el icono de la aplicación 4D. Esta implementación específica se describe en la página Método base On Drop.

4D ofrece dos modos de arrastrar y soltar:

  • un modo personalizado, donde el programador maneja toda la operación de arrastrar y soltar. Este modo le permite implementar cualquier interfaz basada en arrastrar y soltar, incluidas las interfaces que no necesariamente transportan datos, pero que pueden realizar cualquier acción como abrir archivos o desencadenar un cálculo. Este modo se basa en una combinación de propiedades, eventos y comandos específicos del tema “Portapapeles”. 
  • un modo automático, donde una operación de arrastrar y soltar copia o mueve automáticamente los datos de un objeto a otro. Este modo está disponible para objetos basados en texto y (parcialmente) imágenes, y puede habilitarse simplemente al verificar una propiedad. Este modo se detalla en la sección Arrastar y soltar automático a continuación.
Almacenar los documentos 4D Write Pro en los campos objeto 4D

Implementar una interfaz personalizada de arrastrar y soltar significa combinar propiedades, eventos y, por lo general, comandos del tema “Portapapeles”. El siguiente diagrama ilustra los puntos claves de una secuencia personalizada de arrastrar y soltar:

Su implementación se basará en el siguiente escenario:

  1. En el evento On Begin Drag Over del objeto origen (con la propiedad "Arrastrable"), coloque los datos apropiados en el área de pegado con APPEND DATA TO PASTEBOARD, SET FILE TO PASTEBOARD u otros comandos del tema Portapapeles. También puede definir un icono de cursor específico mediante el comando SET DRAG ICON.
  2. En el evento On Drag Over del objeto de destino (con la propiedad "Soltable"), obtenga los tipos de datos o las firmas de datos que se encuentran en el área de trabajo con GET PASTEBOARD DATA TYPE o GET PASTEBOARD DATA y compruebe si son compatibles con el objeto de destino.
    El comando Drop position devuelve el número de elemento de la posición del elemento del elemento de destino o de la lista, si el objeto de destino es un array (es decir, un área desplazable), una lista jerárquica, un texto o un combo box, así como también el número de columna si el objeto es un list box.
    Si el objeto o elemento de destino es compatible, devuelve 0 en $0 para aceptar el soltar, de lo contrario, devuelve -1 en $0.
  3. En el evento On Drop del objeto de destino (con la propiedad "Soltable"), ejecute cualquier acción en respuesta al soltar. Si la operación de arrastrar y soltar pretende copiar los datos arrastrados, simplemente asigne los datos al objeto de destino. Si la función de arrastrar y soltar no está destinada a mover datos, sino que es una metáfora de la interfaz de usuario para una operación en particular, puede realizar lo que desee, por ejemplo, obteniendo rutas de archivos con el comando Get file from pasteboard.

Todas estas propiedades y eventos se detallan a continuación.

Para arrastrar y soltar un objeto sobre otro objeto, debe seleccionar la Propiedad arrastrable para ese objeto en la ventana de la Lista de propiedades. En una operación arrastrar y soltar, el objeto que se arrastra es el objeto fuente.

Para hacer que un objeto sea soltable, es decir que el objeto pueda ser el destino de una operación de arrastrar y soltar, debe seleccionar la propiedad soltable para ese objeto en la Lista de propiedades. En una operación arrastrar y soltar, el objeto que recibe los datos es el objeto de destino.

Nota: las propiedades adicionales Arrastrar automático y Soltar automático están disponibles para campos y variables de tipo texto, combo boxes y list boxes. La opción Soltar automático también está disponible para campos y variables tipo imagen. Pueden utilizarse para activar un modo arrastrar y soltar automático basado en copiar el contenido (la acción arrastrar y soltar ya nos es administrada por los eventos de formulario 4D). Por favor consulte el párrafo Arrastar y soltar automático al final de esta sección.

Por defecto, los objetos creados recientemente no poseen ninguna de estas propiedades. Es su decisión seleccionar estas propiedades.

Todos los objetos en un formulario de entrada o en un diálogo, pueden ser definidos como arrastrables y soltables. Los elementos individuales de un array (por ejemplo, un área de desplazamiento), los elementos de una lista jerárquica o las filas en una list box pueden ser arrastrables y soltables. Por el contrario, usted puede arrastrar y soltar un objeto sobre un elemento individual de un array o de una lista jerárquica o una línea de un list box. Sin embargo, no puede arrastrar y soltar objetos del área de detalle de un formulario de salida.

Igualmente puede administrar arrastrar y soltar en la aplicación, fuera de todos los formularios, utilizando el Método base On Drop.

Fácilmente puede crear una interfaz de usuario arrastrar y soltar, porque 4D le permite utilizar todo tipo de objeto activo (campo o variable) como objetos fuente o de destino. Por ejemplo, usted puede arrastrar y soltar un botón.

Notas:

  • Para arrastrar un texto o un botón que tiene la propiedad "arrastrable," primero debe presionar la tecla Alt (Windows) u Opción (macOS).
  • Por defecto, en el caso de campos y variables de imagen, la imagen y su referencia son arrastrados. Si usted sólo quiere arrastrar la referencia de la variable o campo, primero presione la tecla Alt (Windows) u Opción (macOS). 
  • Cuando en un objeto de tipo List box, las propiedades “Arrastrable” y “Filas desplazables” están definidas simultáneamente, la propiedad “Filas desplazables” tiene prioridad cuando se mueve una fila. En este caso no es posible arrastrarlo.

Un objeto que es arrastrable y soltable también puede ser soltable en sí mismo, a menos de que rechace la operación. Para más detalles, consulte los párrafos siguientes.

La siguiente imagen muestra la ventana de la Lista de propiedades con las propiedades Arrastrable y Soltable definidas para el objeto seleccionado:

La gestión de arrastrar y soltar por programación está basada en tres eventos de formulario: On Begin Drag Over, On Drag Over y On Drop.

Note que el evento On Begin Drag Over se genera en el contexto del objeto fuente del arrastrar mientras On Drag Over y On Drop se envían al objeto de destino únicamente.

Para que la aplicación procese estos eventos, deben haber sido seleccionados de una forma adecuada en la Lista de Propiedades para los objetos origen y destino::

El evento de formulario On Begin Drag Over es seleccionable para todos los objetos de formulario que puedan arrastrarse. Se genera en todos los casos donde el objeto tenga la propiedad Arrastrable. Puede llamarse desde el método del objeto origen o desde el método del formulario del objeto origen.

Nota: a diferencia del evento de formulario On Drag Over, On Begin Drag Over se llama dentro del contexto del objeto origen de la acción arrastrar.

El evento On Begin Drag Over es útil para preparar la acción arrastrar. Puede utilizarse para:

  • Añadir los datos y las firmas al portapapeles (por el comando APPEND DATA TO PASTEBOARD).
  • Utilizar un ícono personalizado durante la acción de arrastrar (vía el comando SET DRAG ICON).
  • Aceptar o rechazar el arrastrar vía $0 en el método del objeto arrastrado. Para indicar que la acción arrastrar es aceptada, el método del objeto fuente debe devolver 0 (cero); por lo tanto usted debe ejecutar $0:=0. Para indicar que las acciones de arrastre son rechazadas, el método o el objeto fuente debe devolver -1 (menos 1); usted debe por lo tanto ejecutar $0:=-1. Si no se devuelve resultado, 4D considera que el arrastrar es aceptado.

Los datos de 4D se colocan en el portapapeles antes de llamar al evento. Por ejemplo, en el caso de arrastre sin la acción Arrastre automático, el texto arrastrado ya está en el portapapeles cuando se llama el evento.

El evento On Drag Over se envía repetidamente al objeto de destino cuando el puntero del ratón se mueve sobre el objeto. En respuesta a este evento, usted generalmente:

  • Obtenga los datos y las firmas que se encuentran en el portapapeles (mediante el comando GET PASTEBOARD DATA).
  • Dependiendo de la naturaleza y tipo de datos en el portapapeles, usted acepta o rechaza el arrastrar y soltar.

Para aceptar arrastrar, el método del objeto de destino debe devolver 0 (cero), de manera que usted escribe $0:=0. Para rechazar el arrastrar, el método de objeto debe devolver -1 (menos uno), de manera que usted escribe $0:=-1. Durante un evento On Drag Over, 4D trata el método del objeto como una función. Si no devuelve ningún resultado, 4D asume que se acepta arrastrar.

Si acepta el arrastrar, el objeto de destino se activa. Si lo rechaza, el objeto de destino permanece inactivo. Aceptar el arrastrar no significa que los datos arrastrados sean insertados en el objeto de destino. Sólo significa que si el botón del ratón fue liberado en este punto, el objeto de destino aceptaría los datos arrastrados y el evento On Drop se arrastraría.

Si no procesa el evento On Drag Over para un objeto soltable, el objeto se activará para todas las operaciones de arrastrar, sin importar la naturaleza y tipo de los datos arrastrados.

El evento On Drag Over le permite controlar la primera fase de una operación de arrastrar y soltar. No solo puede probar si el tipo de los datos arrastrados es compatible con el objeto de destino y luego aceptar o rechazar el arrastre; usted puede simultáneamente notificar al usuario de este hecho, porque 4D activa o no el objeto de destino, en función de su decisión.

El código que maneja un evento On Drag Over debe ser corto y ejecutarse rápidamente, porque el evento es enviado repetidamente al objeto actual de destino, debido a los movimientos del ratón.

On Drop  

El evento On Drop se envía al objeto de destino (una sola vez) cuando el puntero del ratón se libera sobre el objeto. Este evento es la segunda fase de la operación arrastrar y soltar, en la cual usted realiza una operación en respuesta a la acción del usuario.

Este evento no se envía al objeto si el arrastrar no se ha aceptado durante los eventos On Drag Over. Si procesa el evento On Drag Over para un objeto y rechaza un arrastrar, no ocurre el evento On Drop. Si durante el evento On Drag Over usted ha probado la compatibilidad de tipos de datos entre los objetos fuente y destino y ha aceptado un posible soltar, no necesita probar nuevamente los datos durante On Drop. Usted ya sabe que los datos son compatibles con el objeto de destino.

Un aspecto interesante de la implementación de arrastrar y soltar es que 4D le permite hacer lo que usted quiera. Ejemplos:

  • Si un elemento de una lista jerárquica se suelta sobre un campo de tipo texto, usted puede insertar el texto del elemento de la lista al comienzo, al final, o en la mitad del campo de texto.
  • Su formulario contiene un botón de imagen de dos estados, el cual representa una canasta vacía o llena. Soltar un objeto sobre ese botón podría significar (desde el punto de vista de la interfaz del usuario) “suprimir el objeto que ha sido arrastrado y soltado en la canasta.” Acá, arrastrar y soltar no transporta datos de un punto a otro; en lugar de eso, realiza una acción.
  • Arrastrar un elemento de un array de una ventana flotante a un objeto en un formulario podría significar “mostrar en esta ventana el registro del cliente cuyo nombre usted acaba de arrastrar y soltar desde la ventana flotante listando los clientes almacenados en la base de datos”.
  • Etc.

La interfaz de arrastrar y soltar de 4D es un framework que le permite a cualquier usuario implementar todas las metáforas de interfaz de usuario que usted pueda imaginar.

Las áreas de texto (campos, variables, combo boxes y list boxes) como también objetos de imagen permiten el arrastrar y soltar automático, es decir el movimiento o copia de una selección de texto o imagen de un área a otra en un solo clic. Puede utilizarse en la misma área 4D, entre dos áreas 4D, o entre 4D y otra aplicación, por ejemplo WordPad.

Nota: en el caso de arrastrar y soltar automático entre dos áreas 4D, los datos son desplazados, en otras palabras, son eliminados del área fuente. Si quiere volver a copiar los datos, mantenga presionadas Ctrl (Windows) u Opción (OS X) durante la acción (bajo OS X, debe presionar la tecla Opción luego de iniciar arrastrar los elementos).

El arrastrar y soltar automático puede ser configurado por separado para cada objeto de un formulario vía dos opciones de la Lista de propiedades: Arrastrar automático y Soltar automático.

  • Arrastrar automático (objetos de tipo texto únicamente):cuando esta opción está seleccionada, el modo arrastrar automático se activa para el objeto. Este modo es prioritario para las imágenes, incluso si la opción Arrastrable está seleccionada. En este modo, el evento de formulario On Begin Drag Over NO se genera. Si desea "forzar" la utilización del arrastrar estándar cuando el arrastrar automático esté activo, presione la tecla Alt (Windows) u Opción (OS X) durante la operación (bajo OS X, debe presionar la tecla Opción luego de iniciar arrastrar los elementos).
    Esta opción no está disponible para las imágenes.
  • Soltar automático: Esta opción se utiliza para activar el modo soltar automático. En este modo, 4D maneja automáticamente, si es posible, la inserción de datos arrastrados de tipo texto o imagen y soltados en el objeto (los datos son pegados en el objeto). Los eventos de formulario On Drag Over y On Drop no son generados en este caso.
    En el caso de soltar datos diferentes de texto o imágenes (otro objeto 4D, archivo, etc. ) o datos complejos, la aplicación se refiere al valor de la opción Soltable: si está seleccionada, se generan los eventos de formulario On Drag Over y On Drop; de lo contrario, se rechaza el soltar. Esto también depende del valor de la opción "Prohibido soltar datos que no provengan de 4D" (ver a continuación).

A partir de la versión 11, 4D permite el arrastrar y soltar de selecciones, de objetos, o de archivos externos a 4D, como por ejemplo los archivos de imágenes. Esta posibilidad debe estar soportada por el código de la base.

En las bases convertidas de una versión anterior de 4D, esta posibilidad puede llevar a malfuncionamiento si el código existente no está adaptado. Por esta razón, una opción en las Preferencias puede utilizarse para desactivar esta función: Prohibido soltar datos que no provengan de 4D.

Esta opción se encuentra en la página Aplicación/Compatibilidad. Está seleccionada por defecto en las bases convertidas.

Cuando esta opción está seleccionada, se rechaza el soltar objetos externos en formularios 4D. Note sin embargo que la inserción de objetos externos continua siendo posible en objetos que tengan la opción Soltar automático, cuando la aplicación puede interpretar los datos soltados (texto o imagen).

En este simple ejemplo, queremos llenar un área texto con datos arrastrados de un list box basado array:



El método objeto list box contiene:

  //Método objeto: ListBox
 If(Form event code=On Begin Drag Over)
    SET TEXT TO PASTEBOARD(arrFirstname{arrFirstname}+" "+arrLastname{arrFirstname})
 End if

El método objeto área texto contiene:

  // Método objeto: label1
 If(Form event code=On Drop//Requiere la acción soltable activada de la lista de propiedades
    ARRAY TEXT($signatures_at;0)
    ARRAY TEXT($nativeTypes_at;0)
    ARRAY TEXT($formatNames_at;0)
    GET PASTEBOARD DATA TYPE($signatures_at;$nativeTypes_at;$formatNames_at)
    If(Find in array($signatures_at;"com.4d.private.text.native")#-1) // hay texto 4D en el portapapeles
       OBJECT Get pointer(Object current)->:=Get text from pasteboard
    End if
 End if

La combinación de las funcionalidades de arrastrar y soltar personalizadas y automáticas permite interfaces simples y poderosas. En este ejemplo, queremos llenar un área de texto con datos arrastrados desde un list box:

  • List box: propiedad "Arrastrable" y el evento "On Begin Drag Over" marcados
  • Área de texto: propiedad "Soltar automático" marcada.

  //método de objeto list box
 Case of
    :(Form event code=On Begin Drag Over)
       LOAD RECORD([Clients])
       $label:=[Clients]Name+Char(CR ASCII code)+[Clients]Contact+Char(CR ASCII code)+\
       [Clients]Address1+Char(CR ASCII code)+[Clients]City+", "+[Clients]State+" "+[Clients]ZipCode)
       SET TEXT TO PASTEBOARD($label)
 End case

Mover y dar formato a datos se realiza por medio de arrastrar y soltar:  

Desea que el usuario seleccione un archivo en el disco, luego lo arrastre y lo y suelte en una variable editable (de tipo objeto) para que muestre una descripción del archivo json.



En el método de objeto de la variable, simplemente escribe:

 C_LONGINT($0)
 Case of
 
    :(Form event code=On Drag Over)
  // Aceptar el evento On Drop solo si el portapapeles contiene archivos, de lo contrario rechazar.
       If(Get file from pasteboard(1)="") //no archivo en el portapapeles
          $0:=-1 //rechaza soltar
       End if
 
    :(Form event code=On Drop//Requiere la acción Soltable activada en la lista de propiedades
       C_TEXT($path_t)
       C_OBJECT(path_o)
       $path_t:=Get file from pasteboard(1)
       If($path_t#"")
          path_o:=Path to object($path_t)
       End if
 
 End case

Desea que el usuario seleccione archivos en el disco, luego arrástrelos y suéltelos en un list box para que muestre las rutas de los archivos.

En el método de objeto de list box, simplemente escribe:

 C_LONGINT($0)
 Case of
 
    :(Form event code=On Drag Over)
  //Acepte el evento On Drop solo si el portapapeles contiene archivos, de lo contrario rechácelo.
       If(Get file from pasteboard(1)#"") //at least one file dropped
          $0:=0 //aceptar soltar
       Else //no hay archivo en el portapapeles
          $0:=-1 //rechazar soltar
       End if
 
    :(Form event code=On Drop//Requiere la acción Soltable habilitada de la Lista de propiedades
       ARRAY TEXT(importedPath_at;0)
       C_TEXT($path_t)
       C_LONGINT($index_l)
       $index_l:=1
       Repeat
          $path_t:=Get file from pasteboard($index_l)
          If($path_t#"")
             APPEND TO ARRAY(importedPath_at;$path_t)
          End if
          $index_l:=$index_l+1
       Until($path_t="")
 End case

 



Ver también 

_o_DRAG AND DROP PROPERTIES
Drop position
Form event code
GET PROCESS VARIABLE
Is a list
RESOLVE POINTER
Type

 
PROPIEDADES 

Producto: 4D
Tema: Arrastrar y soltar

 
CONTENIDO DE LA PÁGINA 
 
HISTORIA 

 
ARTICLE USAGE

Manual de lenguaje 4D ( 4D v20 R7)