Delphi 如何替换备忘录(FastReport)中的字符串?

Delphi 如何替换备忘录(FastReport)中的字符串?,delphi,replace,fastreport,memo,Delphi,Replace,Fastreport,Memo,我的报表中有一个memo对象,需要替换“%…%”字符串。例如,在Rave报告中: MemoBuf.ReplaceAll('%my_str%', "new string", false); 但是,FastReport中不存在替换文本的方法(或属性)。我怎么能做到 我正在使用Fast Report 4.9.72和Delphi 2010 谢谢 我不知道该代码在Rave Reports中的用途是什么,因为我从未使用过它,但我可以建议FastReport的替代方案: 在fast report中,所有

我的报表中有一个memo对象,需要替换“%…%”字符串。例如,在Rave报告中:

MemoBuf.ReplaceAll('%my_str%',  "new string", false);
但是,
FastReport
中不存在替换文本的方法(或属性)。我怎么能做到

我正在使用
Fast Report 4.9.72
Delphi 2010


谢谢

我不知道该代码在Rave Reports中的用途是什么,因为我从未使用过它,但我可以建议FastReport的替代方案:

  • 在fast report中,所有Memo都支持变量替换。设置一个名为“my_str”的报告变量,编辑备忘录并包含该变量。备忘录中的文本如下所示:
    [my\u str]
    。这可能是最好的选择。这些括号的内容实际上是一个完整的pascal表达式,可以使用数据集字段、报表变量和注册函数。您甚至可以编写一个Delphi函数,在FastReport中注册它,并从
    […]
    中调用它,将数据集中的一个字段作为参数传递。可能性真的是无穷无尽的
  • FastReport备忘录可以从Delphi端进行操作,因此您可以使用任何想要更改备忘录文本的函数
  • 备忘录也可以从项目脚本中进行操作(从报告中,而不是从Delphi),您还可以执行任何需要执行的操作
由于没有可用的in-FastReport,我将从Delphi代码中执行此操作。以某种方式导入函数是可能的,但在我看来这似乎安排得更好。请注意,在第一个示例中,我假设
Memo1
存在(否则将导致访问冲突)

如果您不确定组件名称或类型,则应使用如下内容:

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;
函数StringReplace(const S,OldPattern,NewPattern:string;
iReplaceAll:boolean=true;iIgnoreCase:boolean=true):字符串;
变量
SearchStr,Patt,NewStr:string;
偏移量:整数;
开始
如果我认错了,那就开始吧
SearchStr:=大写字母;
Patt:=大写(旧模式);
结束,否则开始
SearchStr:=S;
Patt:=旧模式;
结束;
NewStr:=S;
结果:='';
当SearchStr“”开始时
偏移量:=位置(Patt,SearchStr);
如果偏移=0,则开始
结果:=Result+NewStr;
打破
结束;
结果:=Result+Copy(NewStr,1,Offset-1)+NewPattern;
NewStr:=复制(NewStr,偏移量+长度(OldPattern),MaxInt);
如果没有,那么就开始吧
结果:=Result+NewStr;
打破
结束;
SearchStr:=Copy(SearchStr,偏移量+长度(Patt),MaxInt);
结束;
结束;
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;