Edit Control

Edit Control - C++ - Programmation

Marsh Posté le 20-04-2005 à 17:21:42    

Bonjour,
Je suis enmerdé avec un Edit Control qui fait planté mon appli car il est plein. Je l'utilise en multi-lignes.
J'ai beau changé la taille limite mais rien y fait, ca plante toujours.
A l'initialisation de la fenetre je fais ca :

Code :
  1. UINT maxLimit = 600000000;
  2. editControl.SetLimitText(maxLimit);


 
et apres j'ajoute mon texte avec

Code :
  1. editControl.SetWindowText("mon_texte" )


Il s'étend sur des centaines de ligne au final.
 
Que faire? Merci


Message édité par AsTro le 20-04-2005 à 17:25:19
Reply

Marsh Posté le 20-04-2005 à 17:21:42   

Reply

Marsh Posté le 20-04-2005 à 17:32:55    

En fait, j'utilise une CString intermédiaire. Je pense que c'est elle qui est trop courte. Existe-t-il un type plus grand que CString?
 
Comment je pourrais faire ca proprement? Je vais pas faire un tableau de CString :(

Reply

Marsh Posté le 20-04-2005 à 18:41:18    

Comment utilises-tu ton CString ?


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 20-04-2005 à 18:58:24    

CString::GetLength() retourne un int, on peut donc supposer que la taille maximale d'une CString tient sur 32 bits !
Donc bon, je veux bien te croire quand tu dis que tes chaines sont longues, mais de là à atteindre 4 294 967 296 caractères, je pense plutot que tu dois te louper en utilisant ta CString


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 20-04-2005 à 19:30:31    

me semble que la classe CEdit a une limitation pour la taille maximale de donnée, genre 32k pour win98 et 64k pour win NT/XP/2K.
 
Pour dépasser ca, tu peux remplacer ton CEdit par un CRichEditCtrl qui n'a pas cette limite (ou beaucoup plus loin).
sinon il me semble que CEdit remonte un evenement lorsqu'il est plein.

Reply

Marsh Posté le 20-04-2005 à 20:03:36    

Je crois qu'il s'agit de taille par défaut, qui sont modifiables même avec l'Edit de base. De plus, si je me souviens bien cette taille limite n'affecte que le texte tapé / entré par l'utilisateur et non le texte envoyé par WM_SETTEXT.


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 20-04-2005 à 20:31:45    

SquiZZ a écrit :

me semble que la classe CEdit a une limitation pour la taille maximale de donnée, genre 32k pour win98 et 64k pour win NT/XP/2K.
 
Pour dépasser ca, tu peux remplacer ton CEdit par un CRichEditCtrl qui n'a pas cette limite (ou beaucoup plus loin).


 
Un Edit multiligne de windows ne peut contenir que 64k en Win9x, mais 2 Go en NT/2K/XP. Je ne sais par contre pas si le CEdit suit les mêmes limites que l'Edit de l'API Win32. Je me base sur les limites du "TMemo" en Delphi :D


Message édité par antp le 20-04-2005 à 20:32:50

---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 20-04-2005 à 20:57:08    

En fait j'ai une appli qui recupere par WMI les logiciels installés sur la machine. Donc en gros j'ai une boucle et pour chaque logiciel je recupere une 20aine d'infos. Donc au fur et a mesure je rempli ma CString:
 
En gros je fais ca : (j'ai pas le code sous les yeux)
 

Code :
  1. CString edit_text = "Début";
  2. while(...)
  3. {
  4.     edit_text += "\r\n";
  5.     edit_text += resultat_wmi;
  6.     editControl.SetWindowText(edit_text);
  7. }


 
Et au bout d'un moment ca plante. Si j'arrete aux bout de 10 boucles ca marche donc je suppose que c'est un probleme de taille de CString ou CEdit.
 
J'ai aussi passé ma variable CEdit en Value plutot que Control et ca fait la meme chose.


Message édité par AsTro le 20-04-2005 à 20:59:18
Reply

Marsh Posté le 20-04-2005 à 21:01:06    

antp a écrit :

Un Edit multiligne de windows ne peut contenir que 64k en Win9x, mais 2 Go en NT/2K/XP. Je ne sais par contre pas si le CEdit suit les mêmes limites que l'Edit de l'API Win32. Je me base sur les limites du "TMemo" en Delphi :D


 
 
Si je récupère la taille du CEdit (GetLimitText) il me renvoi 300000 je crois me souvenir.
 
Le CRichEditCtrl c'est en C# ca je crois.


Message édité par AsTro le 20-04-2005 à 21:01:32
Reply

Marsh Posté le 20-04-2005 à 21:05:45    

AsTro a écrit :


Et au bout d'un moment ca plante.


 
Ca plante comment ?

Reply

Marsh Posté le 20-04-2005 à 21:05:45   

Reply

Marsh Posté le 20-04-2005 à 21:37:35    

Je te dis ca demain, mais de tete, le debug m'envoi dans une fonction de CString.h ou un fichier du genre, je confirme demain.

Reply

Marsh Posté le 20-04-2005 à 22:46:15    

resultat_wmi c'est quoi exactement ?
Le Rich Edit c'est Win32 de base.


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 21-04-2005 à 09:19:29    

Mon resultat_wmi c'est :

Code :
  1. BSTR HUGEP *pbstr;


 
et je l'utilise comme ca :

Code :
  1. CString tmpName;
  2. ...
  3. while(...)
  4. {
  5.    ...
  6.    tmpName = pbstr[i];
  7.    edit_result += "\r\n";
  8.    edit_result += tmpName;
  9.    edit_result += " : ";
  10.    editControl.SetWindowText(edit_result);
  11.    ...
  12. }


 
 
Et le debug m'envoi dans le fichier "cstringt.h" sur la ligne:

Code :
  1. static int __cdecl GetBaseTypeLength( LPCWSTR pszSource ) throw()
  2. {
  3. // Returns required buffer length in XCHARs
  4. return ::WideCharToMultiByte( _AtlGetConversionACP(), 0, pszSource, -1, NULL, 0, NULL, NULL )-1; // <------  sur cette ligne
  5. }


Message édité par AsTro le 21-04-2005 à 09:53:58
Reply

Marsh Posté le 21-04-2005 à 10:37:09    

et je suppose que ton pointeur n'est jamais nul...


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 21-04-2005 à 11:17:46    

Je ne pense pas que ce soit ca car je teste si la fonction qui assigne le pointeur échoue.  
De plus, Il y a 20 resultats à afficher. Si j'affiche tout ca plante au 11eme. Si j'affiche les 10 premiers ca passe et si j'affiche le reste, les 10 derniers, ca passe aussi, donc y'a pas de pointeur NULL qui traine :(


Message édité par AsTro le 21-04-2005 à 11:31:01
Reply

Marsh Posté le 21-04-2005 à 14:00:49    

Oui c'est un bad pointer mon probleme, mais comment je peux tester quand j'ai un bad pointer pour ne pas effectuer d'opération dessus? (j'ai testé avec NULL et 0 mais ca ne marche pas)
Pour info ma variable est un VARIANT et je recupere la valeur qu'il m'interrese comme ca :
mon_variant.bstrVal;
Et le debuggage me met pour mon_variant.bstrVal : 0x000000a8 <Bad Ptr>.
 
Ce qui est zarb c'est que y'a souvent <Bad Ptr> mais ca passe sans probleme.

Reply

Marsh Posté le 21-04-2005 à 17:01:37    

Test si mon_variant.vt == VT_BSTR.
Tu récupères ça comment exactement ? Tu fais gaffe aux fuites de mémoire ?
Tu devrais jeter un oeil à _bstr_t et _variant_t.


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed