Что может вызвать «ошибку вставки строки» в C ++ Builder при вставке текста на другом языке? - PullRequest
0 голосов
/ 27 сентября 2011

У меня есть приложение C ++ Builder, использующее элемент управления TRichText, который должен отображать отчет, работающий под Windows XP. Приложение было написано на английском языке, но было адаптировано для использования других языков. Создание текста в TRichEdit (с использованием функции RichEdit-> Lines-> Add ()) не составляет проблемы, если я использую западные языки. Когда я пытаюсь добавить русский (кириллический) текст, однако приложение выдает исключение EOutOfResources с «RichEdit ошибка вставки строки». Теперь это исключение обычно выдается, когда объем текста превышает внутренний буфер RichEdit (64 КБ), но это, конечно, не тот случай, и даже добавление одного символа завершается неудачей.
Это не приложение Unicode, поэтому мне приходится переключать кодовые страницы, чтобы увидеть приложение на кириллице. И тогда я вижу, что все остальные тексты (например, меню и метки) отображаются правильно.
Так что еще может вызвать эту ошибку?

Ответы [ 2 ]

1 голос
/ 27 сентября 2011

RTF ожидает, что что-либо за пределами 7-битного ASCII будет escape-последовательностью. Смотрите эту страницу для более подробной информации о escape-последовательностях. Я думаю, что раздел, в котором подробно описывается кодировка страницы управления, был бы наиболее полезным для вас.

0 голосов
/ 30 сентября 2011

Исследования показывают, что эта проблема возникает только в Windows XP.Также ошибка не возникает, когда в Windows XP есть настройки локали для определенного языка.Проблема, кажется, в RichEd32.dll, который поставляется с этой версией Windows.VCL (библиотека визуальных компонентов, используемая C ++ Builder и Delphi) завершается ошибкой, когда первый символ строки текста, добавляемой в элемент управления TRichText, является экранированным символом.Решение состоит в том, чтобы использовать следующий код для добавления строки:

AnsiString TextToAdd;
TextToAdd = "пример"; // Russian text 'example'

RichEdit1->SelStart = RichEdit1->Text.Length();
RichEdit1->SelText = TextToAdd + "\r\n";

Вместо:

RichEdit1->Lines->Add( TextToAdd );

На самом деле это нужно сделать только один раз.После добавления текста в любой элемент управления RichEdit в приложении все последующие вызовы Lines-> Add () будут работать без исключения.

...