2009-07-16 11 views
0

Je n'arrive pas à stocker des quantités incroyables de texte dans un TextBox riche. J'essaie de lire un fichier texte assez volumineux (de 90 à 450 Mo) et de mettre ce que j'ai lu dans une riche zone de texte. Cela fonctionne dans un programme simple, mais quand je fais dans un programme compliqué je reçois une exception OutOfMemory.richTextBox limite de caractères?

Une chose à noter est que lorsque je quitte mon programme simple, je reçois une exception OutOfMemory juste avant le programme retourne 0.

Voici le code de mon programme simple:

array<String^>^ strArray; 
    StreamReader^ sr; 
    String^ dummyStr; 
    int dummyInt; 

     sr = gcnew StreamReader("C:\\testsize.txt"); 

     while((dummyStr = sr->ReadLine())!= nullptr) 
     { 
      dummyInt++; 
     } 
     sr->Close(); 

     sr = gcnew StreamReader("C:\\testsize.txt"); 
     strArray = gcnew array<String^>(dummyInt); 
     for(int i=0; i < strArray->Length; i++) 
     { 
      strArray[i] = sr->ReadLine(); 
     } 
     richTextBox1->Lines = strArray; 

J'ai extrait de code similaire dans mon projet, et l'exception apparaît lorsque je fais la ligne richTextBox1-> Lines = strArray. J'ai lu la documentation de la zone de texte riche, et il dit que la limite maximale est de 64 Ko de caractères, mais cela a du sens à mi-chemin, car je peux charger le texte, mais je suppose que le programme a un problème ensuite.

Des idées? J'ai essayé de trouver peut-être quelques contrôles personnalisés sans limite, mais sans succès jusqu'à présent.

+0

Peut être en mesure de m'aider avec un contrôle personnalisé si vous nous faites savoir quelle est la plate-forme/API c'est. Je ne connais pas QT donc ça pourrait être ça? – DeusAduro

+0

C'est sous Windows Vista, VS2008, C++ – Dinoo

Répondre

1

En ce qui concerne le déversement d'une énorme quantité de texte dans une édition enrichie, cela sera généralement extrêmement lent, prenez le bloc-notes par exemple, essayez d'ouvrir un fichier de 2 Mo avec celui-ci. Je pense que la façon dont les éditeurs de texte les plus avancés traitent ces derniers est par un «contrôle virtuel», je sais qu'ils sont souvent utilisés avec les contrôles de liste, et je pense aussi avec des zones de texte. Ils agissent essentiellement/fonctionnent de la même manière que votre contrôle quotidien normal mais sans essayer de rendre des tas de texte à la fois, ils ont un espace virtuel «hors de l'espace d'écran».

En ce qui concerne votre problème de manque de mémoire ... Je suis confus que vous dites que l'erreur se produit à la dernière ligne de votre exemple de code lorsque vous essayez de vider votre texte. Vous mentionnez également que la limite est de 64 Ko, donc en supposant que votre fichier est énorme comme vous le dites ... il est logique que vous obteniez une erreur, vous avez essayé de vider plus de 64 Ko de texte dans une boîte limitée de 64 Ko. Est-ce que je manque quelque chose? Je relis une partie de la question Je vois ce que vous demandez maintenant, donc dans le programme simple vous obtenez une erreur après que tout soit chargé, quand le programme se termine. Jetez un point de débogage dans vos destructeurs, et voyez exactement où cette erreur se produit.

Editer 2 Maintenant que je connais le système sur lequel vous êtes, je suis allé jeter un coup d'oeil, la documentation est un peu plus complexe que la limite 64K. Ce qui d'abord ne fait pas référence à 64 Ko mais plutôt à 64 000 caractères. Notez également que vous pouvez modifier cette limite à votre guise. Deuxièmement, si vous êtes en streaming avec SF_TEXT et non SF_RTF, cette limite n'a aucun effet, ce que j'imagine est ce qui se passe derrière le vu de l'interface .NET.

+0

Sur le problème de mémoire, je l'ai mentionné parce que dans le programme simple, je suis capable de charger du code (même si lent), puis de le parcourir et tout. Je reçois l'exception lorsque j'essaie de fermer le programme (juste avant l'instruction "return 0;"). Dans le projet plus complexe, je reçois l'exception lorsque j'essaie de charger le code. J'essayais de souligner qu'il est possible de charger 90 Mo de code dans la boîte de texte 64 Ko, c'est pourquoi j'ai été boggled haha. – Dinoo

+0

Ya désolé j'ai attrapé cela sur la deuxième lecture à travers. Et cela semble assez étrange ...quelle plate-forme/api utilisez-vous? – DeusAduro

+0

Aucun prob. C'est sous Vista, VS 2008, C++. Donc je suppose .NET? – Dinoo

Questions connexes