Delphi FastReport 的一点小功能总结

FastReport 是一套功能非常强大的报表控件,在 Delphi 的 IDE 里面,可以直接可视化设计报表页面;在运行期允许用户预览报表后再决定是否打印。还可以将报表内容输出为 JPG 图片或者 PDF 格式的文件,非常好用。

主从表的设计

首先,有两个 Delphi 的 ClientDataSet1 和 ClientDataSet2 构成主从表关系:

ClientDataSet1
DataSource1.DataSet := ClientDataSet1; 
ClientDataSet2.MasterSource := DataSource1

设计期,拖一个 frxReport1 到界面上,两个 frxDBDataSet1 和 frxDBDataSet2 到界面上。设置两个 frxDBDataSet 的 DataSet 属性分别指向 ClientDataSet1 和 ClientDataSet2;

然后双击 frxReport 那个控件,进入报表设计界面。

主从报表的初步设计

在报表设计界面里面:

  1. 右侧面板有【数据,变量,函数,类】页标签,选择【数据】,下面的工具条上有个硬盘图标一样的按钮,鼠标点它,弹出选取报表数据的一个框,里面就是 frxDBDataSet1 和 frxDBDataSet2,都勾选上,这样才能在报表设计里面看到这两个表。

  1. 左侧控件面板,竖排的一排控件,红色的【A】字图标上面一个图标就是【插入 Band】,鼠标点下去,选择【主数据】,在报表页面上放一个 TfrxMasterData 的 Band(横条),指定这个横条的 DataSet 属性为主从表的主表 frxDBDataSet1;在这个横条上可以放主表的字段。

  1. 再次在左侧面板上点 Band 按钮,选择【明细数据】,在报表页面上放一个 TfrxDetailData 的 Band。设置它的 DataSet 属性为 frxDBDataSet2(从表);

  1. 右侧面板在上述第一步做了添加操作后,就能看到两个表和下拉展开的字段。直接用鼠标将字段拖到对于的 Band 上面。位置排列就随意了。

  1. Delphi 程序里面写代码:frxReport1.ShowReport,运行程序执行前述代码,就能看到报表的预览效果了。

  1. 小技巧:报表设计界面上有【保存】按钮,把当前设计的报表,保存为一个文件。这里保存的就是刚才设计的报表模板。程序代码里面,在 ShowReport 之前,先执行:frxReport1.LoadFromFile(MyReportFile.fp3) 加载这个模板文件。这样设计时每次修改了报表格式就无需重新编译程序,只要程序重新调用这行代码,就能看到新设计的格式。这样节约一点开发时间。

  1. 明细表的多条记录的某个字段,可能需要一个【合计】值显示在明细表的底部。从左侧面板拖一个【尾】的 Band 过来放到明细表对应的 Band 底下。在这个 Band 里面,放一个【文本对象】,也就是左侧面板上的那个红色的【A】按钮。双击拖过来的文本对象,弹出一个对话框,里面有三个页标签:【文本,格式,凸显】,选择【文本】这个页标签,底下工具栏有 3 个按钮图标,中间那个是个求和符号,点它,弹出【插入合计】对话框,在这个对话框里面有几个下拉选项,正确选择后,它帮你生成对应的字符串代码,填入【文本】这个框里面。最终报表里面起作用的就是这个文本框里面填入的字符串代码。前述的操作只是在我们不熟悉 FastReport 的代码规则时帮我们通过点选的方式来创建这个汇总求和的代码。

  1. 如果想一个主表记录在报表里面占一页,比如学生成绩表,学生名单是主表,一个学生的多个学科成绩是从表,想把一个学生的成绩打印在单独的一页上面。鼠标右键点主表的那个 Band,下拉菜单里面选择【开始新页面】,则每条主表记录单独占一个页。

主从报表的 PDF 输出

  1. 退出当前报表格式设计界面,回到 Delphi 设计期的 Form,拖一个 frxPDFExport1 到 Form 上面。

  1. 运行程序,打开数据库,执行 ShowReport 预览报表。在预览界面上,多了一个 PDF 的图标。点这个图标,弹出 PDF 相关的对话框,包括保存文件的名称等等,点确定后,程序自动把报表输出为 PDF 存到文件里面。

  1. 如果想每页单独输出一个 PDF 文件,比如上述第【8】提到的学生成绩单,每个学生一份 PDF 文件,而不是几百个学生的成绩单都在一个 PDF 文件里,用 Delphi 写代码来实现。这里的代码方案是,对主表的记录做一个从头到尾的循环操作,每条记录输出一个 PDF 文件。大致代码例子:

frxReport1.LoadFromFile('D:\MyReport.fr3');
frxReport1.PrepareReport(); //先准备好报表

frxPDFExport1.ShowDialog := False; //这里程序要自动循环创建很多文件,不能在输出 PDF 时弹有关 PDF 的对话框。

with ClientDataSet1 do
begin
  i := 0;
  First;
  while not Eof do  //循环每条记录一直到最后一条记录
  begin
    Inc(i);
    Fn := //这里因为输出多个文件,因此需要自己用代码创建不同的文件名
    frxPDFExport1.FileName := Fn;
    frxPDFExport1.PageNumbers := IntToStr(i); //这个属性是个字符串,但内容是输出哪一页或者哪几页的数字。最重要的是,第一页编号是 1 而不是 0
    frxReport1.Export(frxPDFExport1);
    Sleep(1000); //等待写文件完成,不等也可以,如果不出错的话。
  end;
end;

你可能感兴趣的:(数据库)