Boucle sans fin
Résolu/Fermé
gaudian
Messages postés
62
Date d'inscription
vendredi 22 juin 2007
Statut
Membre
Dernière intervention
12 septembre 2007
-
22 juin 2007 à 17:18
coco - 30 déc. 2007 à 21:04
coco - 30 déc. 2007 à 21:04
11 réponses
sfel
Messages postés
1640
Date d'inscription
lundi 18 juin 2007
Statut
Membre
Dernière intervention
15 juillet 2009
430
22 juin 2007 à 17:20
22 juin 2007 à 17:20
lance cet test, lorsque ta case perd le focus (le curseur)
choubaka
Messages postés
39407
Date d'inscription
jeudi 4 avril 2002
Statut
Modérateur
Dernière intervention
9 décembre 2024
2 104
22 juin 2007 à 17:22
22 juin 2007 à 17:22
salut
pourquoi ne pas simplement faire la bonne vieille méthode "IF" ????
pas besoin de boucle ...
pourquoi ne pas simplement faire la bonne vieille méthode "IF" ????
pas besoin de boucle ...
gaudian
Messages postés
62
Date d'inscription
vendredi 22 juin 2007
Statut
Membre
Dernière intervention
12 septembre 2007
3
22 juin 2007 à 17:25
22 juin 2007 à 17:25
non les clients souhaitent une boucle pas de if sinon serai trop facile
sfel
Messages postés
1640
Date d'inscription
lundi 18 juin 2007
Statut
Membre
Dernière intervention
15 juillet 2009
430
22 juin 2007 à 17:33
22 juin 2007 à 17:33
oui, lorsque tu as Lost_focus, tu test ta cellule, si elle est pas bonne, tu met
Me.GotFocus (ou Me.Getfocus , j'avou que de tête ^^ )
Me.GotFocus (ou Me.Getfocus , j'avou que de tête ^^ )
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
gaudian
Messages postés
62
Date d'inscription
vendredi 22 juin 2007
Statut
Membre
Dernière intervention
12 septembre 2007
3
22 juin 2007 à 17:37
22 juin 2007 à 17:37
Je n'ai pas Me.GotFocus dans ma liste déroulante quand je tape Me.
sfel
Messages postés
1640
Date d'inscription
lundi 18 juin 2007
Statut
Membre
Dernière intervention
15 juillet 2009
430
22 juin 2007 à 17:46
22 juin 2007 à 17:46
nan, quand tyu double clique sur ta case de text
il te créé un paragraphe de code???
arrivé sur cette page de code, en haut a droite, tu a une liste déroulante avec "Click" "onchange" "dblClick" ...
il te créé un paragraphe de code???
arrivé sur cette page de code, en haut a droite, tu a une liste déroulante avec "Click" "onchange" "dblClick" ...
zefoots
Messages postés
146
Date d'inscription
samedi 9 juin 2007
Statut
Membre
Dernière intervention
11 septembre 2007
62
22 juin 2007 à 23:12
22 juin 2007 à 23:12
je suis d'accord avec choubaka : quel est l'intérêt de faire une boucle ? Un "if" fonctionnera beaucoup mieux ...
si tu veux malgré tout faire une boucle, tu peux écrire ça :
mais franchement c'est vraiment tordu ...
si tu veux malgré tout faire une boucle, tu peux écrire ça :
Do While True If Len(password) < 8 Then MsgBox ("Mot de passe trop court") End if Exit Do Loop
mais franchement c'est vraiment tordu ...
Posotaz
Messages postés
489
Date d'inscription
samedi 23 juin 2007
Statut
Membre
Dernière intervention
19 juin 2011
225
23 juin 2007 à 01:51
23 juin 2007 à 01:51
Bonjour,
Je ne suis pas certain d'avoir bien compris la question mais si le sujet est "boucle sans fin" et que le code est
en effet c'est une boucle sans fin puisque tu ne donnes pas la possibilité à ta variable "password" d'être modifiée par une autre saisie de l'utilisateur.
En fait tu es en programmation événementielle. Je me trouve devant ton formulaire pour modifier mon mot de passe, donc sur ton bouton "valider" il suffit de définir dans l'événement "OnClick" (désolé je ne me souviens plus des noms exacts en VB6) :
Les autres intervenants ont raison, tu n'as pas besoin de faire de boucle puisqu'en programmation événementielle tu ne quittes pas l'écran courant tant que l'événement ne l'aura pas autorisé. Le concept est différent par rapport à un programme en mode commandes où là tu dois continuer à demander le nouveau de mot de passe dans une boucle tant que le mot de passe fourni contient au moins 8 caractères, comme tu l'as fait mais en rajoutant une instruction de lecture dans la boucle).
Tu peux faire une boucle si tu veux, par exemple en affichant une boîte de saisie qui revient à chaque fois que le mot de passe introduit comporte moins de 8 caractères. Si tu insistes pour le faire c'est simple :
(à mettre toujours dans l'événement OnClick du bouton "Valider").
Avec cette méthode il redemandera le mot de passe en boucle et sans revenir sur le formulaire (InputBox est une fenêtre modale et de la façon dont on a programmé son appel en boucle, la seule façon d'en sortir est de fournir un mot de passe de 8 caractères au moins).
En espérant avoir pu t'aider, plus simple que ça ce n'est pas possible... en gros c'est un retour à la "programmation en mode commandes" sauf que c'est une fenêtre InputBox qui te fait office de flux de lecture plutôt qu'une invite de commandes. Tu conserves ta boucle et ton problème est résolu. ;-)
Le seul truc qui me désole avec cette méthode c'est que l'utilisateur ne pourra plus annuler la modification du mot de passe. Il devra tuer le process s'il voudra sortir du programme. C'est pour ça qu'on évite d'utiliser des boîtes de saisie en boucle sans gérer l'option "annuler". (https://plasserre.developpez.com/cours/vb-net/ ou https://codes-sources.commentcamarche.net/ si tu veux en savoir plus sur la InputBox).
Je ne suis pas certain d'avoir bien compris la question mais si le sujet est "boucle sans fin" et que le code est
While Len(password) < 8 MsgBox ("Mot de passe trop court") Wend
en effet c'est une boucle sans fin puisque tu ne donnes pas la possibilité à ta variable "password" d'être modifiée par une autre saisie de l'utilisateur.
En fait tu es en programmation événementielle. Je me trouve devant ton formulaire pour modifier mon mot de passe, donc sur ton bouton "valider" il suffit de définir dans l'événement "OnClick" (désolé je ne me souviens plus des noms exacts en VB6) :
If(Len(password) < 8) MsgBox("Mot de passe trop court, veuillez saisir un mot de passe de 8 caractères minimum") Else 'Ici tu fais ton traitement normal (par exemple : appeler la procédure qui modifie le mot de passe, fermer cette fenêtre formulaire et passer à l'écran suivant) Endif
Les autres intervenants ont raison, tu n'as pas besoin de faire de boucle puisqu'en programmation événementielle tu ne quittes pas l'écran courant tant que l'événement ne l'aura pas autorisé. Le concept est différent par rapport à un programme en mode commandes où là tu dois continuer à demander le nouveau de mot de passe dans une boucle tant que le mot de passe fourni contient au moins 8 caractères, comme tu l'as fait mais en rajoutant une instruction de lecture dans la boucle).
Tu peux faire une boucle si tu veux, par exemple en affichant une boîte de saisie qui revient à chaque fois que le mot de passe introduit comporte moins de 8 caractères. Si tu insistes pour le faire c'est simple :
If(Len(password) < 8) Dim pass As String pass = InputBox("Veuillez saisir un mot de passe de 8 caractères minimum","Mot de passe trop court") While Len(pass) < 8 pass = InputBox("Veuillez saisir un mot de passe de 8 caractères minimum","Mot de passe trop court") Wend 'Si tu arrives ici tu seras sorti de la boucle (donc tu auras un mot de passe correct) et tu peux lancer les traitements à suivre (les mêmes traitements que si tu allais directement dans le Else) Else 'Ici tu fais ton traitement normal (par exemple : appeler la procédure qui modifie le mot de passe, fermer cette fenêtre formulaire et passer à l'écran suivant) Endif
(à mettre toujours dans l'événement OnClick du bouton "Valider").
Avec cette méthode il redemandera le mot de passe en boucle et sans revenir sur le formulaire (InputBox est une fenêtre modale et de la façon dont on a programmé son appel en boucle, la seule façon d'en sortir est de fournir un mot de passe de 8 caractères au moins).
En espérant avoir pu t'aider, plus simple que ça ce n'est pas possible... en gros c'est un retour à la "programmation en mode commandes" sauf que c'est une fenêtre InputBox qui te fait office de flux de lecture plutôt qu'une invite de commandes. Tu conserves ta boucle et ton problème est résolu. ;-)
Le seul truc qui me désole avec cette méthode c'est que l'utilisateur ne pourra plus annuler la modification du mot de passe. Il devra tuer le process s'il voudra sortir du programme. C'est pour ça qu'on évite d'utiliser des boîtes de saisie en boucle sans gérer l'option "annuler". (https://plasserre.developpez.com/cours/vb-net/ ou https://codes-sources.commentcamarche.net/ si tu veux en savoir plus sur la InputBox).
Posotaz
Messages postés
489
Date d'inscription
samedi 23 juin 2007
Statut
Membre
Dernière intervention
19 juin 2011
225
24 juin 2007 à 01:05
24 juin 2007 à 01:05
Oups, le code final n'est pas très optimal, on peut simplifier en supprimant le If :
En fait j'avais rajouté un If (et oublié le Then) parce que j'avais dans l'idée d'afficher un message différent la première fois et les fois suivantes. Mais ici la boucle While fait office de test If : On n'y entre que si le mot de passe contient moins de 8 caractères. C'est ça la maîtrise de l'algorithmie, ça simplifie vachement le code.
Quoi qu'il en soit n'hésite pas à ajouter "Option Explicit" en début de chaque module pour être bien certain que tu utilises exclusivement des variables déclarées. A cet endroit (l'événement Click du bouton Valider) tu as normalement accès au champ texte du mot de passe donc je suppose que "btn_Valider.Text" c'est la variable "password" que tu cites depuis le début et que j'ai repris ici.
A toi de choisir entre les deux solutions : Le If Then Else avec la MessageBox (comme dans ma toute première proposition) et retour (en fait on ne le quitte pas) au formulaire ou le fait de redemander explicitement le mot de passe en boucle par une InputBox.
Dim pass as String pass = password 'Ici je suppose que password est la valeur texte du champ du formulaire. While Len(pass) < 8 pass = InputBox("Veuillez saisir un mot de passe de 8 caractères minimum","Mot de passe trop court") Wend 'Si tu arrives ici tu seras sorti de la boucle ou pas rentré du tout (donc tu auras un mot de passe correct) 'Ici tu fais ton traitement normal (par exemple : appeler la procédure qui modifie le mot de passe, fermer cette fenêtre formulaire et passer à l'écran suivant) Endif
En fait j'avais rajouté un If (et oublié le Then) parce que j'avais dans l'idée d'afficher un message différent la première fois et les fois suivantes. Mais ici la boucle While fait office de test If : On n'y entre que si le mot de passe contient moins de 8 caractères. C'est ça la maîtrise de l'algorithmie, ça simplifie vachement le code.
Quoi qu'il en soit n'hésite pas à ajouter "Option Explicit" en début de chaque module pour être bien certain que tu utilises exclusivement des variables déclarées. A cet endroit (l'événement Click du bouton Valider) tu as normalement accès au champ texte du mot de passe donc je suppose que "btn_Valider.Text" c'est la variable "password" que tu cites depuis le début et que j'ai repris ici.
A toi de choisir entre les deux solutions : Le If Then Else avec la MessageBox (comme dans ma toute première proposition) et retour (en fait on ne le quitte pas) au formulaire ou le fait de redemander explicitement le mot de passe en boucle par une InputBox.
gaudian
Messages postés
62
Date d'inscription
vendredi 22 juin 2007
Statut
Membre
Dernière intervention
12 septembre 2007
3
25 juin 2007 à 09:15
25 juin 2007 à 09:15
Merci de vos infos, mais cela n'empeche pas que le programme de mon partenaire continue de tourner, il m'affiche bien que le mot de passe est trop court mais il le sauvegarde correctement meme s'il possède que 2 caractères.
gaudian
Messages postés
62
Date d'inscription
vendredi 22 juin 2007
Statut
Membre
Dernière intervention
12 septembre 2007
3
25 juin 2007 à 09:54
25 juin 2007 à 09:54
Merci pour vos aides, j'ai trouver une solution autre que celle-ci, grâce à Err.Raise
22 juin 2007 à 17:24
j'ai 3 textbox :
1. pour l'identifiant
2. pour le mot de passe actuel
3. pour modifier son mot de passe
mais j'ai également un bouton valider
c'est à ce moment là que je dois tester mon mot de passe, ma boucle ne se termine pas.
Je dois permettre à l'utilisateur de ressaisir la modification du password