lomatic
Messages postés37Date d'inscriptionmercredi 7 mars 2007StatutMembreDernière intervention 9 octobre 2009
-
4 nov. 2007 à 19:28
chaibat05
Messages postés1883Date d'inscriptionsamedi 1 avril 2006StatutMembreDernière intervention20 novembre 2007
-
20 nov. 2007 à 22:34
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().
' 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.
' 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
lomatic
Messages postés37Date d'inscriptionmercredi 7 mars 2007StatutMembreDernière intervention 9 octobre 2009 4 nov. 2007 à 19:31
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" /??>
lomatic
Messages postés37Date d'inscriptionmercredi 7 mars 2007StatutMembreDernière intervention 9 octobre 2009 4 nov. 2007 à 21:14
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 :
lomatic
Messages postés37Date d'inscriptionmercredi 7 mars 2007StatutMembreDernière intervention 9 octobre 2009 4 nov. 2007 à 21:35
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")
chaibat05
Messages postés1883Date d'inscriptionsamedi 1 avril 2006StatutMembreDernière intervention20 novembre 20072 4 nov. 2007 à 21:36
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)
chaibat05
Messages postés1883Date d'inscriptionsamedi 1 avril 2006StatutMembreDernière intervention20 novembre 20072 4 nov. 2007 à 22:41
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.
chaibat05
Messages postés1883Date d'inscriptionsamedi 1 avril 2006StatutMembreDernière intervention20 novembre 20072 4 nov. 2007 à 23:14
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
lomatic
Messages postés37Date d'inscriptionmercredi 7 mars 2007StatutMembreDernière intervention 9 octobre 2009 4 nov. 2007 à 23:16
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)
chaibat05
Messages postés1883Date d'inscriptionsamedi 1 avril 2006StatutMembreDernière intervention20 novembre 20072 4 nov. 2007 à 23:26
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)
lomatic
Messages postés37Date d'inscriptionmercredi 7 mars 2007StatutMembreDernière intervention 9 octobre 2009 5 nov. 2007 à 09:50
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
chaibat05
Messages postés1883Date d'inscriptionsamedi 1 avril 2006StatutMembreDernière intervention20 novembre 20072 5 nov. 2007 à 10:48
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
PCPT
Messages postés13272Date d'inscriptionlundi 13 décembre 2004StatutMembreDernière intervention 3 février 201847 5 nov. 2007 à 11:43
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