setfocus in casella di testo
Hai un problema con Excel? 
setfocus in casella di testo
di diego (utente non iscritto) data: 21/11/2012 12:46:50
in un form inserisco dati in una casella di testo a cui segue l'evento _afterupdate (dopo invio). alla fine del codice, il focus si posiziona sulla successiva casella in ordine di tabindex.
In seguito a certe casistiche, vorrei che il fuoco torni sulla prima casella di testo selezionando ciò che è stato digitato in modo da poter essere immediatamente modificato senza dover ricorrere al mouse per posizionarvi il focus.
se uso il comando setfocus, per qualsiasi altra casella di testo, alla fine del codice il fuoco va dove ho specificato, ma volendo riportare il fuoco sulla casella su cui ho appena inserito del testo, non funziona.
spero di essere stato sufficientemente chiaro.
grazie
di Vecchio Frac data: 21/11/2012 14:41:43
Sì, il problema è abbastanza noto.
Io l'ho sempre risolto imbrogliando Excel e sfruttando in aggiunta l'evento Exit della casella di testo.
Prova il codice che ti allego, se nella textbox1 non scrivi "stop" (minuscolo) il codice resterà nella textbox1 riconoscendo comunque il testo digitato, quando scriverai la parola "stop" potrai avanzare nelle textbox successive.
Option Explicit
Private Sub TextBox1_AfterUpdate()
If LCase(TextBox1) = "stop" Then
MsgBox "Ciao ciao!"
Else
MsgBox "Hai inserito " & TextBox1
End If
End Sub
Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
If LCase(TextBox1) <> "stop" Then
Cancel = True
With TextBox1
.SelStart = 0
.SelLength = Len(TextBox1)
.SetFocus
End With
End If
End Sub |
di diego (utente non iscritto) data: 21/11/2012 17:21:46
chiaramente il trucco funziona. grazie 1000.
Se è possibile ne approfitto per fare qualche domanda.
1- cosa provoca l'evento _exit?
2- cos'è Cancel?
di Vecchio Frac data: 21/11/2012 17:40:29
cit. " chiaramente il trucco funziona "
---> Meno male :)
1) l'evento _Exit non "provoca" niente, ma "si scatena", cioè viene intercettato, quando il controllo perde lo stato attivo. Solo un controllo alla volta può avere il focus, cioè lo stato attivo, e quindi il controllo precedente lo perde; nel momento in cui lo perde l'interprete va a vedere se è stato impostato del codice al verificarsi di tale evento (ossia cerca se è stata scritta una routine per nomecontrollo_Exit) e quindi lo esegue.
2) il parametro Cancel viene passato all'interprete come vedi dalla firma della routine di Exit e ha valore vero o falso:
Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
se si imposta Cancel = True allora si dice all'interprete di annullare l'uscita dal controllo, che mantiene il focus (ed è il risultato voluto in partenza). Solo che si rischia di non poter *mai* uscire dal controllo per andare a interagire con altri controlli del form se non si prevede un tappo che in questo caso è dato dal verificare il contenuto del controllo dopo l'aggiornamento; se abbiamo scritto una parola chiave (s e abbiamo inserito un numero convenzionale ad esempio 0) allora il Cancl non viene eseguito, rimane impostato a False (valore di default) e si esce come normalmente accade dal controllo.
Alles klar? ^_^
di diego (utente non iscritto) data: 21/11/2012 18:11:14
tutto chiarissimo.
Normalmente lo stato attivo deve passare in ordine di tabindex ad altri oggetti. Nelle casistiche in cui deve restare nella casella di testo, imposto la proprietà enable della lbl della casella di testo in oggetto come false.
All'nterno della sub _exit, metto il controllo per cui se txt.enable=false then cancel =true, dopodichè torno ad impostare true la proprietà enabled della lbl. E' sistema troppo grezzo? c'è qualche sistema un pò più elegante?
Di default il parametro cancel quindi è false, giusto?
di Vecchio Frac data: 21/11/2012 20:22:03
Un pochino contorto, ma può funzionare ^_^
Del resto, non ti resta che... provare e verificare. Comunque vedo che il concetto l'hai afferrato.
Hai davanti molte strategie per consentire o no lo "sblocco" della casella di testo: una variabile Public, una cella nel foglio, il colore di un controllo Label, la visibilità di una immagine, ecc. ecc.
E infine sì, Cancel è False per default come hai perfettamente intuito (anche perchè l'avevo già detto io, LOL ^_^).
Vuoi Approfondire?