Newsgroup: it.comp.appl.access
Titolo: inserimento ora controllo

salve
ho una casella di testo dove attendo che l'utente inserisca l'ora
 
vorrei che l'utente inserisse dei dati sensati:
 
ho definito 
 
 
come proprietà
 
Inputmask: "00:00;0;_" 
Format: Ora breve
 
 
come posso migliorare impadendo all'utente di inserire es. 25:79
 
e non venga solo segnalato errore nel lostfocus?


Chiarisci cosa intendi... perchè qualsiasi controllo cade nella verifica formato..., a meno di non controllare il KEYPRESS...
 
?IsDate("25:00")
Falso
?IsDate("23:59")
Vero
 
Se invece vuoi controllare mentre si digita... allora la cosa cambia... e devi scrivere 4 righe di codice analizzando il KEYPRESS in relazione alla posizione del KEY... che rilevi con Len(Controllo.Text) nell'evento KeyPress... ma non è così semplicissimo... ma nemmeno terribile.
 
Una cosa simile buttata giù molto velocemente, consente di inserire solo il formato hh:mm ma controlla anche il Numero digitato... 
 
 
Option Compare Database
Option Explicit
 
Public Function CkDgtNumber(KeyAscii As Integer, _
                        nMin As Integer, _
                        nMax As Integer) As Integer
    '=========================================
    'Verifica che venga inserito un NUMERO
    'dove nmax =Numero Limite
    'Da inserire nell'EVENTO KEY_PRESS
    '48-57
    '=========================================
    CkDgtNumber = 30
    If KeyAscii >= 48 + nMin And _
        KeyAscii <= 48 + nMax Then CkDgtNumber = KeyAscii
    Select Case KeyAscii
        Case 44, 45
            CkDgtNumber = KeyAscii
        Case vbKeyBack, vbKeyTab, vbKeyClear, vbKeyReturn
            CkDgtNumber = KeyAscii
        Case vbKeyEscape, vbKeyDelete, vbKeyNumlock
            CkDgtNumber = KeyAscii
    End Select
End Function
 
 
Private Sub Testo0_KeyPress(KeyAscii As Integer)
    Select Case KeyAscii
        Case vbKeyBack, vbKeyTab, vbKeyClear, vbKeyReturn
            KeyAscii = KeyAscii
        Case vbKeyEscape, vbKeyDelete, vbKeyNumlock
            KeyAscii = KeyAscii
        Case Else
            Select Case Len(Me.Testo0.Text)
                Case 0
                    KeyAscii = CkDgtNumber(KeyAscii, 1, 2)
                Case 1
                    If Right(Me.Testo0.Text, 1) = "1" Then
                        KeyAscii = CkDgtNumber(KeyAscii, 0, 9)
                    Else
                        KeyAscii = CkDgtNumber(KeyAscii, 0, 3)
                    End If
                Case 2
                    If KeyAscii <> 58 Then KeyAscii = 30
                Case 3
                    KeyAscii = CkDgtNumber(KeyAscii, 0, 5)
                Case 4
                    KeyAscii = CkDgtNumber(KeyAscii, 0, 9)
            End Select
    End Select
End Sub
 
@Alex

Scritta un po meglio, con qualche correzione:
 
' ------------------------------------------
' Nella FORM
' ------------------------------------------
Option Compare Database
Option Explicit
 
Private Sub NomeTextbox_KeyPress(keyAscii As Integer)
    keyAscii = CheckTime(Me.NomeTextbox, keyAscii)
End Sub
 
 
' ------------------------------------------
' In un modulo BAS
' ------------------------------------------
Option Compare Database
Option Explicit
 
Public Function CkDgtNumber(keyAscii As Integer, _
                        nMin As Integer, _
                        nMax As Integer) As Integer
    '=========================================
    'Verifica che venga inserito un NUMERO
    'dove nmax =Numero Limite
    'Da inserire nell'EVENTO KEY_PRESS
    '48-57
    '=========================================
    CkDgtNumber = 30
    If keyAscii >= 48 + nMin And _
        keyAscii <= 48 + nMax Then CkDgtNumber = keyAscii
    Select Case keyAscii
        Case 44, 45
            CkDgtNumber = keyAscii
        Case vbKeyBack, vbKeyTab, vbKeyClear, vbKeyReturn
            CkDgtNumber = keyAscii
        Case vbKeyEscape, vbKeyDelete, vbKeyNumlock
            CkDgtNumber = keyAscii
    End Select
End Function
 
Public Function CheckTime(ctl As Access.Control, keyAscii As Integer) As Integer
    Select Case keyAscii
        Case vbKeyBack, vbKeyTab, vbKeyClear, vbKeyReturn
            CheckTime = keyAscii
        Case vbKeyEscape, vbKeyNumlock
            CheckTime = keyAscii
        Case Else
            Select Case Len(ctl.Text)
                Case 0
                    CheckTime = CkDgtNumber(keyAscii, 0, 2)
                Case 1
                    If Val(Right(ctl.Text, 1)) < 1 Then
                        CheckTime = CkDgtNumber(keyAscii, 0, 9)
                    Else
                        CheckTime = CkDgtNumber(keyAscii, 0, 3)
                    End If
                Case 2
                    CheckTime = keyAscii
                    If keyAscii <> 58 Then CheckTime = 30
                Case 3
                    CheckTime = CkDgtNumber(keyAscii, 0, 5)
                Case 4
                    CheckTime = CkDgtNumber(keyAscii, 0, 9)
            End Select
    End Select
 
End Function
 
 
@Alex