fastReport4.5以上版本求助:4.5修正了TotalPages#变量的B...

来源:百度文库 编辑:神马文学网 时间:2024/06/30 20:05:41
在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"