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 :

Controle des caractères saisis dans CEdit


Sujet :

MFC

  1. #1
    Membre averti
    Inscrit en
    Avril 2008
    Messages
    41
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 41
    Par défaut Controle des caractères saisis dans CEdit
    Salut,

    je suis débutante en MFC et je veux savoir comment faire un controle sur la zone de saisie (en utilisant CEdit) pour ne pas accepter qu'au maximum 8 lettres ou chiffres? de plus le bouton OK du boite de dialogue soit grisé si on dépasse les 8 caractéres.

    Merci d'avance de m'aider.

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    303
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2005
    Messages : 303

  3. #3
    Membre averti
    Inscrit en
    Avril 2008
    Messages
    41
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 41
    Par défaut
    Bonjour,

    j'ai lu le FAQ mais je n'ai pas pu l'adapter à mon cas.
    Mon boite de dialogue est de type CDialog et elle a un élément de type CEdit pour saisir un numéro terminal (ne doit contenir que des lettres et des chiffres) qui ne dépasse pas le 8 caractéres et le bouton OK de boite du dialogue devient grisé à partir du 8éme caractéres.Merci de m'expliquer comment procéder et comment utiliser OnChar() et OnKeyDown() pour effectuer ce controle.(le boite de dialogue fonctionne bien mais je veux ajouter ce controle pour le saisie).

    Merci d'avance.

  4. #4
    Membre émérite
    Avatar de Spout
    Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    904
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Février 2007
    Messages : 904
    Par défaut
    Salut
    Le lien donné répondrait pourtant bien à tes besoins..
    A chaque caractère entré, tu rentres dans la fonction OnChar(), ce qui te permet de :
    • Vérifier que les caractères entrés sont bien des chiffres ou des lettres
    • Vérifier que tu n'en a pas plus de 8
    • Agir sur ton bouton si le texte dépasse les 8 caractères.
    What else?

    NB: tu peux également te servir des macros DDV_xxxx, ou limiter dans l'éditeur de ressources le champ de ton CEdit à 8.

  5. #5
    Membre averti
    Inscrit en
    Avril 2008
    Messages
    41
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 41
    Par défaut
    Bonjour,

    j'ai ajouté la méthode ONChar comme suit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    void EditTerminalDlg::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
     {
     
       lg++;
       if(lg==7)
          GetDlgItem(IDOK)->EnableWindow(TRUE);    
     
       CDialog::OnChar(nChar, nRepCnt, nFlags);
     }
    avec lg un membre public de ma classe initialisé à 0 dans le constructeur.

    Et j'ai fait GetDlgItem(IDOK)->EnableWindow(FALSE); dans la méthode EditTerminalDlg::OnInitDialog (). Le contrôle sur les chiffres et les lettres je l'ai fait dans EditTerminalDlg::OnBnClickedOk().

    Mais à l'exécution le bouton OK reste toujours grisé.
    alors comment procéder?
    Merci pour votre aide.

  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
    salut,
    si EditTerminalDlg est une classe héritée de CEdit tu ne peux pas faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     GetDlgItem(IDOK)->EnableWindow(TRUE);
    mais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        GetParent()->GetDlgItem(IDOK)->EnableWindow(TRUE);
    sinon vérifie la valeur de lg en mode trace/debug et surtout place un point d'arrêt sur cette ligne..

  7. #7
    Membre émérite
    Avatar de Spout
    Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    904
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Février 2007
    Messages : 904
    Par défaut
    Ce que tu fais te permet seulement de compter 7 passages dans OnChar() avant de dégriser le bouton, puis de le re-griser au 8e. En aucun cas il ne se base sur la taille du texte.
    D'autre part, es-tu bien sûr de passer dans cette méthode à chaque fois que tu saisis du texte dans ton CEdit (à vérifier avec un point d'arrêt)?

  8. #8
    Membre chevronné
    Avatar de PetitPapaNoël
    Développeur informatique
    Inscrit en
    Septembre 2006
    Messages
    559
    Détails du profil
    Informations personnelles :
    Âge : 49

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 559
    Par défaut
    Spoutspout a raison. Il faut compter le nombre de caractères dans le texte plutôt que de compter les passages dans OnChar. Pour une bonne raison : OnChar ne se déclenche pas lorsqu'on efface tout ou une partie du contenu du CEdit. Tu peux écrire 8 caractères, supprimer le dernier et en récrire un nouveau 8ème...
    Pour compter les caractères, utilise GetWindowText pour récupérer le texte dans une variable de type CString, puis GetLength sur cette variable.

    D'autre part, il faut bien que tu saches que OnChar n'interceptera pas tout les événements de modification du texte. Vérifie pour la touche Suppr, la touche Retour arrière, le copier/couper/coller...

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    147
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 147
    Par défaut
    Pour controler la taille de saisie d'un CEdit il suffit d'utiliser la fonction SetLimitText.

    Ensuite pour le controle de saisie moi j'utilise le OnChange. je sais pas si c'est optimisé mais ca marche bien (et je peux rajouter le point et le signe moins tout en controlant qu'ils ne sont taper qu'une seule fois).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    void CMaClasse::OnChangeMycedit() 
    {
        CString Cur;
        m_cMycedit.GetWindowText(Cur);
        if (Cur.GetLength() > 0) {
            for (int i = 0 ; i < Cur.GetLength() ; i++) {
                if ((Cur.GetAt(i) < '0'  || Cur.GetAt(i) > '9')) {
                    m_cMycedit.SetSel(i, i+1, FALSE);
                    m_cMycedit.Cut();
                }
            }
        }
    }

Discussions similaires

  1. Filtrer les caractères saisis dans un CEdit
    Par ABAM3194 dans le forum MFC
    Réponses: 15
    Dernier message: 09/04/2015, 12h17
  2. [MySQL] refus des caractères arabes dans la saisie
    Par Amel_B dans le forum PHP & Base de données
    Réponses: 11
    Dernier message: 03/12/2008, 10h30
  3. saisie des caractéres arabe dans un jTextField
    Par RouRa22 dans le forum Composants
    Réponses: 12
    Dernier message: 08/09/2008, 09h57
  4. récupérer des données saisies dans un fichier
    Par natie_49 dans le forum C++
    Réponses: 6
    Dernier message: 24/11/2005, 11h29
  5. Chaînes avec des caractères accentués dans Interbase
    Par Invité dans le forum Bases de données
    Réponses: 2
    Dernier message: 04/03/2004, 22h39

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