Delphi:TRichEdit非默认非Unicode系统语言中的文本字符串(ANSI)

Delphi:TRichEdit非默认非Unicode系统语言中的文本字符串(ANSI),第1张

概述所以这是设置: >使用TRichEdit控件创建一个新的Delphi 7应用程序.我们在这里谈论非Unicode应用程序. >在Windows的“区域和语言选项”中安装新的输入语言,其编码与default Language for non-Unicode programs的编码不同 – 例如希腊语. >在应用程序中添加一个按钮,在其OnClick处理程序中添加Button1.Caption:= R 所以这是设置:

>使用TRichEdit控件创建一个新的Delphi 7应用程序.我们在这里谈论非Unicode应用程序.
>在Windows的“区域和语言选项”中安装新的输入语言,其编码与default Language for non-Unicode programs的编码不同 – 例如希腊语.
>在应用程序中添加一个按钮,在其OnClick处理程序中添加button1.Caption:= RichEdit1.Text;,并将其Font.Charset设置为刚刚安装的输入语言的字符集(如果我们坚持这个例子,则为GREEK_CHARSET).
>运行应用程序,切换到新的(希腊语)输入语言,在RichEdit中键入几个字母并按下按钮 – 按钮的标题现在有????符号而不是希腊字符.
>现在,如果您将非Unicode程序的默认语言设置为希腊语(需要重新启动windows),则此问题将消失 – 希腊字符将正确显示.将非Unicode程序的默认语言设置回原来的状态,然后又出现问题.

所以我猜想TRichEdit在内部使用Unicode,因为更改它的Font.Charset值永远不会改变任何东西 – RichEdit正确接受任何已安装的输入语言,如果你安装了两种使用不同字符集的非拉丁语言(希腊/ GREEK_CHARSET /和Russian / RUSSIAN_CHARSET /例如)它会接受它们而不改变它的Font.Charset.

我还猜想当你得到TRichEdit的.Text(或.lines [i])值时,它会根据WinDWs的非Unicode程序的默认语言将其内部Unicode文本转换为ANSI.

此外,将.Text值分配给WIDeString或UnicodeString也无法正常工作(文本再次在????而不是正确的字符),它不仅在您将其分配给字符串时(AnsiString) ).

所以这就是问题:

我希望能够根据我选择的字符集正确地将RichEdit的文本转换为字符串(ANSI),而不是系统的非Unicode程序的默认语言.我怎样才能做到这一点?我更喜欢不涉及第三方组件的解决方案,当然,如果不可能的话 – 任何事情都可以.

谢谢!

P.S.:切换到Delphi 2009或更高版本是不可接受的解决方案.

解决方法 向底层富编辑窗口发送 EM_GETTEXTEX消息.您传递了一个指定代码页的 GETTEXTEX结构.

所以,这样的东西会把文本拉成UTF-16编码的WIDeString:

function GetRichEditText(RichEdit: TRichEdit): WIDeString;var  GetTextLengthEx: TGetTextLengthEx;  GetTextEx: TGetTextEx;  Len: Integer;begin  GetTextLengthEx.flags := GTL_DEFAulT;  GetTextLengthEx.codepage := 1200;  Len := SendMessage(RichEdit.Handle,EM_GETTEXTLENGTHEX,WParaM(@GetTextLengthEx),0);  if Len=E_INVALIDARG then    raise Exception.Create('EM_GETTEXTLENGTHEX Failed');  SetLength(Result,Len);  if Len=0 then    exit;  GetTextEx.cb := (Length(Result)+1)*SizeOf(WIDeChar);  GetTextEx.flags := GTL_DEFAulT;  GetTextEx.codepage := 1200;  GetTextEx.lpDefaultChar := nil;  GetTextEx.lpUsedDefChar := nil;  SendMessage(RichEdit.Handle,EM_GETTEXTEX,WParaM(@GetTextEx),LParaM(PWIDeChar(Result)));end;

然后,您可以将该UTF-16字符串转换为您喜欢的任何代码页.如果您希望直接在特定代码页中将其拉出来,那么请执行以下 *** 作:

function GetRichEditText(RichEdit: TRichEdit; Ansicodepage: UINT): AnsiString;var  GetTextLengthEx: TGetTextLengthEx;  GetTextEx: TGetTextEx;  Len: Integer;begin  GetTextLengthEx.flags := GTL_DEFAulT;  GetTextLengthEx.codepage := Ansicodepage;  Len := SendMessage(RichEdit.Handle,Len);  if Len=0 then    exit;  GetTextEx.cb := (Length(Result)+1)*SizeOf(AnsiChar);  GetTextEx.flags := GTL_DEFAulT;  GetTextEx.codepage := Ansicodepage;  GetTextEx.lpDefaultChar := nil;  GetTextEx.lpUsedDefChar := nil;  SendMessage(RichEdit.Handle,LParaM(PWIDeChar(Result)));end;
总结

以上是内存溢出为你收集整理的Delphi:TRichEdit非默认非Unicode系统语言中的文本字符串(ANSI)全部内容,希望文章能够帮你解决Delphi:TRichEdit非默认非Unicode系统语言中的文本字符串(ANSI)所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1245981.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-07
下一篇 2022-06-07

发表评论

登录后才能评论

评论列表(0条)

保存