Précédente     TOC Contenu     Suivante                    




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,
utilisez la recherche Google pour trouver des ressources additionnelles.

Google






Haut de la page




Accueil