GestionErreurs [Résolu]

Signaler
Messages postés
37
Date d'inscription
mercredi 7 mars 2007
Statut
Membre
Dernière intervention
9 octobre 2009
-
Messages postés
1883
Date d'inscription
samedi 1 avril 2006
Statut
Membre
Dernière intervention
20 novembre 2007
-
Bonsoir à tous,

Je n'arrive pas à coder ce qu'il faut dans : Private Sub txtDate_LostFocus(Index As Integer) , à partir de GestionErreurs.

Voici le code de la forme :

Option Explicit

''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' Test évènements et méthodes couche présentation :
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''



' Indexes du groupe de controle hsbDate.
Private Enum enuCtlScrollBar
    Jour
    Mois
    Annee
End Enum



' Indexes du groupe de controle txtDate.
Private Enum enuCtlTxt
    Jour
    Mois
    Annee
End Enum


' Constantes pour HScrollBar.
Private Const JOUR_MIN As Integer = 1
Private Const JOUR_MAX As Integer = 31  ' 31 jours en Janvier.
Private Const MOIS_MIN As Integer = 1   ' Janvier.
Private Const MOIS_MAX As Integer = 12
Private Const ANNEE_MIN As Integer = 1000
Private Const ANNEE_MAX As Integer = 3000





' Evenement : Form_Load
' INPUT : NU.
' OUTPUT : NU.
' FONCTION : Au chargement de la FORM, on initialise les contrôles HScrollBar.
' Cette initialisation déclenche l'événement hsbDate_Change de chaque contrôle HScrollBar,
' ce qui initialise donc l'ensemble des contrôles.



Private Sub Form_Load()
'Initialise les contrôles HScrollBar
hsbDate(0) = JOUR_MIN
hsbDate(1) = MOIS_MIN
hsbDate(2) = ANNEE_MIN
End Sub' Form_Load



' Evenement : hsbDate_Change
' INPUT : NU.
' OUTPUT : NU.
' FONCTION : Quand 1 controle HScrollBar change, on rafraichi l'ensemble des controles.
' HScrollBar change suite a :
'   - une action utilisateur,
'   - une modification par programme par txtDate_LostFocus(),
'   _ une modification de sa valeur MAX par Form_Load().


Private Sub hsbDate_Change(Index As Integer)


txtDate(Index) = hsbDate(Index)


lblSigneTexte = TrouverNomSigne(hsbDate(0), hsbDate(1))
lblJourNaissance = CalculerJourNaissance(hsbDate(0), hsbDate(1), hsbDate(2))
lblPlageDateSigne = TrouverPlageDate(lblSigneTexte)
imgSigneImage = TrouverImageSigneZodiaque(lblSigneTexte)



End Sub



' Evenement : txtDate_LostFocus
' INPUT : NU.
' OUTPUT : NU.
' FONCTION : Cet evenement est declenche quand l'utilisateur a modifie
'   une des 3 TextBox et que le focus sur ce controle est perdu.
'   On verifie la saisie,
'   - si elle est correcte on ajuste la HScroolBar de meme type jour(0), mois(1) ou annee(2),
'       Ce qui declenchera l'evenement hsbDate_Change et donc rafraichira l'ensemble
'       des controles.


Private Sub txtDate_LostFocus(Index As Integer)
    If VerifierSaisie(txtDate(Index), hsbDate(Index).Min, hsbDate(Index).Max) = 1 Then
    hsbDate(Index) = txtDate(Index)
    Else
    GestionErreurs '  ===> Je ne sais pas quoi définir dans GestionErreurs afin que cela fonctionne
    End If
End Sub



' Rafraichir_Controles
' INPUT : NU.
' OUTPUT : NU.
' FONCTION : Rafraichi l'ensemble des controles.
'   Le rafraichissement des controles lblPlageDateSigne et imgSigneImage
'   doit etre fait apres le rafraichissement du controle lblSigneTexte, dans la
'   mesure ou on utilise la valeur de ce dernier pour rafraichir les 2 precedents.

Private Sub Rafraichir_Controles()


lblSigneTexte = TrouverNomSigne(hsbDate(0), hsbDate(1))
lblJourNaissance = CalculerJourNaissance(hsbDate(0), hsbDate(1), hsbDate(2))
lblPlageDateSigne = TrouverPlageDate(lblSigneTexte)
imgSigneImage = TrouverImageSigneZodiaque(lblSigneTexte)



End Sub ' Rafraichir_Controles



' VerifierSaisie
' INPUT : Valeur Controle, ValMin et ValMax admissible.
' OUTPUT : Retourne le code erreur ou SANS_ERREUR.
' FONCTION : Verifie si la saisie utilisateur est correcte.


Private Function VerifierSaisie(p_strValeur As String, p_intMin As Integer, p_intMax As Integer) As enuTypeErreur


    ' Verifier que la valeur saisie est numerique afin que CInt ne genere une erreur.
    If IsNumeric(p_strValeur) Then
        If (CInt(p_strValeur) >= p_intMin) And (CInt(p_strValeur) <= p_intMax) Then
            VerifierSaisie = enuTypeErreur.SANS_ERREUR
        Else
            VerifierSaisie = enuTypeErreur.DEPASSEMENT_CAPACITE
        End If
    Else
        VerifierSaisie = enuTypeErreur.NON_NUMERIQUE
    End If



End Function
' VerifierSaisie



' GestionErreurs
' INPUT : Controle a l'origine de l'erreur et Type d'erreur.
' OUTPUT : NA.
' FONCTION : Affiche une MsgBox signalant le type d'erreur de saisie,
'   et redonne le focus a la TextBox incriminee en selectionnant son contenu.
Private Sub GestionErreurs(p_intOrigineErreur As Integer, p_intTypeErreur As Integer)
    Dim strPrompt As String
   
    Select Case p_intTypeErreur
        Case enuTypeErreur.NON_NUMERIQUE
            Select Case p_intOrigineErreur
                Case enuCtlTxt.Jour
                    strPrompt = EM.ERREUR_JOUR
               Case enuCtlTxt.Mois
                    strPrompt = EM.ERREUR_MOIS
                Case enuCtlTxt.Annee
                    strPrompt = EM.ERREUR_ANNEE
                Case Else
                    strPrompt = EM.ERREUR_INCONNUE
            End Select' p_intOrigineErreur
        Case enuTypeErreur.DEPASSEMENT_CAPACITE
            strPrompt = EM.ERREUR_DEPASSEMENT_CAPACITE
        Case Else
            strPrompt = EM.ERREUR_INCONNUE
    End Select' p_intTypeErreur
   
    txtDate.Item(p_intOrigineErreur).SetFocus
    txtDate.Item(p_intOrigineErreur).SelStart = 0
    txtDate.Item(p_intOrigineErreur).SelLength = Len(txtDate.Item(p_intOrigineErreur).Text)


    MsgBox strPrompt, vbInformation, EM.ERREUR_SAISIE
   
End Sub' GestionErreurs

En espérant que vous puissiez m'aider ... Bonne soirée.




 

22 réponses

Messages postés
37
Date d'inscription
mercredi 7 mars 2007
Statut
Membre
Dernière intervention
9 octobre 2009

Bonjour,

Désolé pour le temps de réaction, j'ai dû beaucoup m'investir et voici la réponse :)

Private Sub txtDate_LostFocus(Index As Integer)
    Dim intTypeErreur As Integer
   
    intTypeErreur = VerifierSaisie(txtDate.Item(Index).Text, hsbDate(Index).Min, hsbDate(Index).Max)
   
    If intTypeErreur = enuTypeErreur.SANS_ERREUR Then
        hsbDate(Index).Value = CInt(txtDate(Index).Text)
    Else
        GestionErreurs Index, intTypeErreur
    End If
   

' Ce code correspond à ce qui était attendu par rapport à mon premier post :D
Messages postés
37
Date d'inscription
mercredi 7 mars 2007
Statut
Membre
Dernière intervention
9 octobre 2009

Le but recherché est :

Lorsque l'on change txtDate(Index), si la valeur est correcte, on met hsbDate(Index) à cette même valeur, sinon on indique qu'il y a une erreure.

Algorythme :

Si VerifierSaisie(txtDate(Index),Max de hsbDate(Index),Max de hsbDate(Index)) VRAI
Alors <?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" /??>

hsbDate(Index) ç txtDate(Index)

Sinon

GestionErreurs

FinSi
Messages postés
1883
Date d'inscription
samedi 1 avril 2006
Statut
Membre
Dernière intervention
20 novembre 2007
2
Bonsoir,
Pourquoi ne pas utiliser Validate plutôt que LostFocus ?
Ainsi le control garde le Focus jusqu' à ce qu' une valeur Valide soit entrée.

Private Sub txtDate_LostFocus(Index As Integer,Cancel As Boolean)
    If VerifierSaisie(txtDate(Index), hsbDate(Index).Min, hsbDate(Index).Max) = 1 Then
    hsbDate(Index) = txtDate(Index)
    Else
        hsbDate(Index) =ValeurParDefaut
       GestionErreurs' = ==> Message personnalisé
       Cancel =True

        End If
End Sub

<hr />I LIKE TO BE HERE WHEN I CAN
<hr />
Messages postés
1883
Date d'inscription
samedi 1 avril 2006
Statut
Membre
Dernière intervention
20 novembre 2007
2
Pardon !
Private Sub txtDate_Validate(Index As Integer,Cancel As Boolean)

<hr />I LIKE TO BE HERE WHEN I CAN
<hr />
Messages postés
37
Date d'inscription
mercredi 7 mars 2007
Statut
Membre
Dernière intervention
9 octobre 2009

Bonsoir chaibat05,

Ton idée m'interesse ;)

Private Sub txtDate_Validate(Index As Integer, Cancel As Boolean)
    If VerifierSaisie(txtDate(Index), hsbDate(Index).Min, hsbDate(Index).Max) = 1Then
    hsbDate(Index) = txtDate(Index)
    Else
      hsbDate(Index) = hsbDate(Index).Min 'Je pense que je peux mettre ca étant donné qu'elles sont déclarées et par défaut au min
       GestionErreurs ' ===>Message personnalisé
       Cancel = True
End Sub

Pourrais-tu répondre à quelques questions (je suis débutant en VB). Je ne comprends toujours pas ce que je dois définir à GestionErreurs ...
Cela ne renvoi pas à Private Sub GestionErreurs(p_intOrigineErreur As Integer, p_intTypeErreur As Integer) ??

Ce que j'ai mis en rouge est-il toujours correct étant donné que nous avons changé l'évènement ?

Même si la valeur rentrée est correcte, cela renvoi :
Messages postés
37
Date d'inscription
mercredi 7 mars 2007
Statut
Membre
Dernière intervention
9 octobre 2009

On peut remplacer : 
If VerifierSaisie(txtDate(Index), hsbDate(Index).Min, hsbDate(Index).Max) = 1 Then
par
 If VerifierSaisie(txtDate(Index), hsbDate(Index).Min, hsbDate(Index).Max) =  SANS_ERREUR Then

Pour GestionErreurs des idées ? Perso je comprends pas ^^ ou bien je fais quelque chose du genre :

Dim GestionErreurs
GestionErreurs = MsgBox("hsbDate a été réinitialisé, veuillez rentrer une valeur correcte", vbCritical, "Incorrect Value")
Messages postés
1883
Date d'inscription
samedi 1 avril 2006
Statut
Membre
Dernière intervention
20 novembre 2007
2
Il y' a plusieures façon de gérer les erreurs.
ça dépend de l' ensemble du code que tu as dans
un seul traitement.


1° Si tu n' as qu' un seul traitement style :
If ...Then
   ...
Else
  ...
End If
Pas la peine de renvoyer vers une etiquete gestion d' erreur.
Tu la traites sur la même ligne.
Si tu comptes le faire en exécutant une Sub qui analyse le type d' erreur,
comme dans l' exemple, tu fais ceci :


Private Sub ...


   If ...Then
     <correct>...
   Else
      <erreur> ...
      Goto Err_T
   End If


Exit Sub
  Err_T/
     Call GestionErreurs (Err.Number,Err.Description)


End Sub


NB:
Err.Number ==> numéro de l' erreur (Numérique)
Err.Description==>Descriptif de l' erreur (Texte)











<hr />

I LIKE TO BE HERE WHEN I CAN


<hr />
Messages postés
1883
Date d'inscription
samedi 1 avril 2006
Statut
Membre
Dernière intervention
20 novembre 2007
2
n' oublies pas que le Exit Sub es primordial si tu as
une etiquete Erreur.

<hr />I LIKE TO BE HERE WHEN I CAN
<hr />
Messages postés
37
Date d'inscription
mercredi 7 mars 2007
Statut
Membre
Dernière intervention
9 octobre 2009

A quoi correspond :

Err_T/ ?

Par rapport à Err.Number, c'est le cas rencontré dans l'évènement GestionErreurs ?
Messages postés
1883
Date d'inscription
samedi 1 avril 2006
Statut
Membre
Dernière intervention
20 novembre 2007
2
Erreur de ma part .
Err_T: et non pas Err_T/


Err_T est le nom que tu donnes à ton etiquete .Tu peut la nommer
comme tu veux.L' important c' est qu' il y est les deux points après.C' est la règle !


Pour l' erreur indiqué;
il s' agit des paramètres de ta Sub que tu as oublié.
 GestionErreurs  ?    ' ===>Message personnalisé
tu as oublié les deux paramètres origine et type.
Il faut que l' appel correspond au paramètres declarés.
Private Sub GestionErreurs(p_intOrigineErreur As Integer, p_intTypeErreur As Integer)


Dans l' exemple que je t' ai mis le Err.Numer correspond à p_intTypeErreur .
Oublies l' exemple .
Etant donné que p_intOrigineErreur = Index du TextBox ou s' est produite l' erreur
Et etant donn" que pour un débutant il est difficil de faire des Select Case sur des numéro d' erreur
contentes toi de Err.Description.
 Tu changes donc ta declaration de Sub en :
Private Sub GestionErreurs(p_intOrigineErreur As Integer, p_intTypeErreur As String


et tu fais un appel avec
Call GestionErreur(Index,Err.Description)


N' oublies pas de supprimer la ligne
 GestionErreurs  ?    ' ===>Message personnalisé


Et gardes
Exit Sub
Err_T:
Call GestionErreur(Index,Err.Description)


End Sub


tu fais donc un appel avec
Call GestionErreurs(Index,Err.Description)

Si ça devient flou pour toi, n' hésites pas à me le rappeler.
On réecrira le tout depuis le début.











<hr />

I LIKE TO BE HERE WHEN I CAN


<hr />
Messages postés
1883
Date d'inscription
samedi 1 avril 2006
Statut
Membre
Dernière intervention
20 novembre 2007
2
et pour simplifier encore plus:


Private Sub txtDate_LostFocus(Index As Integer,Cancel As Boolean)
    If ValideSaisie(Index)=False Then
      
       hsbDate(Index)=ValeurParDefaut
       Cancel=True
    End If
End Sub


Function ValideSaisie(Origine As Integer) As boolean
  Mettons que tes 3 controls sont indexés de 1 à 3
   Select Case Origine
      Case 1 'jour
         'tu vérifies si le contenu de txtDate(1) correspond aux critères
         'si ça correspond
            ValideSaisie=True
         'sinon
             Exit Function
          'fin si


      Case 2 'Mois
           'tu vérifies si le contenu de txtDate(2) correspond aux critères
         'si ça correspond
            ValideSaisie=True
         'sinon
            MsgBox "Mois non valide"
           Exit Function
          'fin si
        Case 3 'Année
           'tu vérifies si le contenu de txtDate(3) correspond aux critères
         'si ça correspond
            ValideSaisie=True
         'sinon
            MsgBox "Annee non valide"
            Exit Function
          'fin si
  End Select
 'tu vérifie ensuite toute la date (contenus controls réunis)
   si ça correspond
    ValideSaisie=True
   'sinon  un MsgBox concernant la date cette fois


End Function

et pas besoin de la Sub GestionErreurs..











<hr />

I LIKE TO BE HERE WHEN I CAN


<hr />
Messages postés
37
Date d'inscription
mercredi 7 mars 2007
Statut
Membre
Dernière intervention
9 octobre 2009

Si je reprend tout, ca nous donne quelque chose comme ca non ? :

If VerifierSaisie(txtDate(Index), hsbDate(Index).Min, hsbDate(Index).Max) = SANS_ERREUR Then
        hsbDate(Index) = txtDate(Index)
        Else
        hsbDate(Index) = hsbDate(Index).Min
    GoTo Err_T
        End If
    Exit Sub
Err_T:
    Call GestionErreurs(Index, Err.Description)

En mettant une valeur numérique non-correcte, j'obtient une "run-time error '13' type mismatch"
Le mode débogage me renvoit sur Call GestionErreurs(Index, Err.Description)
Messages postés
1883
Date d'inscription
samedi 1 avril 2006
Statut
Membre
Dernière intervention
20 novembre 2007
2
txtDate(Index) n' est un integer mais un control !

Si tu regardes bien ma dernière proposition, il n' y a que l' index du control à vérifier.
Après dans es tests je sais quand est -ce il s' agit de txtDate etquand c' est hsbDate.
il ne me restera plus qu' à à ajouter l' index à l' un et à l' autre.
TxtDate-Index) ou hsbDate(Index)

<hr />I LIKE TO BE HERE WHEN I CAN
<hr />
Messages postés
37
Date d'inscription
mercredi 7 mars 2007
Statut
Membre
Dernière intervention
9 octobre 2009

Je crois que je viens de me perdre ^^

Je regarderai tout ca au clair demain matin ... Cette journée fut exténuante :), je vais me coucher bonne nuit et merci de ton aide.

A demain.
Messages postés
1883
Date d'inscription
samedi 1 avril 2006
Statut
Membre
Dernière intervention
20 novembre 2007
2
reposes-toi bien !

Bonne nuit et A+

<hr />I LIKE TO BE HERE WHEN I CAN
<hr />
Messages postés
37
Date d'inscription
mercredi 7 mars 2007
Statut
Membre
Dernière intervention
9 octobre 2009

J'ai écris un petit truc en utilisant GestionErreurs (étant donné que c'est dans le cachier des charge :P) mais tout ne marche pas comme je le voudrai.

If VerifierSaisie(txtDate(Index), hsbDate(Index).Min, hsbDate(Index).Max) = SANS_ERREUR Then
    hsbDate(Index) = txtDate(Index)
    Else
      GoTo Err_D
    End If
  Exit Sub
Err_D:
        If VerifierSaisie(txtDate(Index), hsbDate(Index).Min, hsbDate(Index).Max) = DEPASSEMENT_CAPACITE Then
        Call GestionErreurs(2, Index)
        Else
        Call GestionErreurs(1, Index)
        End If

Ceci me rend :

- lorsque je fais une erreur dans les nombres dans :

le jour : erreur_inconnue
le mois  : erreur_mois
l'année  : erreur_annee

- lorsque je fais une erreur non-numérique dans :

le jour : erreur_inconnue
le mois : dépassement_capacité
l'année : erreur_mois
Messages postés
1883
Date d'inscription
samedi 1 avril 2006
Statut
Membre
Dernière intervention
20 novembre 2007
2
Tout  simplement
Private Sub txtDate_Validate(Index As Integer,Cancel As Boolean)
 
  Dim Reponse As enumTypeErreur
 Reponse= VerifierSaisie(txtDate(Index), hsbDate(Index).Min, hsbDate(Index).Max)
 If Reponse=SANS_ERREUR Then
     hsbDate(Index) = txtDate(Index)
  Else
      MsgBox Reponse
       
       hsbDate(Index)=ValeurParDefaut
       Cancel=True
  End If
End Sub

<hr />I LIKE TO BE HERE WHEN I CAN
<hr />
Messages postés
13280
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
39
salut

ceci peut peut-être t'aider
++
<hr size="2" width="100%" />Prenez un instant pour répondre à [infomsg_SONDAGE-POP3-POUR-CS_769706.aspx ce sondage] svp
Messages postés
1883
Date d'inscription
samedi 1 avril 2006
Statut
Membre
Dernière intervention
20 novembre 2007
2
Salut PCPT,
et moi ? t' as pensé à mon sp6 ?

<hr />I LIKE TO BE HERE WHEN I CAN
<hr />
Messages postés
13280
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
39
euh..... beh j'ai répondu il me semble

(il n'y a pas encore d'alertes mail sur LOGICIEL)
++
<hr size="2" width="100%" />Prenez un instant pour répondre à [infomsg_SONDAGE-POP3-POUR-CS_769706.aspx ce sondage] svp