如何在 Delphi 11.1.5中切换到Rich Edit 4.1(或更高版本)

wwwo4jvm  于 2023-10-18  发布在  其他
关注(0)|答案(1)|浏览(152)

我在 Delphi 11.1.5中遇到了基本TRichEdit组件的字符编码问题。如果我切换键盘语言并输入匈奴/en特殊字符(ő/ű/²),它不会在输出RTF中处理这种情况。它只在\ansicpgN处存储一个代码页,而不将其存储在字体表项\fN\cpgN中,并且它使用\'NN代码而不是\uNNNN。Bing说如果我切换到RichEdit 4. 1,它会解决我的问题。但我怎么能换?有人能帮帮我吗?
Bing说我应该在包含TRichEdit控件的表单的OnCreate事件中调用它:

SetWindowLong( RichEdit1.Handle, GWL_WNDPROC, HashCode( 'RICHEDIT41' ) );

但它无法定义适当的散列函数来提供工作散列代码。
这是一个非常简单,但有问题的RTF文档:

{\rtf1\ansi\ansicpg1250\deff0\nouicompat\deflang1038{\fonttbl{\f0\fnil\fcharset238 Arial;}{\f1\fnil\fcharset0 Arial;}{\f2\fnil\fcharset238 Times New Roman;}}
{\colortbl ;\red255\green0\blue0;}
{\*\generator Riched20 10.0.19041}\viewkind4\uc1 
\pard\f0\fs24\'f5\f1\lang1033\'b2\cf1\f2\lang1038\'fb\f0\par
}

在这个例子中,我应该转换代码页为1250的ANSI \'F5\'fb字符,但转换代码页为1252的ANSI \'b2字符以获得正确的UTF-16字符串:'ő²ű'
\fN选择字体,但这些存储\fcharsetN,而不是所需的\cpgX值。
但是使用RichEdit 4.1,我不会错过\cpgN,因为它存储了以UTF-16格式编码的特殊字符代码:\uNNNN在内容部分。

qyzbxkaa

qyzbxkaa1#

TRichEdit已经使用RichEdit 4.1,并且从 Delphi 11的初始版本开始:
TRichEdit组件更新为RichEdit 4.1(MSFTEDIT.dll)
在任何情况下,TRichEdit本身都不会(也从来没有)格式化实际的RTF本身,这都是Microsoft所做的。因此,无论您在RTF中遇到什么问题,都应该与Microsoft一起解决,而不是Embarcadero。TRichEdit只是向底层RichEdit发送一条EM_STREAMOUT消息,Microsoft完成创建RTF的所有工作,TRichEdit只是将输出写入调用方提供的TStream对象。
此外,您不能向SetWindowLong(GWL_WNDPROC)传递 hash code,因为它需要一个实际的函数指针。Bing给你的信息不好/不完整。

相关问题