码迷,mamicode.com
首页 > 其他好文 > 详细

【转】FastReport4.5 TotalPages#变量的Bug

时间:2016-07-13 20:28:44      阅读:142      评论:0      收藏:0      [点我收藏+]

标签:

问题:

fastreport 4.5开始修正了frxmemoview对 totalpages#的unicode的支持bug(官方称)
在4.3版本中frxmemoview写上第[Pages#]页 共[TotalPages#]页,打印的时候,能正确显示结果
比如: 第1页 共2页

同样的工程,在4.5编译后运行结果就是
第1页 共[T2页   
多了2个[T字符,怎么回事啊?
 
frxmemoview的字符集为default_charset的。设置为其它的字符集同样存在这个问题

解决:

在frxClass.pas中找到以下代码
procedure TfrxCustomMemoView.ExtractMacros;
var
  s, s1: WideString;
  i, j: Integer;
begin
  if FAllowExpressions then
  begin
    s := FMemo.Text;
    i := Pos(‘[TOTALPAGES#]‘, UpperCase(s));
    if i <> 0 then
    begin
      Delete(s, i, 13);
      Insert(IntToStr(FTotalPages), s, i);
      FMemo.Text := s;
    end;

将  s, s1: WideString;改为  s, s1: String;

修改后代码为
procedure TfrxCustomMemoView.ExtractMacros;
var
  s, s1: String;
  i, j: Integer;
begin
  if FAllowExpressions then
  begin
    s := FMemo.Text;
    i := Pos(‘[TOTALPAGES#]‘, UpperCase(s));
    if i <> 0 then
    begin
      Delete(s, i, 13);
      Insert(IntToStr(FTotalPages), s, i);
      FMemo.Text := s;
    end;

原因是Delete过程的长度计算和Pos函数的计算不一致。
Pos函数中,中文字符计算为2个字符。
Delete过程,中文字符计算为1个字符。

比如“第1页 共[TOTALPAGES#]页”
执行i := Pos(‘[TOTALPAGES#]‘, UpperCase(s));i的值为9
执行Delete(s, i, 13); 删除从第9个字符开始的13个字符,即保留前面8个字符"第1页 共[TO",删除后面的13个字符
如果总页数为2页,执行Insert(IntToStr(FTotalPages), s, i);显示结果为"第1页 共[T2"

【转】FastReport4.5 TotalPages#变量的Bug

标签:

原文地址:http://www.cnblogs.com/xyl0xp/p/5667421.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!