请教RxRichEdit(100分)(100分)

  • 主题发起人 主题发起人 crystal
  • 开始时间 开始时间
C

crystal

Unregistered / Unconfirmed
GUEST, unregistred user!
小弟这两天想做个小东西,用到RxRichEdit(RxLib 2.75),但是有个问题:
假如Text内容如下:
abc大
用Lines[0]取出后,还是“abc大”,Lenght为5
假如是:
abc大大
用Lines[0]取出后,变成“abc大”,Lenght为6?
小弟一片茫然,如果不支持中文,为什么第一次只有一个汉字就对了?
如果支持中文,为什么一行内汉字>1个就会出问题?

我想问的是:
1.这样子的原因,我看了一下源代码,RxRichEdit的实现方法和RichEdit
差不多,为什么效果不一样?
2.怎么解决?不要告诉我用RichEdit98或别的什么东东,我知道换一个3rd
控件就没事,但我想知道解决的办法。
 
事实上,RxRichedit对于中文的支持并不理想,尤其涉及到Lines、SelStart、
SelLength等操作时,经常出现问题。分析源码后可以得知,这主要是因为RxRichEdit
在支持Unicode字符集时计算有误(更深层的问题还可能出在MS 的Riched20.dll上,因为
Win98 SE中Wordpad也有类似情况存在)。解决的办法是修改源码,或者改用别的方法实
现你要的功能,或者换其它控件!
 
to kthy:
>>分析源码得知
能说具体一点吗?
to 各位大虾:
请发表高见呀...小弟盼望你们的回答...
 
大家帮帮我呀。。。
 
RxRichEdit处理中文时有问题,我是这样改了一下:
function TRxCustomRichEdit.GetTextRange(StartPos, EndPos: Longint): string;
var
TextRange: TTextRange;
begin
// 本处为中文特别修改,原代码为
// SetLength(Result, EndPos - StartPos + 1);
SetLength(Result, (EndPos - StartPos)*2 + 1);
TextRange.chrg.cpMin := StartPos;
TextRange.chrg.cpMax := EndPos;
TextRange.lpstrText := PAnsiChar(Result);
SetLength(Result, SendMessage(Handle, EM_GETTEXTRANGE, 0, Longint(@TextRange)));
end;
 
TO addie:
谢谢,可是为什么只有一个汉字时就没有事呢?
 
因为原码是SetLength(Result, EndPos - StartPos + 1),所以一个汉字时没问题(就是那个+1)。
你可跟踪调试一下,我当时也是通过跟踪发现这里有问题的。
 
好的,谢谢,这问题就这样吧
 
多人接受答案了。
 
后退
顶部