我有一个使用TRichText控件的C ++ Builder应用程序,该控件必须显示在Windows XP下运行的报表。该应用程序是用英语编写的,但已经过改编以使用其他语言。只要我使用西方语言,在TRichEdit上创建文本(使用RichEdit-> Lines-> Add()函数)就没问题了。当我尝试添加俄语(西里尔文)时,应用程序会抛出一个带有“RichEdit行插入错误”的EOutOfResources异常。现在,当文本量超过RichEdit内部缓冲区(64KB)时,通常会抛出此异常,但情况肯定不是这样,甚至添加一个字符也会失败。
它不是unicode应用程序,所以我必须切换代码页以查看Cyrillic中的应用程序。然后我可以看到所有其他文本(如菜单和标签)显示正确。
那还有什么可能导致这个错误呢?
答案 0 :(得分:1)
RTF期望7位ASCII以外的任何内容都是转义序列。有关转义序列的更多详细信息,请参阅this page。我认为详细控制页面编码的部分对您最有用。
答案 1 :(得分:0)
研究显示这是一个仅在Windows XP上出现的问题。当Windows XP具有特定语言的区域设置时,也不会发生此错误。问题似乎是在此版本的Windows提供的RichEd32.dll中。当添加到TRichText控件的一行文本的第一个字符是转义字符时,VCL(C ++ Builder和Delphi使用的可视化组件库)失败。解决方案是使用以下代码添加一行:
AnsiString TextToAdd;
TextToAdd = "пример"; // Russian text 'example'
RichEdit1->SelStart = RichEdit1->Text.Length();
RichEdit1->SelText = TextToAdd + "\r\n";
而不是:
RichEdit1->Lines->Add( TextToAdd );
这实际上只需要进行一次。将文本添加到应用程序中的任何RichEdit控件后,对“Lines-> Add()”的所有后续调用都将起作用,而不会抛出异常。