iMouss
Messages postés18Date d'inscriptionjeudi 13 décembre 2007StatutMembreDernière intervention23 mai 2008
-
21 mai 2008 à 16:10
iMouss
Messages postés18Date d'inscriptionjeudi 13 décembre 2007StatutMembreDernière intervention23 mai 2008
-
23 mai 2008 à 13:08
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)
iMouss
Messages postés18Date d'inscriptionjeudi 13 décembre 2007StatutMembreDernière intervention23 mai 2008 21 mai 2008 à 20:29
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...
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 21 mai 2008 à 21:37
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);
}
iMouss
Messages postés18Date d'inscriptionjeudi 13 décembre 2007StatutMembreDernière intervention23 mai 2008 22 mai 2008 à 16:31
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 .
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 22 mai 2008 à 18:47
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é.
iMouss
Messages postés18Date d'inscriptionjeudi 13 décembre 2007StatutMembreDernière intervention23 mai 2008 23 mai 2008 à 11:56
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 :
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.
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 23 mai 2008 à 12:07
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.
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 23 mai 2008 à 12:07
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.
iMouss
Messages postés18Date d'inscriptionjeudi 13 décembre 2007StatutMembreDernière intervention23 mai 2008 23 mai 2008 à 13:08
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 .