jed*_*der 4 delphi richedit delphi-7 input-language
所以这是设置:
OnClick处理程序中添加Button1.Caption := RichEdit1.Text;,并将其设置Font.Charset为刚安装的输入语言的字符集(GREEK_CHARSET如果我们坚持这个例子).运行应用程序,切换到新的(希腊语)输入语言,在RichEdit中键入几个字母并按下按钮 - 按钮的标题现在有????符号而不是希腊字符.
现在,如果您将非Unicode程序的默认语言设置为希腊语(需要重新启动Windows),则此问题将消失 - 希腊字符将正确显示.将非Unicode程序的默认语言设置回原来的状态,然后又出现问题.
所以我猜想TRichEdit在内部使用Unicode,因为更改它的Font.Charset值永远不会改变任何东西 - RichEdit正确接受任何已安装的输入语言,如果你安装了两种使用不同字符集的非拉丁语言(希腊/ GREEK_CHARSET/和俄语/ RUSSIAN_CHARSET/例如)它会接受它们而不改变它的Font.Charset.
我还猜想当你得到TRichEdit 的.Text(或.Lines[i])值时,它会根据Windws的非Unicode程序的默认语言将其内部Unicode文本转换为ANSI .
此外,将.Text值分配给WideString或UnicodeString也无法正常工作(文本再次出现????而不是正确的字符),它不仅在您将其分配给String(AnsiString)时.
所以这就是问题:
我希望能够根据我选择的字符集正确地将RichEdit的文本转换为字符串(ANSI),而不是系统的非Unicode程序的默认语言.我怎样才能做到这一点?我更喜欢不涉及第三方组件的解决方案,当然,如果不可能的话 - 任何事情都可以.
谢谢!
PS:切换到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;
Run Code Online (Sandbox Code Playgroud)
然后,您可以将该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, 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(AnsiChar);
GetTextEx.flags := GTL_DEFAULT;
GetTextEx.codepage := AnsiCodePage;
GetTextEx.lpDefaultChar := nil;
GetTextEx.lpUsedDefChar := nil;
SendMessage(RichEdit.Handle, EM_GETTEXTEX, WPARAM(@GetTextEx),
LPARAM(PWideChar(Result)));
end;
Run Code Online (Sandbox Code Playgroud)