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

Vue hybride

Message pr�c�dent Message pr�c�dent   Message suivant Message suivant
  1. #1
    Membre confirm� Avatar de tus01
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    191
    D�tails du profil
    Informations personnelles :
    �ge : 43
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 191
    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 confirm� Avatar de tus01
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    191
    D�tails du profil
    Informations personnelles :
    �ge : 43
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 191
    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 confirm� Avatar de tus01
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    191
    D�tails du profil
    Informations personnelles :
    �ge : 43
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 191
    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
    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 confirm� Avatar de tus01
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    191
    D�tails du profil
    Informations personnelles :
    �ge : 43
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 191
    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
    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 confirm� Avatar de tus01
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    191
    D�tails du profil
    Informations personnelles :
    �ge : 43
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 191
    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
    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
    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 confirm� Avatar de tus01
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    191
    D�tails du profil
    Informations personnelles :
    �ge : 43
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 191
    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