CAJAS DE LISTA – ¡Di adiós a la tecla Alt!

La acción de arrastrar y soltar es una acción estándar en las interfaces informáticas. En el caso de los cuadros de lista, es necesario pulsar la tecla «Alt» para mover varios elementos simultáneamente. O más bien «era» porque, a partir de 4D v19 R7, ¡esto ya no es un requisito en absoluto!

CAJAS DE LISTA Posibilidades de arrastrar y soltar

Una interfaz más fácil de usar

Esta operación exigía, por razones técnicas e históricas, pulsar la tecla «alt» del teclado para mover varios elementos simultáneamente. Esta obligación es ahora cosa del pasado. Se trata de una mejora para el usuario, ya que este nuevo comportamiento es muy parecido al que utilizan macOS o Windows para gestionar archivos y carpetas. Los usuarios no se confundirán y esta acción será muy natural.

Y si…

Si los usuarios de las aplicaciones existentes están acostumbrados a pulsar la tecla alt mientras arrastran, no hay nada de qué preocuparse. La acción de arrastrar y soltar funcionará exactamente igual. La tecla alt será ignorada a menos que se programe algo que la tenga en cuenta para cualquier otro propósito (ej: si la tecla alt está presionada, se copiará en lugar de sólo moverse).

Primera conclusión

El nuevo comportamiento es más fácil de usar porque imita a los sistemas operativos, y la mayoría de las aplicaciones funcionan. Podríamos parar aquí, pero vamos a aprovechar para recordar algunos principios de cómo funcionan los cuadros de lista, sus propiedades y los eventos que se pueden manejar. Si te interesa, ¡continuemos!

Modos de selección. Multi-selección. y eventos

Tres modos de selección posibles

Las cajas de lista tienen tres modos de selección determinados por una propiedad de la lista de propiedades.

  • Ninguno
  • Simple
  • Múltiple

Dos posibles modos de selección múltiple.

La selección de varios elementos es posible mediante las teclas del teclado .

  • Manteniendo pulsada la tecla Mayúsculas, se puede crear una selección continua (ej: de «Chloe» a «Mike»)
  • Manteniendo pulsada la tecla Ctrl( teclaCmd en macOS), se puede crear una selección discontinua (ej:«Albert» y «John» y «Mike» y «Peter«)

Tres eventos

Se pueden gestionar tres eventos durante el «arrastrar y soltar».

  • on beginning drag over
  • on drag over
  • on drop

blank

Nota importante: Estos eventos sólo se activarán si la configuración de las acciones de arrastrar y soltar está configurada como personalizada.

blank

1 – El primero (on beginning drag over) se dispara cuando se inicia el arrastre en el listbox «fuente». En este momento, es necesario preparar «el siguiente paso», es decir, mirar lo que está seleccionado y almacenarlo de alguna manera. Esto puede ser dentro del portapapeles o en una variable del formulario, por ejemplo. Tenga en cuenta que este evento se activa sólo una vez.

If (Form event code=On Begin Drag Over)
 $drag:=New object
 // (…) put what you need in Form.drag object
 
 // put the object in a BLOB
 VARIABLE TO BLOB($drag; $blob)
 // and send the object to the PasteBoard with any signature (xxxx)
 APPEND DATA TO PASTEBOARD("xxxx"; $blob)
End if

2 – El segundo (on drag over) se dispara al pasar el ratón por encima de un listbox, pero sólo cuando ha sido precedido por un arrastre al inicio o si se puede soltar cualquier otra cosa sobre el listbox.

No es obligatorio tener en cuenta este evento, pero es beneficioso porque permite rechazar una posible «caída» que pueda producirse posteriormente.

¿Cómo hacerlo? Sólo hay que mirar el contenido de lo que puede caer. Si estás de acuerdo con lo que se puede soltar, devuelve 0 (cero) en $0. De lo contrario, devuelve -1 (menos uno), entonces la caída será rechazada (y no se generará ningún evento «on drop»)

If (Form event code=On Drag Over)
 If (Pasteboard data size("xxxx")<=0)
  $0:=-1 //reject anything that does NOT contains what is expected
 Else
  $0:=0
 End if
End if

3 – Por último, el tercero (on the drop) se genera, como su nombre indica, en el momento en que se realiza un «drop» en el listbox «destino» (que puede ser el mismo que el origen).

A partir de ese momento, se puede comprobar en qué posición se ha realizado el «drop» y realizar las operaciones necesarias en función del contenido a soltar. No olvides que el drop no es necesariamente la consecuencia lógica de un arrastre desde otro listbox (o el propio listbox). También puede ser un elemento externo, incluso ajeno a la aplicación, como un archivo o una carpeta del entorno del sistema.

if(Form event code=On Drop)
 // read pasteboard content
 GET PASTEBOARD DATA("xxxx"; $blob)
 BLOB TO VARIABLE($blob; $drag)
 // do what you need to do with the object you got
  (…)
end if

Conclusión

Toda esta información está cubierta en el ejemplo de HDI, que te invitamos a descargar para ver una implementación práctica.

¡Feliz codificación!

Roland Lannuzel
- Propietario de Producto y Experto en 4D - Después de estudiar electrónica, Roland se dedicó a la informática industrial como desarrollador y consultor, construyendo soluciones para clientes con una variedad de bases de datos y tecnologías. A finales de los años 80 se enamoró de 4D y lo ha utilizado para escribir aplicaciones de negocio que incluyen sistemas de contabilidad, facturación y correo electrónico.Eventualmente se unió a la compañía en 1997, las valiosas contribuciones de Roland incluyen el diseño de especificaciones, herramientas de prueba, demos, así como la formación y hablar con la comunidad 4D en muchas conferencias. Continúa dando forma activamente al futuro de 4D definiendo nuevas características y herramientas de desarrollo de bases de datos.