我在报告中有一个备忘录对象,需要替换掉“%...%”字符串。例如,在Rave报告中:
MemoBuf.ReplaceAll('%my_str%', "new string", false);
但是,在FastReport
中没有替换文本的方法(或属性)。我该怎么做呢?
我正在使用Fast Report 4.9.72
和Delphi 2010
。
谢谢!
我在报告中有一个备忘录对象,需要替换掉“%...%”字符串。例如,在Rave报告中:
MemoBuf.ReplaceAll('%my_str%', "new string", false);
但是,在FastReport
中没有替换文本的方法(或属性)。我该怎么做呢?
我正在使用Fast Report 4.9.72
和Delphi 2010
。
谢谢!
由于FastReport中没有可用的StringReplace
函数,因此我将从Delphi代码中进行操作。虽然可以通过某种方式导入函数,但我认为这样更加清晰明了。请注意,在第一个示例中,我假设Memo1
存在(否则会出现访问冲突)。
procedure TForm1.Button1Click(Sender: TObject);
var
Memo: TfrxMemoView;
begin
Memo := frxReport1.FindObject('Memo1') as TfrxMemoView;
Memo.Text := StringReplace(Memo.Text, '%my_str%', 'new string', [rfReplaceAll]);
frxReport1.ShowReport;
end;
procedure TForm1.Button2Click(Sender: TObject);
var
Memo: TfrxMemoView;
Component: TfrxComponent;
begin
Component := frxReport1.FindObject('Memo1');
if Component is TfrxMemoView then
begin
Memo := Component as TfrxMemoView;
Memo.Text := StringReplace(Memo.Text, '%my_str%', 'new string', [rfReplaceAll]);
frxReport1.ShowReport;
end;
end;
function StringReplace(const S, OldPattern, NewPattern: string;
iReplaceAll: boolean=true; iIgnoreCase :boolean=true): string;
var
SearchStr, Patt, NewStr: string;
Offset: Integer;
begin
if iIgnoreCase then begin
SearchStr := UpperCase(S);
Patt := UpperCase(OldPattern);
end else begin
SearchStr := S;
Patt := OldPattern;
end;
NewStr := S;
Result := '';
while SearchStr <> '' do begin
Offset := Pos(Patt, SearchStr);
if Offset = 0 then begin
Result := Result + NewStr;
Break;
end;
Result := Result + Copy(NewStr, 1, Offset - 1) + NewPattern;
NewStr := Copy(NewStr, Offset + Length(OldPattern), MaxInt);
if not iReplaceAll then begin
Result := Result + NewStr;
Break;
end;
SearchStr := Copy(SearchStr, Offset + Length(Patt), MaxInt);
end;
end;
我不知道 Rave Reports 中那段代码的目的,因为我从未使用过它,但我可以为 FastReport 提供替代方案:
[my_str]
。这可能是最好的选择。括号中的内容实际上是一个完整的 Pascal 表达式,可以利用数据集字段、报告变量、注册函数等。你甚至可以编写一个 Delphi 函数,在 FastReport 中注册它,并从 [..]
中调用它,将数据集中的字段作为参数传递。可能性真的是无限的。