FastReport 是专为 Delphi 和 C++ Builder 开发者设计的一款功能强大、高效灵活的报表生成控件。
它为你提供了从数据连接到报表设计、预览到最终输出的全流程解决方案。
下面是一个汇总了其主要特性的表格,方便你快速了解:
特性分类 | 具体描述 | |
---|---|---|
核心功能 | 提供报表引擎、可视化设计器、预览窗口、对话框设计工具、类 Pascal 宏解释器。 | |
数据源支持 | 支持 BDE、ADO、InterBase、FireDAC、IBX、FIBPlus 等多种数据库访问库,以及字符列表、Pascal 数组和记录等。 | |
报表输出格式 | 支持 TXT, RTF, CSV, HTML, PDF 等多种格式。 | |
脚本支持 | 内置类 Pascal 宏语言(PascalScript),允许在报表中编写复杂逻辑,无需依赖 Delphi 环境。同时也支持 C++ Script, BasicScript, JScript。 | |
设计时支持 | 所见即所得的设计器,支持最终用户运行时自定义报表。 | |
交互与扩展 | 支持交互式表单、下钻报表、自定义函数、地图对象(OSM, ESRI)、多种条形码(PDF417, DataMatrix等)、图表等。 | |
部署与集成 | 无需额外 DLL,可直接编译进 EXE。支持将报表发布到云存储(如 DropBox、OneDrive)、电子邮件、FTP 等。 | |
国际化 | 支持 Unicode(多语言同时显示),设计界面本地化多达数十种语言。 |
🧩 核心组件
FastReport VCL 的核心组件主要包括:
TfrxReport:报表核心组件,负责加载、运行和展示报表。
TfrxDBDataset:用于连接 Delphi 的 TDataset 后代数据集组件(如 TADOQuery、TFDQuery),将数据源关联到报表。
TfrxUserDataSet:可用于在代码中手动构建数据源,非常适用于非数据库数据或动态数据。
⌨️ 基础演示代码
下面的代码示例展示了如何在 Delphi 中使用 FastReport VCL 进行一些常见操作。
1. 传递变量到报表
你可以在 Delphi 代码中定义变量并在报表中使用它们。
// 创建报表对象并加载报表文件 var Report: TfrxReport; begin Report := TfrxReport.Create(nil); try Report.LoadFromFile('report.fr3'); // 添加一个变量并设置其值 Report.Variables.Add('Variable1'); Report.Variables.Items['Variable1'].Value := 'Hello World!'; // 显示报表预览 Report.ShowReport(True); finally Report.Free; end; end;
报表中使用变量:在报表设计器中,在任何文本对象(如 TfrxMemoView)的 Text 属性中输入 [Variable1]
即可显示该变量的值。
2. 动态创建简单的报表
如果你需要完全通过代码来创建报表
var DataPage: TfrxDataPage; Page: TfrxReportPage; Band: TfrxBand; DataBand: TfrxMasterData; Memo: TfrxMemoView; begin // 清除现有报表 frxReport1.Clear; // 将数据集添加到报表可访问的数据集列表 frxReport1.DataSets.Add(frxDBDataSet1); // 假设 frxDBDataSet1 已关联到你的 TDataset // 添加一个"Data"页(对于某些类型的内部数据集是必要的) DataPage := TfrxDataPage.Create(frxReport1); // 创建报表页面 Page := TfrxReportPage.Create(frxReport1); Page.CreateUniqueName; // 创建唯一名称 Page.SetDefaults; // 设置默认页面尺寸(如A4)、边距 // Page.Orientation := poLandscape; // 如需设置横向 // 添加报表标题 band Band := TfrxReportTitle.Create(Page); Band.CreateUniqueName; Band.Top := 0; // 顶部坐标(像素) Band.Height := 20; // 高度(像素) // 在标题 band 上添加一个文本对象 Memo := TfrxMemoView.Create(Band); Memo.CreateUniqueName; Memo.Text := 'Hello FastReport!'; Memo.Height := 20; Memo.Align := baWidth; // 宽度对齐 band // 添加主数据 band (MasterData) 来显示数据 DataBand := TfrxMasterData.Create(Page); DataBand.CreateUniqueName; DataBand.DataSet := frxDBDataSet1; // 指定数据源 DataBand.Top := 100; // 设置 Top 坐标,避免重叠 DataBand.Height := 20; // 在主数据 band 上添加一个显示数据的文本对象 Memo := TfrxMemoView.Create(DataBand); Memo.CreateUniqueName; Memo.DataSet := frxDBDataSet1; // 关联数据集 Memo.DataField := 'CustNo'; // 指定字段名 Memo.SetBounds(0, 0, 100, 20); // 设置位置和大小 (Left, Top, Width, Height) Memo.HAlign := haRight; // 文本右对齐 // 显示报表 frxReport1.ShowReport; end;
3. 打印固定行数(补空行)
这通常可以在报表的 脚本 中实现(例如在 MasterData 的 OnAfterPrint
或 Page Footer 的 OnBeforePrint
事件中编写脚本逻辑来判断和补空行)。这里提供一个思路:
在报表设计中,计算每页所需固定行数(比如5行)与当前页已打印数据行数的差值。
根据差值,在页脚(或其它合适区域)之前循环打印空行(使用
ShowBand
方法调用一个只包含空白内容的 Child Band)。
由于其逻辑相对复杂且高度依赖于报表的具体设计,建议参考 FastReport 官方文档或社区关于 "固定行数" 和 "补空行" 的详细教程和示例。
💡 进阶技巧
TfrxMemoView(frxReport1.FindObject('memo1')).Text := 'New Text at Runtime!';
添加函数声明:
frxReport1.AddFunction('Function MyCustomFunction(Param: String): String;');
处理函数调用:在 TfrxReport
的 OnUserFunction
事件中实现函数逻辑。
function TForm1.frxReport1UserFunction(const MethodName: String; var Params: Variant): Variant; begin if MethodName = 'MYCUSTOMFUNCTION' then Result := 'Processed: ' + VarToStr(Params[0]); // 处理参数并返回结果 end;
使用注意事项
数据集关联:务必在运行报表前,将
TfrxDBDataSet
或TfrxUserDataSet
的DataSet
属性指向有效的TDataset
组件(如TQuery
,TADOQuery
等),并将这些TfrxDBDataSet
添加到报表的DataSets
列表中(frxReport1.DataSets.Add(frxDBDataSet1)
),否则报表无法获取数据。
带宽高度:动态创建 Band 和对象时,注意设置正确的 Top
和 Height
属性,避免重叠。
对象定位:对象的坐标和大小以像素为单位。FastReport 提供了转换常数(如 fr1cm
)方便设置
Band.Height := fr1cm * 0.5; // 设置 Band 高度为 0.5 厘米
设计器与代码:对于固定格式的报表,优先使用可视化设计器设计(
.fr3
文件),代码主要负责加载、传递参数和运行。对于高度动态化的报表,可考虑代码创建或混合方式。
还没有评论,来说两句吧...