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 :

Besoin d'aide sur une EditBox


Sujet :

MFC

  1. #1
    Membre régulier
    Inscrit en
    Mai 2008
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 9
    Par défaut Besoin d'aide sur une EditBox
    Salut tout le monde
    J'ai une edit box contenant une variable membre : m_var de type CString
    j'aimerais que lors de la saisie de l'utilisateur, il se fasse un espacement automatique tout les deux caractères
    (s'il tape 123456, il faut que ça affiche 12 34 56)

    J'espère que vous pourrez m'aider
    Merci

  2. #2
    Membre chevronné Avatar de stephdim
    Profil pro
    Inscrit en
    Août 2007
    Messages
    462
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 462
    Par défaut
    salut,

    ça s'appelle un Masked Edit Control.
    si tu as VS2008 avec le Feature Pack il y a un controle de ce type dans les MFC.
    sinon tu peux regarder ici, entre autres (c'est pas les exemples qui manquent sur le net) : http://www.codeproject.com/KB/edit/maskededit.aspx

    @+

  3. #3
    Membre régulier
    Inscrit en
    Mai 2008
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 9
    Par défaut
    Merci pour ta réponse donc j'ai VS-2003, en fait je chch qqch d'un peu différent, dans l'exemple que tu m'as montré les caractères pré-existent déjà, il s'agit d'un remplacement a ce que je vois.
    Mon Edit box elle ne doit rien afficher dans la mesure ou la saisie n'est pas limitée (a la seule mémoire par contre ^^), elle doit afficher les caractères deux par deux lors de la saisie de l'utilisateur (séparés par qqch genre un espace, un point, ou un tiret etc...).

  4. #4
    Membre régulier
    Inscrit en
    Mai 2008
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 9
    Par défaut
    Ba Mince, Personne pour m'aider ?!

  5. #5
    Membre chevronné Avatar de stephdim
    Profil pro
    Inscrit en
    Août 2007
    Messages
    462
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 462
    Par défaut
    ben ce que je t'avais donné en lien était une piste ; a toi de creuser le source code pour l'adapter a ton besoin ...

    une autre piste, un peu plus simple :

    tu interceptes l'évènement EN_CHANGE (c'est un évènement qui est déclenché par le controle Edit pour signaler que le contenu a changé)

    tu récupères le texte saisie dans un CString avec GetWindowText()

    tu fais ton traitement sur la chaine de caractères, un espace tout les deux caractères ...

    tu mets à jour le texte du controle Edit par un SetWindowText() à partir de ta chaine de caractères CString

    @+

  6. #6
    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
    Bonjour,

    Citation Envoyé par stephdim Voir le message
    ben ce que je t'avais donné en lien était une piste ; a toi de creuser le source code pour l'adapter a ton besoin ...
    stephdim a raison : il faut que tu cherches un peu par toi même. Nous n'allons pas te donner le code déjà tout prêt. Nous ne sommes pas là pour ça...

    Citation Envoyé par stephdim Voir le message
    une autre piste, un peu plus simple :

    tu interceptes l'évènement EN_CHANGE (c'est un évènement qui est déclenché par le controle Edit pour signaler que le contenu a changé)

    tu récupères le texte saisie dans un CString avec GetWindowText()

    tu fais ton traitement sur la chaine de caractères, un espace tout les deux caractères ...

    tu mets à jour le texte du controle Edit par un SetWindowText() à partir de ta chaine de caractères CString
    Je rajoute une petite précision : fais attention car SetWindowText appellera une deuxième fois la méthode événementielle déclenchée par EN_CHANGE. Gare, donc, à ne pas ajouter des espaces en boucle infinie...

  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
    Jette un oeil aux DDV.
    Ce lien pourrait t'intéresser : lien

  8. #8
    Membre régulier
    Inscrit en
    Mai 2008
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 9
    Par défaut
    Coucou, oui alors ce que vous dites c'est très sympa, merci de participer, bon pour ceux que ça pourrai titiller, sachez aussi, que je ne reste pas assis a attendre votre code bien au contraire

    oui, j'ai bien pensé à l'évènement En_Change
    ce que j'aimerais c'est plus une manière de procéder que du code pré-mâché, après si il y a du code a proposer je crache pas dessus, au contraire, car toute aide est la bien venue.

    Ah aussi très utile de savoir que SetWindowText rappelle l'évènement.
    moi je fait les modification sur les variables directement (SetAt, Insert...), puis je remet a jour l'affichage, comme ça je ne tombe pas dans la boucle infini en effet.

  9. #9
    Membre chevronné Avatar de stephdim
    Profil pro
    Inscrit en
    Août 2007
    Messages
    462
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 462
    Par défaut
    Ah aussi tres utile de savoir que SetWindowText réapel l'evenement.
    moi je fait les modification sur les variables directement (SetAt, Insert...), puis je remet a jour l'affichage, comme ça je ne tombe pas dans la boucle infini en effet.
    il n'y a pas de récursivité si tu fais un SetWindowText() dans un OnEnChange() ;
    le controle Edit fait déjà le nécessaire pour pas que ça arrive

    ensuite tu peux faire ton insertion dans la meme chaine, au lieu de faire deux chaines différentes

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    CString text;
    GetWindowText(text);  // récupération du texte
    text.Remove(_T(' '));  // on enlève les espaces déjà présents
    int i=text.GetLength()-1;
    if (i&1) i--;
    while (i>0)
    {
      text.InsertAt(i,_T(' '));
      i-=2;
    }
    SetWindowText(text);  // mise à jour du texte
    évite les UpdateData(), car c'est une procédure qui met à jour toutes les variables en meme temps.

    @+

  10. #10
    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
    Citation Envoyé par stephdim Voir le message
    il n'y a pas de récursivité si tu fais un SetWindowText() dans un OnEnChange() ;
    le controle Edit fait déjà le nécessaire pour pas que ça arrive
    Tu es sûr de ça ? Parce que je suis en train de travailler sur un CEdit, justement, et quand je fais un SetWindowText dans OnEnChange, ça déclenche immédiatement un autre appel à OnEnChange....

  11. #11
    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
    D'autre part, la méthode InsertAt n'existe pas dans CString... C'est la méthode Insert qu'il faut employer dans ce cas.

  12. #12
    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
    Citation Envoyé par PetitPapaNoël Voir le message
    Tu es sûr de ça ? Parce que je suis en train de travailler sur un CEdit, justement, et quand je fais un SetWindowText dans OnEnChange, ça déclenche immédiatement un autre appel à OnEnChange....
    C'est peut-être parce que je travaille dans une classe dérivée de CEdit, et non pas dans la fenêtre qui contient l'edit.

  13. #13
    Membre chevronné Avatar de stephdim
    Profil pro
    Inscrit en
    Août 2007
    Messages
    462
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 462
    Par défaut
    Tu es sûr de ça ? Parce que je suis en train de travailler sur un CEdit, justement, et quand je fais un SetWindowText dans OnEnChange, ça déclenche immédiatement un autre appel à OnEnChange....
    Non, je viens de faire un essai là et effectivement c'est récursif
    Donc il faut mettre un verrou ...

    D'autre part, la méthode InsertAt n'existe pas dans CString... C'est la méthode Insert qu'il faut employer dans ce cas.
    Ooops j'ai écris trop vite ... un mix entre SetAt() et Insert()

    c'est le vendredi apres-midi, c'est normal

    @+

  14. #14
    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
    Citation Envoyé par stephdim Voir le message
    Non, je viens de faire un essai là et effectivement c'est récursif
    Donc il faut mettre un verrou ...
    Ceci dit, j'ai aussi essayé ce que tu proposes et, bizarrement, la méthode OnEnChange n'est exécutée que 10 fois, alors qu'on pourrait penser que la récursivité est infinie. Les gens de chez Microsoft ont dû faire quelque chose pour éviter ce genre de problème...

    Pour le verrou, il faudrait enregistrer le texte après modification dans une variable membre et comparer la valeur de celle-ci au texte récupéré par GetWindowText. S'il elle est différente, on met à jour le texte, sinon, on ne fait rien.

    Citation Envoyé par stephdim Voir le message
    Ooops j'ai écris trop vite ... un mix entre SetAt() et Insert()

    c'est le vendredi apres-midi, c'est normal
    C'est pas grave. On ne t'en veut pas !

  15. #15
    Membre chevronné Avatar de stephdim
    Profil pro
    Inscrit en
    Août 2007
    Messages
    462
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 462
    Par défaut
    Ceci dit, j'ai aussi essayé ce que tu proposes et, bizarrement, la méthode OnEnChange n'est exécutée que 10 fois, alors qu'on pourrait penser que la récursivité est infinie. Les gens de chez Microsoft ont dû faire quelque chose pour éviter ce genre de problème...
    j'ai constaté la meme chose, mon évènement était avec un beau AfxMessageBox()

    Pour le verrou, il faudrait enregistrer le texte après modification dans une variable membre et comparer la valeur de celle-ci au texte récupéré par GetWindowText. S'il elle est différente, on met à jour le texte, sinon, on ne fait rien.
    il y a plus simple :

    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
     
    void OnEnChange()
    {
      static bool inside=false;
     
      if (inside)
        return;
     
      inside=true;
     
     
      ...
     
     
      inside=false;
    }
    le hic c'est de ne pas oublier de remettre la var inside à false en quittant la fonction (attention aux exceptions)

    sinon faire une mini-classe avec comme constructeur mettre la variable à true et comme destructeur mettre la variable à false. à la sortie du scope, le compilateur appel automatiquement le destructeur, meme en cas d'exception ...

    @+

  16. #16
    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
    Plus simple, plus simple... Mouais

  17. #17
    Membre régulier
    Inscrit en
    Mai 2008
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 9
    Par défaut
    Oh Merci les copins, c genial ! ça marche et en plus c encor plus simple que ce que j'imaginais ! ,
    Je ne conaissait pas le REemove alors j'étais parti dans le delire de formater la chaine avec les espaces qu'elle contenait déja !

    Sinon c vrai que c pas forcement plus simple, donc pour l'instant je me contente d'utiliser les Updatedata().

    le seul c quand je tape des caracteres, le curseur change de place et revien au debut automatiquement, surement a cause du Update.

    j'ai pu le forcer a garder sa position de fin de ligne, mais c pas pratique quand on veu tapper du texte au mileu

  18. #18
    Membre régulier
    Inscrit en
    Mai 2008
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 9
    Par défaut
    Citation Envoyé par iMouss Voir le message
    le seul c quand je tape des caracteres, le curseur change de place et revien au debut automatiquement, surement a cause du Update.

    j'ai pu le forcer a garder sa position de fin de ligne, mais c pas pratique quand on veu tapper du texte au mileu
    Ok Bon pour ce dernier pb j'ai vu il faut utiliser les méthodes GetSel() et SetSel() de CEdit.

    Pas merveilleux les CStrings ?
    Merci a tous PB résolu !!

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

Discussions similaires

  1. [SQL] Besoin d'aide sur une requête
    Par Angath dans le forum Langage SQL
    Réponses: 2
    Dernier message: 17/01/2006, 16h26
  2. besoin d'aide sur une requette sql
    Par maxidoove dans le forum Langage SQL
    Réponses: 13
    Dernier message: 10/10/2005, 18h42
  3. Besoin d'aide sur une fonction
    Par PrinceMaster77 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 30/08/2005, 17h40
  4. Réponses: 1
    Dernier message: 03/08/2005, 11h41
  5. Besoin d'aide sur une requête (JOIN + COUNT ?)
    Par PanzerKunst dans le forum Langage SQL
    Réponses: 2
    Dernier message: 01/06/2005, 10h29

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