Edit Box

Signaler
Messages postés
18
Date d'inscription
jeudi 13 décembre 2007
Statut
Membre
Dernière intervention
23 mai 2008
-
Messages postés
18
Date d'inscription
jeudi 13 décembre 2007
Statut
Membre
Dernière intervention
23 mai 2008
-
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 sa fasse un espacement automatique tout les deux caracteres
(s'il tape 123456, il faut que ça affiche 12 34 56)

J'espere que vous pourrez m'aider
Merci

10 réponses

Messages postés
18
Date d'inscription
jeudi 13 décembre 2007
Statut
Membre
Dernière intervention
23 mai 2008

Please un peu d'aide ceux qui savent
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
24
Manque une info:
en cas de "123"
tu veux "1 23" ou "12 3" ?

Je pourrais te le faire sur du char[], je ne pratique pas le prémaché.

ciao...
BruNews, MVP VC++
Messages postés
18
Date d'inscription
jeudi 13 décembre 2007
Statut
Membre
Dernière intervention
23 mai 2008

je pensait que cétai assé préci comme cétait exposé en fait, sil tape 123 ca affiche "12 3".
si ça avait été "1 23" alors j'aurais pas dit "tout les deux caracteres" sachant que le premier ce serai retrouvé forcément seul...
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
24
Ne le prends pas mal, ce n'est pas une attaque contre toi, bien au contraire.

"variable membre : m_var de type CString" et autres biniouteries de ce genre, tu crois vraiment que c'est avec toutes ces surcouches masquant le code que tu sauras te débrouiller en dev ?
Apprends à manier tableaux et pointeurs, entraine toi jusqu'à ce que ça devienne aussi naturel que de respirer et tu verras que tu n'auras plus jamais à poser ce type de question, ce sera résolu plus vite que de l'écrire.

Voila exemple sur une dialog avec 2 EDIT:
HWND htxt 0, hres 0;


void OnEdChange()
{
  char *pmem, *c, *d, a;
  DWORD len;
  SetWindowText(hres, 0);
  len = GetWindowTextLength(htxt);
  if(!len) return;
  pmem = HeapAlloc(GetProcessHeap(), 0, len + len / 2 + 1);
  if(!pmem) return;
  c = pmem; // POINTEUR SUR DEBUT DU TEXT MIS EN FIN DE BUFFER
  if(len > 2) c += (len / 2);
  GetWindowText(htxt, c, len + 1);
  if(len < 3) goto okTXT;
  d = pmem; // POINTEUR DE REECRITURE
  len = 0;
  while(a = *c++) {    if(++len > 2) {*d++ 32; len 1;}
    *d++ = a;
  }
  *d = 0;
okTXT:
  SetWindowText(hres, pmem);
  HeapFree(GetProcessHeap(), 0, pmem);
}


BOOL CALLBACK AppDlgProc(HWND hdlg, UINT mssg, WPARAM wParam, LPARAM lParam)
{
  switch(mssg) {
    case WM_INITDIALOG:
      SetClassLongPtr(hdlg, GCLP_HICON, (long)LoadIcon(0, IDI_APPLICATION));
      htxt = GetDlgItem(hdlg, IDED_TXT);
      hres = GetDlgItem(hdlg, IDED_RES);
      return 1;
    case WM_COMMAND:
      switch(wParam) {        case 0x30003E9: // EN_CHANGE 0x300, IDED_TXT 1001
          OnEdChange();
          break;;
        case IDCANCEL: EndDialog(hdlg, 0);
      }
  }
  return 0;
}

et je te promets que je ne me suis pas abimé un neurone sur ce coup.
Il faut absolument t'y mettre, tu as tout à y gagner.

ciao...
BruNews, MVP VC++
Messages postés
18
Date d'inscription
jeudi 13 décembre 2007
Statut
Membre
Dernière intervention
23 mai 2008

Salut merci pour ta reponse,
Je n'ai pas bien examiné le code que tu m'a passé, mais j'aurai aimé savoir ce que fait ton code ou bien ce que tu ferais dans le principe plutot que de me preter un sympathique parchemin a dechifrer .
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
24
Ce code fait précisément ce qui était demandé.
Au fur et à mesure que l'EDIT où on tape change, l'autre EDIT reçoit le texte formaté comme tu l'as demandé.

Je te mets le projet complet ici:
http://brunews.com/Separ.zip

ciao...
BruNews, MVP VC++
Messages postés
18
Date d'inscription
jeudi 13 décembre 2007
Statut
Membre
Dernière intervention
23 mai 2008

Ouille Ouille Ouille !
Merci encore, je viens de regarder plus ou moin en détail le code et ce qu'il faisait,
bon au passage je pense qu'au niveau des pointeurs je maitrise assez bien, je sais tres bien comment ils fonctionnent et je te remercie d'ailleur de tes conseils au cas ou je n'étais pas averti de leur utilisations;

Alors a ce que je vois tu a créé tou plein de pointeurs et utilisé l'allocation dynamique sur la pile  (où perso j'aurai utilisé un New pour sa performance et sa simplicité d'utilisation) pour pouvoir finalement placer des espaces entre les caracteres dans une autre editbox, ça je doit dire c la solution facile, mais malheuresement je ne peu pa fair ça :(

Bon sinon les binouterie du genre CString, elles masquent le code c vrai :S, mais elles sont bien plus pratique a l'utilisation.

voila le meme code sans pointeurs, sans allocations, sans trop de variable supplementaire, et en le lisant on croirai lire du francais tellment c explicite :

void OnEdChange()
{
    this->UpdateData();//vers variables
 
    int len=m_ATQA.GetLength();
    m_UID="";
    int i, j=2;
    if (len>2)
    {
        for (i=0; i<len; i++)
        {
            m_UID.Insert(j,m_ATQA.GetAt(i));
            if (i%2==1)    m_UID.Insert(j++," ");
            j++;
        }
    }
    else m_UID=m_ATQA;

    this->UpdateData(false);
}

Avec les pointeur fo kan mm s'assurer de pointer au bon endroi, toujours passé
d'un pointeur a lautre pour recopier l'adresse et fair les traitments, enfin bon... on s'en
sort plus.
Derrier ce code surment plein de cochoneries ki tournent et peu etre pas optimisé (meme si je pense qu'elles le sont quand meme un peu héhé), mé jsui pa a qq nanosecondes pres.

Je te dit merci encore pour ta solution, mais je vais continuer de chercher un pti peu.
Si quelqu'un a une idée n'hésitez pas.
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
24
Dernière info:
'new' finit après moultes vérifs chez HeapAlloc (tout comme malloc), la ligne droite étant toujours le plus court chemin, on ne peut pas parler de 'performances de new' par rapport à un appel direct HeapAlloc.

ciao...
BruNews, MVP VC++
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
24
Dernière info:
'new' finit après moultes vérifs chez HeapAlloc (tout comme malloc), la ligne droite étant toujours le plus court chemin, on ne peut pas parler de 'performances de new' par rapport à un appel direct HeapAlloc.

ciao...
BruNews, MVP VC++
Messages postés
18
Date d'inscription
jeudi 13 décembre 2007
Statut
Membre
Dernière intervention
23 mai 2008

Oui tout a fait vrai, mais une ligne droite avec quelques embuches suplémentaire quand meme.

"New will in term allocate from heaps when your program needs memory." : en effet on fici chez HeapAlloc,

"This is a good scheme because no matter how many[javascript:void(0) ] times
your program allocates or destroys memory with new, windows does not
see it." interessant de le savoir meme si ça sert pas a grand chose. 

"That is, windows does not heed to change its heap.  Thus
window's heap stays simple with a small number of large blocks.  This
helps windows to load and free programs quickly." donc finalement on peu pas tro parler de difference pas tro de difference de chemin :p

"There are
other advatanges to using new as well.  You don't have to worry about
mistakenly allocating an object with a constructor using HeapAlloc(). You don't have to worrk about mistakenly calling delete on memory
allocated with HeapAlloc()." : Ah la ok, New utilisation simple et plus sur que HeapAlloc.

"In addition, in VC if you use
new, you can use the debug heap features to do some very important test
for memory errors.  You can't do this with HeapAlloc()." : Ouai..bon a savoir et tres utile en effet.

essai quand meme de considerer d'utiliser new next time, aussi de maniere generale essai de penser a la maniere de traverser un chemin avant de considerer sa taille .

Bien lmerci a toi