|
|
|
|
Notes de cours 5 Validation des données Validation signifie s'assurer que les valeurs entrées sont bonnes. On valide afin de s'assurer qu'on passe des valeurs correctes aux calculs et pour éviter de faire "crasher" l'application. Par exemple, si on entre une donnée qui n'est pas numérique, la procédure de calcul va s'arrêter sur une erreur de "Type mismatch" et l'utilisateur restera en panne. Le MsgBox function Lors de la validation vous allez probablement utiliser la fonction MsgBox( ) souvent. Le MsgBox que nous avons utilisé jusqu'à maintenant est le plus simple possible. Il y a d'autres versions du MsgBox qui vous permettent de préciser les intentions de l'utilisateur. Par exemple:
DIM intMsg AS Integer
intMsg = MsgBox("Erreur dans valeur", vbOKCancel) If intMsg = 1 Then txtValeur.SetFocus Else Exit Sub End If Si intMsg est 1, l'utilisateur a cliqué sur OK et on obtient une nouvelle valeur. Si intMsg est 2, l'utilisateur a fait Cancel et on veut quitter la procédure. Les constantes qui sont utilisées:
vbOkOnly
vbOkCancel vbAbortRetryIgnore vbYesNoCancel vbYesNo vbRetryCancel et les valeurs retournées: 1 vbOk Ok 2 vbCancel Cancel 3 vbAbort Abort 4 vbRetry Retry 5 vbIgnore Ignore 6 vbYes Yes 7 vbNo No Pour plus d'information au sujet de la fonction et de la valeur des constantes, voyez: MsgBox function dans le Help. Il y a 4 événements qui sont généralement utilisés pour faire la validation:
le _Change le _KeyPress le _LostFocus le _Validate Le "Change event" À noter au sujet de Change: l'événement Change est invoqué à chaque changement qu'on fait: entrer un caractère est un changement donc, Change s'exécute à chaque caractère qu'on frappe. Voici un exemple de Change:
DIM intRep AS Integer
Private Sub txtHeures_Change()
If Not IsNumeric(txtHeures.Text) Then
intRep = MsgBox ("Doit être numérique", vbOKCancel)
End If
If intRep = vbCancel Then
Exit Sub
End If
End Sub
Le problème avec cette structure est que la lettre est affichée et il faut l'enlever avant de continuer. Il y a un autre événement qu'on pourrait utiliser qui est plus facile: le KeyPress Le "KeyPress event" Le KeyPress saisi le code ASCII de la touche frappée, avant qu'elle soit affichée dans le TextBox. Donc, on peut la vérifier et l'ignorer si elle n'est pas bonne. L'exemple illustre comment on valide dans un "control array". ![]()
Private Sub txtHeures_KeyPress(Index As Integer, KeyAscii As Integer)
'les chiffres 0 à 9 ont les codes ASCII 48 à 57
'43 est le signe +, 45 est le signe - et 46 est le point .
If (KeyAscii < 48 Or KeyAscii > 57) _
And Not KeyAscii = 43 _
And Not KeyAscii = 45 _
And Not KeyAscii = 46 Then
KeyAscii = 0
End If
End Sub
Voici comment on ferait la même chose avec Change
Private Sub txtHeures_Change(Index As Integer)
If Not IsNumeric(txtHeures(Index)) Then
MsgBox ("Doit être numérique")
End If
End Sub
Le "Validate event" Le TextBox a une propriété CausesValidation qui peut être True ou False. Si elle est True, le Validate event sera invoqué dès que j'essaie de quitter la boîte. Si je décide de ne pas valider, en réponse à une question, par exemple, je peux mettre le CausesValidation à False. Voici un exemple de Validate avec un TextBox individuel:
Private Sub txtHeures_Validate(Cancel As Boolean)
If txtHeures < 0 Or txtHeures > 100 Then
MsgBox ("Doit être un nombre entre 0 et 100")
Cancel = True
End If
End Sub
Voici le Validate si le TextBox fait partie d'un control array - il faut inclure l'index:
Private Sub txtHeures_Validate(Index As Integer, Cancel As Boolean)
If txtHeures(Index) < 0 Or txtHeures(Index) > 100 Then
MsgBox ("Doit être un nombre entre 0 et 100")
Cancel = True
End If
End Sub
"Cancel = True" sert à garder le focus dans le champ actuel.Donc, tant qu'il y a une erreur l'utilisateur ne peut pas quitter le TextBox. On se sert aussi du Validate pour valider si la donnée entrée est une date avant d'aller plus loin:
Private Sub txtDate_Validate(Cancel As Boolean)
If Not IsDate(txtDate.Text) Then
MsgBox ("Doit être une date valide")
Cancel = True
End If
End Sub
Le "GotFocus event" et le "LostFocus event" Voici comment on pourrait utiliser _GotFocus et _LostFocus pour changer la couleur de la boite, par exemple:
Private Sub txtHeures_GotFocus()
txtHeures.BackColor = RGB(0, 0, 128)
txtHeures.ForeColor = RGB(255, 255, 255)
End Sub
Private Sub txtHeures_LostFocus()
txtHeures.BackColor = RGB(255, 255, 255)
txtHeures.ForeColor = 0
End Sub
Ou bien ceci pour sélectionner le texte déjà dans le TextBox
- très utile quand on ne veut pas avoir a éffacer
le 0 initial avant de pouvoir entrer la valeur.
Private Sub txtHeures_GotFocus()
txtHeures.SelStart = 0
txtHeures.SelLength = Len(txtHeures.Text)
End Sub
Il est aussi possible de combiner ces fonctions dans une procédure et, en plus, utiliser le terme générique ActiveControl pour rendre la procédure encore plus utile. Le terme ActiveControl, comme son nom l'indique, réfère au control actif en ce moment, sans avoir à le nommer. J'appelle la procédure de sortie dans Validate plutôt que LostFocus parce qu'avec LostFocus, le ActiveControl est déjà disparu au moment ou l'événement est invoqué.
Private Sub txtHeures_GotFocus(Index As Integer)
FocusIn
End Sub
Private Sub txtHeures_Validate(Index As Integer, Cancel As Boolean)
If txtHeures < 0 Or txtHeures > 100 Then
MsgBox ("Doit être un nombre entre 0 et 100")
Cancel = True
End If
FocusOut
End Sub
Private Sub FocusIn()
ActiveControl.BackColor = RGB(0, 128, 0)
ActiveControl.ForeColor = RGB(255, 255, 255)
ActiveControl.SelStart = 0
ActiveControl.SelLength = Len(ActiveControl.Text)
End Sub
Private Sub FocusOut()
ActiveControl.BackColor = RGB(255, 255, 255)
ActiveControl.ForeColor = 0
End Sub
Finalement, notons qu'il y a certaines erreurs qui ne peuvent pas être valider par les événements des TextBox. Par exemple, si je veux m'assurer que tous les TextBox ont été remplis, je ne peux pas mettre le code dans le Validate ou le Change du TextBox car si l'utilisateur n'a pas touché ces boîtes, les événements ne seront jamais invoqués.Il faut donc mettre ces validations dans le bouton Calcul, par exemple.
Si vous ne voyez pas içi ce que vous cherchez en Visual Basic,
|