You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

FastReport 2022:如何获取报表准备后已修改的变量值?

FastReport 2022:获取报表脚本修改后的变量值问题

问题重现

  • 初始化添加变量:
    //Adding a Variable "IsForDigitalSignature" to the Fast Report.
    frReport.Variables.AddVariable('MyCategory','IsForDigitalSignature', True);
    
  • 执行报表:
    // Executing the report
    frReport.PrepareReport(True);
    
  • 报表脚本中修改变量:
    //In the Report, i am changing the value of the variable to false in the script
    Set('IsForDigitalSignature', false);
    
  • 尝试获取变量值时,frReport.Variables['IsForDigitalSignature']仍返回初始值True

原因分析

FastReport中,frReport.Variables存储的是初始化阶段的变量副本,报表运行时脚本修改的是报表内部上下文(Dictionary)中的变量实例,两者并非同一个引用,因此直接读取frReport.Variables无法获取脚本修改后的值。

解决方法

方法1:通过报表Dictionary读取运行时变量值

报表准备完成后,从报表的Dictionary集合中获取修改后的变量值,这是最直接的方式:

var
  VarValue: Variant;
begin
  frReport.PrepareReport(True);
  // 获取修改后的变量值
  VarValue := frReport.Dictionary.Variables['IsForDigitalSignature'].Value;
  // VarValue 此时为 false
end;

方法2:通过外部对象传递值

在主程序中定义一个可被脚本访问的对象,脚本直接修改该对象的属性,主程序后续读取该属性即可:

  1. 主程序中定义对象:
    type
      TReportData = class
      public
        IsForDigitalSignature: Boolean;
      end;
    
    var
      ReportData: TReportData;
    begin
      ReportData := TReportData.Create;
      ReportData.IsForDigitalSignature := True;
      // 将对象注册到报表脚本中
      frReport.Script.AddVariable('ReportData', ReportData);
    end;
    
  2. 报表脚本中修改属性:
    ReportData.IsForDigitalSignature := false;
    
  3. 主程序读取修改后的值:
    frReport.PrepareReport(True);
    ShowMessage(BoolToStr(ReportData.IsForDigitalSignature, True)); // 显示 False
    

方法3:通过自定义事件传递值

在脚本中触发自定义事件,将变量值作为参数传递给主程序:

  1. 主程序中定义事件处理:
    procedure TForm1.frReportCustomEvent(Sender: TObject; Args: TfrEventArgs);
    begin
      if Args.EventName = 'VariableUpdated' then
      begin
        // 获取传递的变量值
        var NewValue := Args.Pars['Value'].AsBoolean;
        // 后续处理逻辑
      end;
    end;
    
    begin
      frReport.OnCustomEvent := frReportCustomEvent;
    end;
    
  2. 报表脚本中触发事件:
    Set('IsForDigitalSignature', false);
    // 触发自定义事件,传递修改后的值
    CustomEvent('VariableUpdated', ['Value', IsForDigitalSignature]);
    

内容的提问来源于stack exchange,提问作者srp

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 00:55:19