RichTextBox предел символов?

У меня проблема с хранением огромного количества текста в богатом текстовом поле.

Я пытаюсь прочитать довольно большой текстовый файл (от 90 до 450 МБ) и поместить то, что я прочитал, в расширенное текстовое поле. Это работает в простой программе, но когда я делаю это в сложной программе, я получаю исключение OutOfMemory.

Следует отметить, что когда я выхожу из своей простой программы, я получаю исключение OutOfMemory прямо перед тем, как программа возвращает 0.

Вот код моей простой программы:

    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;

У меня есть аналогичный фрагмент кода в моем проекте, и исключение появляется, когда я делаю строку richTextBox1->Lines = strArray.

Я прочитал документацию по расширенному текстовому полю, и в нем говорится, что максимальное ограничение составляет 64 КБ символов, но это имеет смысл на полпути, так как я могу загрузить текст, но я предполагаю, что у программы есть проблемы с его сбросом после этого.

Любые идеи? Я пытался найти, возможно, некоторые пользовательские элементы управления без ограничений, но пока безуспешно.


person Pudpuduk    schedule 16.07.2009    source источник
comment
Возможно, вы сможете помочь мне с пользовательским элементом управления, если вы сообщите нам, что это за платформа/API. Я не знаком с QT, так что может быть это?   -  person DeusAduro    schedule 16.07.2009
comment
Это под Windows Vista, VS2008, C++   -  person Pudpuduk    schedule 16.07.2009


Ответы (1)


Что касается сброса огромного количества текста в расширенное редактирование, это обычно будет мучительно медленным, возьмите, например, блокнот, попробуйте открыть с его помощью файл размером 2 МБ. Я думаю, что более продвинутые текстовые редакторы справляются с этим с помощью «виртуального элемента управления». Я знаю, что они часто используются с элементами управления списками, и я думаю, что и с текстовыми полями. В основном они действуют/функционируют так же, как ваш обычный повседневный элемент управления, но не пытаясь отображать кучу текста за раз, у них есть виртуальное пространство «за пределами экрана».

Что касается вашей проблемы с нехваткой памяти ... Я смущен, вы говорите, что ошибка возникает в последней строке вашего примера кода, когда вы пытаетесь сбросить туда свой текст. Вы также упомянули, что ограничение составляет 64 КБ, поэтому теперь, если предположить, что ваш файл огромен, как вы говорите ... имеет смысл получить сообщение об ошибке, когда вы пытались сбросить текст размером более 64 КБ в ограниченное поле размером 64 КБ. Я что-то упускаю?

Редактировать Я перечитал некоторые вопросы. Я вижу, что вы сейчас спрашиваете, поэтому в простой программе вы получаете сообщение об ошибке после того, как все загружено, когда программа завершает работу. Добавьте точку отладки в свои деструкторы и посмотрите, где именно возникает эта ошибка.

Редактировать 2 Теперь, когда я знаю, на какой системе вы работаете, я пошел и посмотрел, документация немного сложнее, чем ограничение в 64 КБ. Что в первую очередь относится не к 64 КБ, а к 64000 символов. Также обратите внимание, что вы можете изменить этот лимит по своему усмотрению. Во-вторых, если вы транслируете с SF_TEXT, а не с SF_RTF, это ограничение не имеет никакого эффекта, что, как я полагаю, происходит за видимым интерфейсом .NET.

person DeusAduro    schedule 16.07.2009
comment
Что касается проблемы с памятью, я упомянул об этом, потому что в простой программе я могу загрузить код (даже если он медленный), а затем прокрутить его и все такое. Я получаю исключение, когда пытаюсь закрыть программу (прямо перед оператором return 0;). В более сложном проекте я получаю исключение, когда пытаюсь загрузить код. Я пытался указать, что можно загрузить код объемом 90 МБ в текстовое поле размером 64 КБ, поэтому я был озадачен, ха-ха. - person Pudpuduk; 16.07.2009
comment
Я сожалею, что понял это при втором прочтении. И это кажется довольно странным... какую платформу/API вы используете? - person DeusAduro; 16.07.2009
comment
Нет проблем. Под Vista, VS 2008, C++. Я так понимаю .NET? - person Pudpuduk; 16.07.2009
comment
У меня есть 39 тысяч строк в моем образце файла, каждая из которых содержит от 10 до 30 символов в строке, так что я все еще превышаю этот лимит на милю, ха-ха. Я попытался больше изучить деструктор, как вы предложили, но не вижу ничего необычного. Одна вещь, которую я заметил, это то, что свойства rtf и Text имеют исключение OutOfMemory в своих полях значений при отладке. И мой textLength составляет ... 92 миллиона. Я предполагаю, что мне нужно найти какой-то элемент управления, который делает то, что вы предложили в первом абзаце, и, надеюсь, мне не придется делать это самому, ха-ха. Спасибо за помощь - person Pudpuduk; 16.07.2009