L’azione di trascinamento è un’azione standard nelle interfacce informatiche. Nel caso delle caselle di riepilogo, per spostare più elementi contemporaneamente è necessario premere il tasto “Alt”. O meglio “era” perché, a partire da 4D v19 R7, questo non è più un requisito necessario!
CASELLE DI ELENCO Possibilità di trascinamento
Un’interfaccia più semplice da usare
Per motivi tecnici e storici, questa operazione richiedeva la pressione del tasto “alt” sulla tastiera per spostare più elementi contemporaneamente. Questo obbligo appartiene ormai al passato. Si tratta di un miglioramento per l’utente, perché il nuovo comportamento è molto simile a quello utilizzato da macOS o Windows per gestire file e cartelle. Gli utenti non si confonderanno e questa azione sarà molto naturale!
E se…
Se gli utenti delle applicazioni esistenti sono abituati a premere il tasto alt durante il trascinamento, non c’è nulla di cui preoccuparsi. Il trascinamento funzionerà esattamente nello stesso modo. Il tasto alt verrà ignorato, a meno che non si programmi qualcosa che lo tenga in considerazione per qualsiasi altro scopo (ad esempio, se il tasto alt è abbassato, verrà eseguita la copia invece del semplice spostamento).
Prima conclusione
Il nuovo comportamento è più facile da usare perché imita i sistemi operativi e la maggior parte delle applicazioni funziona. Potremmo fermarci qui, ma cogliamo l’occasione per ricordare alcuni principi di funzionamento delle caselle di riepilogo, le loro proprietà e gli eventi che possono essere gestiti. Se siete interessati, continuate pure!
Modalità di selezione. Selezione multipla ed eventi
Tre possibili modalità di selezione
Le caselle di riepilogo hanno tre modalità di selezione determinate da una proprietà dell’elenco di proprietà.
- Nessuna
- Singola
- Multipla
Due possibili modalità di selezione multipla.
È possibile selezionare più elementi utilizzando i tasti della tastiera .
- Tenendo premuto il tasto shift, è possibile creare una selezione continua(ad esempio, da “Chloe” a “Mike”).
- Tenendo premuto il tasto Ctrl( tastoCmd su macOS), è possibile creare una selezione discontinua(ad esempio: “Albert” e “John” e “Mike” e “Peter”).
Tre eventi
Durante il “trascinamento” è possibile gestire tre eventi.
- on beginning drag over
- on drag over
- on drop
Nota importante: questi eventi vengono attivati solo se le impostazioni delle azioni per trascinabile e rilasciabile sono impostate su personalizzate.
1 – Il primo (on beginning drag over) viene attivato quando inizia il trascinamento nella casella di riepilogo “sorgente”. A questo punto, è necessario preparare “il passo successivo”, cioè guardare ciò che è stato selezionato e memorizzarlo in qualche modo. Ad esempio, può essere all’interno degli appunti o in una variabile del modulo. Si noti che questo evento viene attivato una sola volta.
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 – Il secondo (on drag over) viene attivato al passaggio del mouse su una casella di riepilogo, ma solo se è stato preceduto da un trascinamento iniziale o se è possibile far cadere qualsiasi altra cosa sulla casella di riepilogo.
Non è obbligatorio considerare questo evento, ma è vantaggioso perché permette di rifiutare una possibile “caduta” che potrebbe verificarsi in seguito.
Come fare? È sufficiente osservare il contenuto di ciò che è probabile che venga abbandonato. Se si è a posto con ciò che può essere lasciato cadere, si restituisce 0 (zero) in $0. Altrimenti, si restituisce -1 (meno uno), quindi il rilascio sarà rifiutato (e non sarà generato alcun 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 – Infine, il terzo (on the drop) viene generato, come indica il nome, nel momento in cui viene effettivamente eseguito un “drop” sulla listbox “target” (che può essere la stessa dell’origine).
Da quel momento in poi, è possibile verificare in quale posizione è stato effettuato il rilascio ed eseguire le operazioni necessarie a seconda del contenuto da rilasciare. Non dimenticate che la caduta non è necessariamente la conseguenza logica di un trascinamento da un’altra casella di riepilogo (o dalla casella di riepilogo stessa). Può anche trattarsi di un elemento esterno, persino esterno all’applicazione, come un file o una cartella dell’ambiente di 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
Conclusione
Tutte queste informazioni sono contenute nell’esempio HDI, che vi invitiamo a scaricare per vedere un’implementazione pratica.
Buona codifica!