IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB 6 et antérieur Discussion :

[]Validate / CausesValidation => Ne pas utiliser [Bug report]


Sujet :

VB 6 et antérieur

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    50
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 50
    Points : 36
    Points
    36
    Par défaut []Validate / CausesValidation => Ne pas utiliser
    Bonjour,

    bizarrement, c'est pas une question que je pose, mais j'apporte plutôt un élément de réponse à ceux qui se poseraient celle que je me suis posé ...
    Je vais être plus clair !

    J'ai un formulaire comportant des champs de type TextBox.
    A chaque sortie, je veux valider la saisie afin de bloquer le passage au control suivant. Il me faut donc intervenir avant le passage de focus.
    Je ne passe donc pas par les événements lostfocus/gotfocus.

    En effet, comment empêcher le changement de focus si le test est effectué APRES le changement ?
    Ne me répondez pas qu'il suffit de faire un setfocus dans le champ qui a reçu le focus, car si ce 2eme control possède également une méthode de control de saisie dans son événement lostfocus, on arrive sur des cas de boucles sans fin trés vite.
    A moins d'imaginer un système de verrou, qui n'éxécute le test qu'à condition que le champ précédent a été validé ... mais c'ests trés lourd à gérer, et on se met à réinventer la poudre.

    L'événement Validate semble en effet tout indiqué pour répondre à la problématique.
    Je vous copie tels quels qques passages trés intéressants et explicites trouvés sur le net :

    Événement Validate des contrôles
    Les contrôles génèrent aussi un événement Validate qui est déclenché avant que le contrôle ne perde le focus. Toutefois, cet événement survient uniquement lorsque la propriété CausesValidation du contrôle sur le point de recevoir le focus est à True. Dans de nombreux cas, l'événement Validate est plus approprié que l'événement LostFocus pour la validation des données parce qu'il survient avant la perte du focus. Pour plus d'informations, reportez-vous à la section « Validation de l'entrée d'un contrôle par restriction du focus » du chapitre 7, « Utilisation des contrôles standard de Visual Basic ».
    Validation des données de contrôle par restriction du focus

    L'événement Validate et la propriété CausesValidation sont utilisés de paire pour vérifier l'entrée d'un contrôle avant d'autoriser l'utilisateur à le désactiver. Prenons, par exemple, une application contenant plusieurs zones de texte et un bouton Aide. Lorsque chaque zone de texte reçoit le focus, vous devez empêcher les utilisateurs de déplacer ce focus tant que les critères de validation spécifiques de la zone de texte ne sont pas remplis. Toutefois, vous devez également autoriser les utilisateurs à cliquer sur le bouton Aide à tout moment. Pour cela, vous devez affecter la valeur False au critère de validation de l'événement Validate ainsi qu'à la propriété CausesValidation du bouton Aide. Si la propriété a la valeur True (paramètre par défaut), l'événement Validate interviendra sur le premier contrôle. En revanche, si elle a la valeur False, l'événement Validate affecté au premier contrôle n'interviendra pas.

    L'événement Validate est mieux adapté à la validation de saisie de données que l'événement LostFocus parce que, par définition, l'événement LostFocus intervient une fois le focus déplacé. En revanche, l'événement Validate vous permet d'empêcher le déplacement du focus vers un autre contrôle tant que toutes les conditions de validation ne sont pas remplies.
    J'avais donc trouver une solution ... LA solution !
    Mais mes jolis espoirs se sont vite envolé...


    En effet, je me suis aperçu que dans certains cas, l'événement validate ne se déclenchait pas... J'ai d'abord pensé à une erreur de code de ma part, puis à une mauvaise initialisation des propriétés des controles de mon formulaire... Mais j'ai du me rendre à l'évidence : l'événement validate n'est pas fiable !

    J'ai donc cherché à en savoir plus, et je suis tombé sur un article de microsoft édifiant, constatant effectivement et officiellement le bug.

    A cette adresse http://support.microsoft.com/search/...og=LCID%3D1036 on apprend ceci :

    BUG: CausesValidation Property Does Not Trigger Validate Event

    SYMPTOMS
    The Validate event of a control is not executed when it loses focus to another control that has its CausesValidation property set to True.

    STATUS
    Microsoft has confirmed that this is a bug in the Microsoft products that are listed at the beginning of this article.

    MORE INFORMATION
    Microsoft Visual Basic 6.0 introduced a new Boolean property called CausesValidation on various controls, such as the TextBox. According to Visual Basic Help, when there is an attempt to put focus on a control that has its CausesValidation property set to True, the Validate event of the control that is losing focus executes. During that Validate event, you can verify that the data entered is valid and you can prevent the shift of focus to the new control if you want.
    On y trouve d'ailleurs un exemple permettant de reproduire le bug !
    1. Create a new Standard EXE project. Form1 is created by default.
    2. Add three TextBox controls to Form1.
    3. Set the CausesValidation property in Text1 and Text3 to True.
    4. Set the CausesValidation property in Text2 to False.
    5. Paste the following code into Form1:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
     Private Sub Text1_Validate(Cancel As Boolean)
             Debug.Print "Text1's Validate Event"
          End Sub
     
          Private Sub Text2_Validate(Cancel As Boolean)
             Debug.Print "Text2's Validate Event"
          End Sub
     
          Private Sub Text3_Validate(Cancel As Boolean)
             Debug.Print "Text3's Validate Event"
          End Sub
    Run the sample project.
    7. The focus begins on Text1. Click Text3. The CausesValidation property of Text3, set to True, causes the Validate event of Text1 to be executed as expected.
    8. With the focus on Text3, click Text2. The CausesValidation property of Text2, set to False, does not cause the Validate event of Text3 as expected.
    9. With the focus on Text2, click Text3. The CausesValidation property of Text3, set to True, does not cause the Validate event of Text2 as it should.

    With the CausesValidation property of Text2 set to False, there does not appear to be any way to get a Validate event for Text2 to execute.

    Aside from attempting to use the LostFocus event to manually call a Validate event for Text2 from Text2, you can work around this problem by changing the CausesValidation property from False to True.
    Nous y sommes chers amis ! La validation des données ne passera pas par le CausesValidation ...

  2. #2
    Xo
    Xo est déconnecté
    Expert confirmé
    Avatar de Xo
    Inscrit en
    Janvier 2005
    Messages
    2 701
    Détails du profil
    Informations personnelles :
    Âge : 50

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 701
    Points : 4 238
    Points
    4 238
    Par défaut
    C'est intéressant, ça mériterait peut-être un article dans la FAQ : L'événement Validate, mode d'emploi et limites ...

    Merci en tout cas de la peine que tu t'es donné
    "Ce que l'on conçoit bien s'énonce clairement,
    Et les mots pour le dire arrivent aisément." Nicolas Boileau

    "Expliquer empêche de comprendre si cela dispense de chercher"

    Quiz Oracle : venez tester vos connaissances !

    La FAQ Oracle : 138 réponses à vos questions
    Aidez-nous à la compléter

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    50
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 50
    Points : 36
    Points
    36
    Par défaut
    Merci, tu as raison, je devrais pas le laisser là je pense, sinon personne ne le lira ^^

    Je propose ça dans le thread FAQ c'est bien ça ?

  4. #4
    Xo
    Xo est déconnecté
    Expert confirmé
    Avatar de Xo
    Inscrit en
    Janvier 2005
    Messages
    2 701
    Détails du profil
    Informations personnelles :
    Âge : 50

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 701
    Points : 4 238
    Points
    4 238
    Par défaut
    Citation Envoyé par Gildas Huart
    Merci, tu as raison, je devrais pas le laisser là je pense, sinon personne ne le lira
    Disons que de la manière dont il est posté, ton message va rapidement être noyé parmi les autres ... Il restera (j'espère) accessible via la fonction recherche.

    Citation Envoyé par Gildas Huart
    Je propose ça dans le thread FAQ c'est bien ça ?
    Yes : Goto Participez à la FAQ
    "Ce que l'on conçoit bien s'énonce clairement,
    Et les mots pour le dire arrivent aisément." Nicolas Boileau

    "Expliquer empêche de comprendre si cela dispense de chercher"

    Quiz Oracle : venez tester vos connaissances !

    La FAQ Oracle : 138 réponses à vos questions
    Aidez-nous à la compléter

Discussions similaires

  1. Ne pas utiliser CausesValidation / Validate
    Par Gildas Huart dans le forum Vos contributions VB6
    Réponses: 9
    Dernier message: 25/07/2006, 18h14
  2. [débutant] Ne pas utiliser les frames ?
    Par Pigoulou dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 13/02/2006, 10h09
  3. [XHTML] [DEBUTANT] Validation qui ne passe pas
    Par hugo123 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 5
    Dernier message: 25/01/2006, 20h15
  4. Réponses: 10
    Dernier message: 30/11/2004, 10h12
  5. [VB6] [Validate et CausesValidation] Ca marche pas toujours !!!
    Par HPJ dans le forum VB 6 et antérieur
    Réponses: 8
    Dernier message: 16/12/2003, 22h09

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo