ли RichTextBox лимит символов? - PullRequest
0 голосов
/ 16 июля 2009

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

Я пытаюсь прочитать текстовый файл довольно большого размера (от 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 КБ символов, но это имеет смысл на полпути, так как я могу загрузить текст, но я полагаю, что у программы возникла проблема с ее дампом впоследствии .

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

1 Ответ

1 голос
/ 16 июля 2009

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

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

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

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

...