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

MFC Discussion :

[MFC] Vérification de CString dans une edit box


Sujet :

MFC

  1. #1
    Membre régulier Avatar de tus01
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    191
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 191
    Points : 80
    Points
    80
    Par défaut [MFC] Vérification de CString dans une edit box
    Bonjour j'ai une edit box dans laquelle l'utilisateur entre une heure (heures, minutes et secondes)!
    J'ai déjà posté un message semblable il y a quelques jours, je remercie farscape pour sa collaboration.

    A présent j'ai rajouté une partie de code qui est censée vérifier le format des secondes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    void CWorkshiftDialog::OnChangeHour0() 
    {
    	CString str; 
    	GetDlgItem(IDC_HOUR0)->GetWindowText(str); 
    	str.TrimRight(); 
     
    	char *stopstring=NULL; 
    	long l = strtol( str, &stopstring, 10 ); 
    	if(l>23) 
    	{ 
    		AfxMessageBox("Msg1 Invalid hour format! Must be between 0 and 23!"); 
    		str="";
    		UpdateData(FALSE);
    		return; 
    	} 
    	if(stopstring && *stopstring && *stopstring!=':') 
    	{ 
    		AfxMessageBox("Msg2 Invalid separator character! Must be ':' !"); 
    		str="";
    		UpdateData(FALSE);
    		return; 
    	} 
    	if(str.GetLength()>3) 
    	{ 
    		stopstring=NULL; 
    		l = strtol( str.Mid(3,2), &stopstring, 10 ); 
    		if(l>59) 
    		{ 
    		  AfxMessageBox("Msg3 Invalid minute format! Must be between 0 and 59!"); 
    		  str="";
    		  UpdateData(FALSE);
    		  return; 
    		}
    	}
    	if(stopstring && *stopstring && *stopstring!=':') 
    	{ 
    		AfxMessageBox("Msg4 Invalid separator character! Must be ':' !"); 
    		str="";
    		UpdateData(FALSE);
    		return; 
    	} 
    	if(str.GetLength()>5) 
    	{ 
    		stopstring=NULL; 
    		l = strtol( str.Mid(5,2), &stopstring, 10 ); 
    		if(l>59) 
    		{ 
    		  AfxMessageBox("Msg5 Invalid second format! Must be between 0 and 59!"); 
    		  str="";
    		  UpdateData(FALSE);
    		  return; 
    		} 
    	} 
    	if(str.GetLength()>8) 
    	{ 
    	   AfxMessageBox("Msg6 Invalid time format!"); 
    	   return; 
    	} 
    }
    Le problème est le suivant: lorsque je tape le premier chiffre des minutes, le message 4 s'affiche directement!

    Faut-il donner un nom différent au deux séparateurs ':' ??
    Ou alors dois-je créer une autre fonction qui vérifiera combien de caractères j'ai entré avant de tester mon deuxième séparateur?

  2. #2
    mat.M
    Invité(e)
    Par défaut
    UpdateData ne sert absolument à rien dans ce code !!
    Cette instructiob des MFC est à 99% des cas mal comprise et mal assimilée
    Se procurer un livre de programmation MFC ou bien lire les FAQ/tutoriels

    Le problème est le suivant: lorsque je tape le premier chiffre des minutes, le message 4 s'affiche directement!
    en utilisant if....else cela ne devrait pas arriver !

  3. #3
    Membre régulier Avatar de tus01
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    191
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 191
    Points : 80
    Points
    80
    Par défaut
    Si mon UpdateData false me sert à effacer le contenu de l'Edit Box si jamais il y a une erreur pour que l'utilisateur puisse le ré entrer de nouveau!
    Est ce que c'est toujours inutile? Ou peut être existe-t-il un eméthode plus simple?

    Quant au else je vais essayer voir ce que ça donne.

  4. #4
    mat.M
    Invité(e)
    Par défaut
    Citation Envoyé par tus01
    Si mon UpdateData false me sert à effacer le contenu de l'Edit Box si jamais il y a une erreur pour que l'utilisateur puisse le ré entrer de nouveau!
    Est ce que c'est toujours inutile? Ou peut être existe-t-il un eméthode plus simple?

    Quant au else je vais essayer voir ce que ça donne.
    non il suffit de faire SetWindowText(chaine_vide)
    UpdateDatq sert à échanger des données entre une fen. de dialogue modale et le reste de l'appli

  5. #5
    Membre régulier Avatar de tus01
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    191
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 191
    Points : 80
    Points
    80
    Par défaut
    ok ok merci beaucoup!

  6. #6
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Points : 17 323
    Points
    17 323
    Par défaut
    je propose la mofication suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
     
    char *stopstring=NULL,*szString;
       szString=str.GetBuffer(0);
     
       long l = strtol(szString , &stopstring, 10 );
       if(l>23)
       {
          AfxMessageBox("Msg1 Invalid hour format! Must be between 0 and 23!");
          str="";
      //    UpdateData(FALSE);
          return;
       }
       if(stopstring && *stopstring && *stopstring!=':')
       {
          AfxMessageBox("Msg2 Invalid separator character! Must be ':' !");
          str="";
        //  UpdateData(FALSE);
          return;
       }
       stopstring=NULL;
       if(str.GetLength()>3)
       {      
          l = strtol( szString+3, &stopstring, 10 );
          if(l>59)
          {
            AfxMessageBox("Msg3 Invalid minute format! Must be between 0 and 59!");
            str="";
          //  UpdateData(FALSE);
            return;
          }
       }
       if(str.GetLength()>5 )
       {
    	   if(stopstring && *stopstring && *stopstring!=':')
    		{
    			AfxMessageBox("Msg4 Invalid separator character! Must be ':' !");
    			str="";
    			//UpdateData(FALSE);
    			return;
    		}   
    		stopstring=NULL;
    		l = strtol( szString+6, &stopstring, 10 );
    		if(l>59)
    		{
    			AfxMessageBox("Msg5 Invalid second format! Must be between 0 and 59!");
    			str="";
    			//UpdateData(FALSE);
    			return;
    		}
       }
       if(str.GetLength()>8)
       {
          AfxMessageBox("Msg6 Invalid time format!");
          return;
       }
    on ne peut pas utiliser d'objet temporaire avec strtol ,c'est ce que fait mid du coup stopstring pointe sur le no man's land...

  7. #7
    Membre régulier Avatar de tus01
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    191
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 191
    Points : 80
    Points
    80
    Par défaut
    C'est magique ça fonctionne!
    Mais quand même une petite explication: j'ai analysé ton code et ce que j'en ai compris c'est que:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    szString=str.GetBuffer(0);
    permet de récupérer le nombre de caractères entrés, ils seront indicés de 0 à 7 puisque j'en ai 8, donc:
    permet de se positionner sur le 4eme, soit le premier chiffre des minutes.

    Ce qui implique que notre boucle ne fonctionnera pas correctement si on tape par exemple 1:2:35 car tout va être décalé!

    Donc pour remédier à ceci, je dois m'assurer que l'utilisateur a bien entré deux chiffres à chaque fois.

    Ce dont à quoi je pense c'est tester combien de chiffres ont été entrés au moment où on tape les ':'.
    Pour cela, est-il possible qu'en entrant les ':' cela appelle une fonction spéciale capable de tester combien de chiffres on été entrés et si il y en a eu moins de deux afficher un message d'erreur?
    C'est la seule chose à laquelle je pense!

  8. #8
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Points : 17 323
    Points
    17 323
    Par défaut
    oui ,
    pour la saisie partielle des heures et minutes tu peux rendre parametrable
    une variable ofset qui designe la position du ':' le reste etant indicé par rapport a cette variable et a son evolution au fil de la fonction.

  9. #9
    Membre régulier Avatar de tus01
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    191
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 191
    Points : 80
    Points
    80
    Par défaut

    Ok merci beaucoup pour ton aide, je vais faire des recherches de ce coté la !!

  10. #10
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Points : 17 323
    Points
    17 323
    Par défaut
    une autre proposition:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
     
    int nofs=3;
       char *stopstring=NULL,*szString;
       szString=str.GetBuffer(0);
     
       long l = strtol(szString , &stopstring, 10 );
       if(l>23)
       {
          AfxMessageBox("Msg1 Invalid hour format! Must be between 0 and 23!");
          str="";
      //    UpdateData(FALSE);
          return;
       }
       if(stopstring && *stopstring && *stopstring!=':')
       {
          AfxMessageBox("Msg2 Invalid separator character! Must be ':' !");
          str="";
        //  UpdateData(FALSE);
          return;
       }
       if(stopstring && *stopstring==':') nofs=(stopstring-szString)+1;
     
       stopstring=NULL;
       if(str.GetLength()>nofs)
       {      
          l = strtol( szString+nofs, &stopstring, 10 );
          if(l>59)
          {
            AfxMessageBox("Msg3 Invalid minute format! Must be between 0 and 59!");
            str="";
          //  UpdateData(FALSE);
            return;
          }
       }
       nofs+=2;
       if(stopstring && *stopstring==':') nofs=(stopstring-szString)+1;
     
       if(str.GetLength()>nofs )
       {
    	   if(stopstring && *stopstring && *stopstring!=':')
    		{
    			AfxMessageBox("Msg4 Invalid separator character! Must be ':' !");
    			str="";
    			//UpdateData(FALSE);
    			return;
    		}   
    		stopstring=NULL;
    		l = strtol( szString+nofs, &stopstring, 10 );
    		if(l>59)
    		{
    			AfxMessageBox("Msg5 Invalid second format! Must be between 0 and 59!");
    			str="";
    			//UpdateData(FALSE);
    			return;
    		}
       }
       /*
       if(str.GetLength()>8)
       {
          AfxMessageBox("Msg6 Invalid time format!");
          return;
       }
     */
    je n'ai pas tout testé ,mais ça à l'air de tenir la route..

  11. #11
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Points : 17 323
    Points
    17 323
    Par défaut
    pour finir une remarque générale :
    il est préférable de faire une classe dérivée de CEdit par exemple CEditTime
    D’intercepter le message wm_char
    de procéder à la batterie de test et de refuser le caractère si il est non valide
    voir faq:
    http://c.developpez.com/faq/vc/?page...EditFilterChar

    ceci est a mon avis préférable ou plus propre et réutilisable que le message Onchange sur le contrôle.
    et ça permet de gérer l'acceptation d'une caractère ou non etc ..

  12. #12
    Membre régulier Avatar de tus01
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    191
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 191
    Points : 80
    Points
    80
    Par défaut
    OK merci beaucoup pour toutes ces solutions, je vais les étudier et si problème je t'embêterai de nouveau
    @++

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Ajouter du texte dans une edit box
    Par raf_gug dans le forum MFC
    Réponses: 10
    Dernier message: 23/05/2013, 10h00
  2. Réponses: 18
    Dernier message: 03/07/2009, 16h27
  3. Faire un Ctrl+C dans une edit box
    Par kacedda dans le forum MFC
    Réponses: 2
    Dernier message: 19/06/2007, 16h51
  4. Problème de "rafraichissement" dans une edit box e
    Par X-K4l1 dans le forum Windows
    Réponses: 1
    Dernier message: 23/08/2005, 11h49
  5. Réponses: 9
    Dernier message: 15/09/2004, 21h35

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