Sincronizza Indice |
Scarica il progetto |
Testo dell'articolo |
Stampa l'articolo |
Nei programmi Visual Basic, dove sono presenti vari controlli, è possibile spostare il cursore da un controllo ad un altro mediante la pressione del tasto TAB. Il programma intercetta la pressione del tasto TAB e passa il focus
all'oggetto la cui proprietà TabIndex sia successiva a quella
dell'oggetto corrente. Se l'oggetto successivo è una Label
il focus sarà passato all'oggetto successivo in ordine di TabIndex.
Vedremo in questo esempio come utilizzare un altro tasto, invece del TAB, per passare da un oggetto ad un altro, da un campo all'altro. In questo esempio utilizzeremo il tasto § per tale operazione, poiché in molte tastiere è il tasto più vicino al tasto INVIO e ciò si rivela particolarmente utile in programmi dove è necessario immettere molti dati in varie caselle di testo come i programmi di contabilità. Inseriamo all'interno di un form:
In fase di esecuzione quando l'utente preme il tasto TAB si passa dalla Casella1 alla Casella3 poiché non è possibile impostare il focus sopra una label o sopra un oggetto nascosto o disattivato come la Casella2. Il pulsante Command1 servirà per attivare e disattivare la Casella2. Scriviamo subito questo codice:
Al click sopra il pulsante Command1 la proprietà booleana
Enabled della Casella2 sarà invertita. Passerà
da True a False e viceversa. Passiamo subito al codice vero e proprio. È leggermente complicato come struttura, per cui lo analizzeremo passo dopo passo.
L'evento che sfrutteremo è la pressione di un tasto ricevuta dall'oggetto Form, valido per cui in ogni momento. Altrimenti dovremmo gestirci i singoli oggetti del form.
La variabile ProssimoTabIndex indica il TabIndex successivo a quello del controllo attuale. Qualunque controllo con TabIndex minore a ProssimoTabIndex può essere scartato con sicurezza.
La variabile ControlloNR serve soltanto per eseguire il ciclo FOR...NEXT che controllerà tutti gli elementi del form.
Questa variabile indica qual'è il controllo adatto con il TabIndex
inferiore.
La variabile ControlloEsatto indicherà il numero del controllo
che riceverà il focus.
La variabile CercaProssimoTabIndex contiene il TabIndex più basso, ma sempre maggiore del TabIndex del controllo attuale. Ogni volta che sarà controllato un elemento verrà paragonato il suo TabIndex con la variabile CercaProssimoTabIndex. Se il TabIndex è superiore alla variabile, l'elemento potrà essere scartato, altrimenti sarà aggiornato il contenuto di CercaProssimoTabIndex con il valore di TabIndex.
Innanzitutto sarà necessario controllare se il tasto premuto è il §. Se non lo è, il flusso del programma salterà alla riga 40, ovvero alla chiusura della sub.
Viene subito memorizzato il valore del TabIndex successivo a quello del controllo attuale all'interno della variabile ProssimoTabIndex. Tutti i controlli con TabIndex minore di quello contenuto in tale variabile potranno essere scartati.
Inizializza la variabile CercaProssimoTabIndex.
Inizializza la variabile ControlloEsatto.
Qui inizia il programma vero e proprio.
Se il controllo in analisi è una Label esso dovrà essere
saltato.
Quest'istruzione With serve soltanto per facilitare la scrittura del
codice.
Se il controllo ha la proprietà TabStop impostata a True, è attivato ed anche visibile si potrà continuare, altrimenti il controllo in esame sarà evitato.
Questo è il primo controllo degli elementi.
Avendo trovato il nostro controllo, aggiorniamo il contenuto della variabile ControlloEsatto poiché essa all'uscita del ciclo FOR...NEXT dovrà contenere il numero dell'oggetto a cui donare il focus.
A questo punto è inutile continuare l'analisi.
Questa riga viene eseguita soltanto se il TabIndex del controllo in analisi è diverso da ProssimoTabIndex. Se il controllo in esame ha un TabIndex inferiore a quello della variabile potrà essere saltato tranquillamente, poiché stiamo eseguendo un passaggio di campo in avanti e non all'indietro, per cui il TabIndex, per essere ritenuto adatto dovrà essere maggiore di ProssimoTabIndex.
La variabile CercaProssimoTabIndex conterrà il TabIndex
più basso trovato durante l'esecuzione del ciclo FOR...NEXT. Si
andrà per tentativi. Si vaglieranno tutti i controlli fino a trovare
quello con il TabIndex più basso, ma consecutivo a ProssimoTabIndex.
Trovato questo candidato, cambiamo il contenuto della variabile CercaProssimoTabIndex con il valore dela proprietà TabIndex del controllo in esame. Nei cicli successivi, se dovesse esserci un controllo con TabIndex inferiore, verrà diminuito questo valore, così alla fine di tutti i cicli, il valore contenuto nella variabile CercaProssimoTabIndex sarà con sicurezza il TabIndex del controllo che riceverà il focus.
Man mano che CercaProssimoTabIndex diminuisce di valore, viene aggiornata anche la variabile ControlloEsatto. Essa servirà per indicare il numero del controllo con il TabIndex più basso.
Un caso a parte è la prima esecuzione del ciclo FOR...NEXT. Sarà la riga 24 che controllerà se gli altri controlli avranno un TabIndex inferiore a quello analizzato per primo.
Ed ecco che il primo controllo (ovvero quando la variabile CercaProssimoTabIndex è inferiore a 0) viene ritenuto valido per ricevere il focus.
E con questa riga viene pure memorizzato il numero del controllo, che per primo, potrebbe essere il controllo che riceverà il focus.
Questa riga chiude i due controlli: quello della riga 24, con TabIndex inferiore a CercaProssimoTabIndex e quello del primo ciclo, ovvero con CercaProssimoTabIndex inferiore a 0 (riga 27).
Questa chiusura si riferisce all'uscita del controllo effettuato alla riga 20 o alla riga 23.
Con questa riga, eseguita ogni volta, memorizziamo nella variabile ControlloPrimoTab il numero del controllo con il TabIndex più basso in assoluto, anche più basso di quello su cui è stato premuto il tasto TAB.
Questo valore ci servirà nel caso ci trovassimo sull'ultimo controllo ed un'ulteriore pressione del tasto TAB richiederebbe che il focus passasse al primo oggetto attivo.
Questa riga chiude il controllo effettuato alla riga 19, ovvero quello della validità del controllo in esame. Un controllo disabilitato, nascosto, o con TabStop impostato a False non viene neanche analizzato.
Da qui in poi non verrà utilizzato il controllo preso in esame come oggetto predefinito nei riferimenti. Questa riga chiude quella aperta alla riga 18.
Questa riga chiude la riga 17 di controllo del tipo di oggetto. Se l'oggetto in esame fosse stato una Label, il flusso sarebbe passato direttamente in questa riga, evitando tutti i controlli visti in precedenza. Ricordiamo che le Label non possono ricevere il focus.
Qui si chiude il ciclo FOR...NEXT.
Questa riga controlla se la variabile ControlloEsatto contiene ancora il valore -1 dato nell'inizializzazione. La presenza di tale valore indica che non si è trovato nessun
candidato a ricevere il focus, quindi ci troviamo sull'ultimo controllo
del form. Qui abbiamo finito tutti i controlli del caso. Adesso abbiamo con sicurezza
trovato il numero del controllo con il TabIndex successivo a quello del
controllo corrente, oppure abbiamo il numero del controllo con TabIndex
più basso.
Ed ecco finalmente la promozione!
Prima di uscire dalla funzione ricordiamoci di azzerare il tasto premuto, altrimenti se il controllo attivo fosse una casella di testo, essa riceverebbe il carattere § e lo scriverebbe nel suo testo. Quest'ultima istruzione assicura che il tasto premuto non venga scritto.
Qui si chiude il primo controllo fatto all'inizio della funzione (riga 12), ovvero il controllo del tasto premuto.
E qui finalmente si chiude la nostra Sub. All'uscita d'essa sicuramente
il controllo attivo sarà quello successivo a quello sopra il quale
è stato premuto il tasto TAB. |
Abbiamo adottato questa soluzione perché, anche se un po' complessa,
comprende tutti i controlli del caso. Giuseppe
Della Bianca
|
Torna all'indice degli HowTo |