【问题标题】:How I can replace strings in a memo (FastReport)?如何替换备忘录中的字符串(FastReport)?
【发布时间】:2012-02-10 11:44:08
【问题描述】:

我的报告中有一个备忘录对象,需要替换“%...%”字符串。例如,在 Rave Report 中:

MemoBuf.ReplaceAll('%my_str%',  "new string", false);

但是,FastReport 中不存在替换文本的方法(或属性)。我该怎么做?

我正在使用Fast Report 4.9.72Delphi 2010

谢谢!

【问题讨论】:

    标签: delphi replace fastreport memo


    【解决方案1】:

    由于 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;
    

    【讨论】:

      【解决方案2】:

      您可以在快速报告中使用此代码:

      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;
      

      【讨论】:

        【解决方案3】:

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

        • 在快速报告中,所有备忘录都支持变量替换。设置一个名为“my_str”的报告变量,编辑您的备忘录并包含该变量。备忘录中的文本如下所示:[my_str]。这可能是最好的选择。这些括号的内容实际上是一个完整的帕斯卡表达式,可以使用数据集字段、报表变量、注册函数。您甚至可以编写一个 Delphi 函数,将其注册到 FastReport 并从 [..] 中调用它,将数据集中的一个字段作为参数传递。可能性真的是无穷无尽的。
        • FastReport 备忘录可以从 Delphi 端进行操作,因此您可以使用任何想要更改备忘录文本的函数。
        • 还可以从项目的脚本(从报告中,而不是从 Delphi)操作备忘录,您还可以做任何您需要做的事情。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-11-19
          • 2022-01-03
          • 2023-04-09
          • 1970-01-01
          相关资源
          最近更新 更多