我在richedit中需要做一些高亮操作,但是有些特殊字符在字符串中占两个字节,但是在edit控件中却是一个字宽,这样便导致了selstart位置不准。比如给它附值为4,但是因为前面有特殊字符,自己会变成5。  我后来做了张特殊字符的表,通过查表重新调整位置。
但是却又出现了另一个现象,‘¤’这个字符在宋体时本来是占两字宽,但是当‘ξ’出现在它前面时,却变成了占一个字宽的西方字体中的一种。
‘¤’编码是A1 E8, ‘ξ’是A6 CE。
大家可以这样试一下:
str := #$A6#$CE + #$A1#$E8 + '插个中文' + #$A1#$E8; 
richedit1.text := str;
文本中前面的¤显示是一个小圈圈,后面那个才是正常的。字体是宋体,编码是GB2312,用的delphi7
因为两个的字宽不一样,所以在定位selstart时就遇到了很大问题。
各位大哥,这种问题应该怎么解决呢?

解决方案 »

  1.   

    var 
      tempStr ,strPro : String ;
      i ,iCurssor : Integer
    begin
    tempStr := richedit1.text
    while i <= Len do 
      begin
          if ord(tempStr[i])>128   then
             begin
               strPro := Copy(tempStr,i,2);
               inc(i,2);
               //此时光标要移动两个字符
             end
           else
             begin
               strPro := Copy(tempStr,i,1);
               inc(i,1);
               //此时光标要移动一个字符
             end;
        End;
    end;
      

  2.   

    你那上面应该是字符串查找定位的过程,我是使用posEx来定位要查找的字符串,在字符串中最后定位的结果是正确的。
    问题是出现在显示的字符串中。
    假如我要在‘ξ测试一下’ 中高亮‘试’字。 ξ如前所说是#$A6#$CE,是占两字符的,所以查找后‘试’在字符串中的位置是5,因为richedit是从0开始的,所以给selstart附值为4。但是如果在附值后马上打印出selstart的值会发现它变成了5. 最后高亮的结果是‘一’被高亮。这个问题我通过建了张特殊字符的表(里面保存了在字符串中占两字节,但是显示却是一字宽的字符),改变索引值解决了部分。现在的问题是当ξ和¤这两个字符同时出现时,后面那个在宋体情况下原本占两字宽,但是却会变成一个字宽。
    这样的话selstart在定位时便会有问题,它是按照字宽来判断而不是字节数来判断的。
      

  3.   

    有些特殊字符在字符串中占两个字节,但是在edit控件中却是一个字宽,这样便导致了selstart位置不准你定字符串時別用string,用widestring,就可以把两个字节,做一个字宽
      

  4.   


    但这样原本是两字节两字宽的字符在定位时便又不准了
    我也想过用宽字符,但是发现richedit好像不支持宽字符,传进去的widestring会被转化为string