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:通过外部对象传递值
在主程序中定义一个可被脚本访问的对象,脚本直接修改该对象的属性,主程序后续读取该属性即可:
- 主程序中定义对象:
type TReportData = class public IsForDigitalSignature: Boolean; end; var ReportData: TReportData; begin ReportData := TReportData.Create; ReportData.IsForDigitalSignature := True; // 将对象注册到报表脚本中 frReport.Script.AddVariable('ReportData', ReportData); end; - 报表脚本中修改属性:
ReportData.IsForDigitalSignature := false; - 主程序读取修改后的值:
frReport.PrepareReport(True); ShowMessage(BoolToStr(ReportData.IsForDigitalSignature, True)); // 显示 False
方法3:通过自定义事件传递值
在脚本中触发自定义事件,将变量值作为参数传递给主程序:
- 主程序中定义事件处理:
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; - 报表脚本中触发事件:
Set('IsForDigitalSignature', false); // 触发自定义事件,传递修改后的值 CustomEvent('VariableUpdated', ['Value', IsForDigitalSignature]);
内容的提问来源于stack exchange,提问作者srp
相关产品推荐
相关产品推荐

