问题:
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"