原因:当给Rich类控件(RichEdit,RichText...)赋字符串时,字符串中含有“·”字符。
发现过程:
以前做的一个程序,今天用户反应出错。测试了一下,只是特定情况下出现报错如下:RichEdit Line insertion error!
调试发现,是在给控件qlbJobName赋值时出错的:
form2.qlbJobName.Lines.Clear;
form2.qlbJobName.Lines.Add(pJobName+',');
这个qlbJobName用的控件是 TQRRichText;
在网上查了一下,最后确定是因为要赋的值中含有“·”,将其替换掉,问题解决:
pJobName:=stringReplace(pJobName,'·','.',[rfReplaceAll]) ; // V1001 Add
form2.qlbJobName.Lines.Clear;
form2.qlbJobName.Lines.Add(pJobName+',');
原来这就是一直存在richedit中对宽字符支持的问题, 在Rxrichedit中也一直有这样一个问题,现在看来QRRichText也有同样的问题!
说白就举个例子:如字符串“8A工”,它在delphi的richedit中是四个字符,因为它调用的动态链接库是richedit32.dll,但在2000下的riched32.dll是只支持宽字符的,所以这个字符串长度在2000下其实是3个字符,所以当以要访问第四个字符时就出错,因为它只有三个字符,解决方法,是用第三方控件richedit98;它支持宽字节,不过不要用rxrichedit虽然它调用的是richedit20.dll但它对宽字符支持不好
这个问题是c:windowssystem32riched20.dll和c:windowssystem32riched32.dll版本的问题,下载这两个DLL覆盖即可.riched20.dll版本是3.0,文件版本是5.30.23.1228,
riched32.dll文件版本是5.1.2600.0
我的是XP,查了一下,只有Riched20.dll.
另外,还找到一篇文章: 解决RichEdit line insertion error的方法
在RICHEDIT 中使用StringReplace这个字符串替换函数时, 很容易就出现"RichEdit line insertion error".
解决的方法:
TStrings *tmp=new TStringList;//中间变量,用于暂时保存字符串列表的内容
String Spilth=MemoB->Strings[i];
if(Trim(Spilth)!="")
{
tmp->Text=StringReplace(MemoA->Text,Spilth,"",TReplaceFlags() << rfReplaceAll);
}
TStringStream *str=new TStringStream(tmp->Text);//使用字符串流来转移数据,这就搞定,而且速度超快!!
MemoA->LoadFromStream(str);
tmp->Free();
str->Free();