Что может вызвать "ошибку вставки строки" в C++Builder при вставке текста на другом языке?

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

2 ответа

Решение

Исследования показывают, что эта проблема возникает только в 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() будут работать без исключения.

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

Другие вопросы по тегам