Crodino ha scritto:
Non ho capito bene il tuo appunto Philcattivocarattere
Adesso mi spiego e ne approfitto per aggiungere un'altra nota al codice postato. Parto con la nota al codice.
Questa parte
'tastierino
Case 96
strFiltro = strFiltro & Chr$(48)
....
Case 105
strFiltro = strFiltro & Chr$(57)
la sostituirei con un'unica condizione Case
'tastierino
Case 96 To 105
strFiltro = strFiltro & Chr$(KeyCode - 48)
'altri casi
Case 20, 16 'Caps Lock e shift (maiuscolo)
In pratica da 96 a 105 il valore numerico da sottoporre a Chr$ è il keycode diminuito di 48. Doppio beneficio: ho una riga sola di codice che devo eventualmente modificare (manutenzione del codice, la chiamano) ma soprattutto non ci sono n Case da valutare prima di arrivare a quello giusto. Situazione estrema: il keycode 105 prima di trovare il suo Case deve passare per Case 96, saltarlo, il Case 97, saltarlo, e via dicendo. Per poi fare cosa? una cosa che è molto simile in tutte le precedenti situazioni. Quando si deve usare troppo copia incolla deve scattare l'allarme: forse posso rendere il codice più flessibile. Ed in questo caso è abbanza facile.
Aspetto dell'etichetta Aggiorna
Che cosa succede quando si esce dal blocco Select Case? Avviene sempre quello che c'è nell'etichetta Aggiorna: che nel tuo caso è il semplice requery.
Non c'è bisogno che tu lo specifichi in nessuna di queste righe
Case 20, 16 'Caps Lock e shift (maiuscolo)
GoTo Aggiorna
...
Case 190, 188, 110 'punteggiatura varia
strFiltro = strFiltro & Chr$(46): GoTo Aggiorna 'chr$(46) delete
Una volta eseguito il codice che si trova all'interno del singolo Case non si passa al Case successivo, si esce dal blocco Select, andando ad eseguire quello che c'è dopo End Select. Nel tuo caso specifico Case 20, 16 può essere seguito da una riga bianca, non c'è nulla da fare se non uscire dalla Select e proseguire.
Un trattamento speciale per
Case 8 'tasto BACKSPACE
If lung = 0 Then GoTo Aggiorna
If lung = 1 Then strFiltro = "": GoTo Aggiorna
strFiltro = Left$(strFiltro, lung - 1): GoTo Aggiorna
Qui l'uso del GoTo fa la differenza, perché se non ci fosse l'ultima riga verrebbe sempre eseguita. Facciamo allora che si riscrive meglio la cosa
Case 8 'tasto BACKSPACE
If lung > 1 Then
strFiltro = Left$(strFiltro, lung - 1)
ElseIf lung = 1 Then strFiltro = ""
End If
Per riepilogare il contenuto di entrambe le mie osservazioni tutto quello che hai scritto si può riscrivere in questo modo, ottenendo lo stesso risultato.
Private Sub txtCerca_KeyUp(KeyCode As Integer, Shift As Integer)
Dim lung As Integer
lung = Len(strFiltro)
Select Case KeyCode
'tastierino
Case 96 To 105
strFiltro = strFiltro & Chr$(KeyCode - 48)
'altri casi
Case 20, 16 'Caps Lock e shift (maiuscolo)
'per sottrarlo alla Case Else
Case 46 'tasto CANC
strFiltro = ""
Me.txtCercaModello.Value = ""
Case 8 'tasto BACKSPACE
If lung > 1 Then
strFiltro = Left$(strFiltro, lung - 1)
ElseIf lung = 1 Then
strFiltro = ""
End If
Case 190, 188, 110 'punteggiatura varia
strFiltro = strFiltro & Chr$(46) 'chr$(46) delete
Case 219 'apostrofo
strFiltro = strFiltro & Chr$(39) 'chr$(39) freccia a destra
Case Else
strFiltro = strFiltro & Chr$(KeyCode)
End Select
Me.CercaElenco.Form.Requery
End Sub
Ho visto poi che fai uso dei duepunti per mantenere su una riga sola codice che andrebbe su due righe. Usa con parsimonia questo stile di scrittura del codice. (chi ha l'occhio fatto su Vb(a)(.Net) non è molto abituato a vedere più di un'istruzione in una riga, eventualmente il contrario, cioè spezzare su più righe una riga unica, se aiuta in lettura).
Si tratta di suggerimenti applicati al caso specifico ma per niente collegati a quello che stai facendo, cioè la gestione del filtro.
Con l'esecuzione in debug, una riga alla volta, puoi vedere il diverso comportamento delle due versioni e dei "salti" che fa il codice quando c'è il GoTo.