fastreport 4.5开始修正了frxmemoview对 totalpages#的unicode的支持bug(官方称)
在4.3版本中frxmemoview写上第[Pages#]页 共[TotalPages#]页,打印的时候,能正确显示结果
比如: 第1页 共2页同样的工程,在4.5编译后运行结果就是
第1页 共[T2页   
多了2个[T字符,怎么回事啊?
 
frxmemoview的字符集为default_charset的。设置为其它的字符集同样存在这个问题

解决方案 »

  1.   

    在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"