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
Nota importante: Estos eventos sólo se activarán si la configuración de las acciones de arrastrar y soltar está configurada como personalizada.
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!