使用FastReport 3.0及以上版本创建动态报表的几个技巧_HjmaAs的博客-程序员秘密

技术标签: variables  string  function  integer  float  Delphi  报表  

1.已经生成的报表保存到流中,再从流中取出
  TfrxReport.PreviewPages.SaveToStream(TStream);
  TfrxReport.PreviewPages.LoadFromStream(TStream);

2.把变量添加到报表中
  with frxReport1 do
  begin
    with Variables do
    begin
      Category:=Add;
      Category.Name := ' ' + '自定义变量1';      //注意!!第一个' '内是一个空格!!如果没有空格,不能正确添加分类
      with Add do Name := ' ' + '自定义变量2';   //更简化的格式
      AddVariable('自定义变量1', '变量11', QuotedStr('大写金额'));
      AddVariable('自定义变量1', '变量12', QuotedStr('大写金额'));
      AddVariable('自定义变量1', '变量13', QuotedStr('大写金额'));
      AddVariable('自定义变量2', '变量21', 1880);
      AddVariable('自定义变量2', '变量22', QuotedStr('大写金额'));
      AddVariable('自定义变量2', '变量23', QuotedStr('大写金额'));
    end;
  end;

3.动态添加数据集,要注意!!!!!
在取报表格式之前,应该先把数据集对象放好,这样才能保证在报表控件在取格式文件后,
安置报表对象时,可以拿到数据对象,如果操作顺序搞反了,则报表对象就无法
拿到数据对象,在预览数据时,就会产生“没有数据集”的错误了!!
var
  tmpDataSet: T数据集;
  DataSource: TDataSource;
  frxDBDataSet: TfrxDBDataset;
begin
  tmpDataSet:=T数据集.Create(Self);
  DataSource:=TDataSource.Create(Self);
  frxDBDataSet:=TfrxDBDataset.Create(Self);

  DataSource.DataSet:=tmpDataSet;
  frxDBDataSet.DataSource:=DataSource;
  //frxDBDataSet.DataSet:=tmpDataSet;    //这条语句与上一条都可用,我也不知道区别在哪
  frxDBDataSet.UserName:='数据项名称';    //好用在于可以用中文名
  frxReport1.DataSets.Add(frxDBDataSet);
-------------注意:在把报表格式LoadFromFile或LoadFromStream之前,必须完成上面这几条语句的程序!!!!

 4.将报表设置数据保存到流中,只要设置TfrxDesigner.OnSaveReport就可以了,但不知道这东西怎么和Report联接起来的,只需要在界面上放一个控件就OK了,怪怪的,不过挺爽
 
5.自定义预览窗口
  通过引用frxPreview来建立继承类TfrxPreview,然后在继承的类中加入自己的特性,这样是最省事的了

6.处理顺序的信条(真理):假设报表模板是保存在数据库中的
 a.必须在把报表模板提取出来前,把表对象注入数据中,否则在预览时就知错
 b.必须在在把报表模板提取出来后,再把动态变量加到报表中,否则看不到变量存在
这两个顺序必须当信条来理解,至于什么原因,偶还没空看FastReport的源程序咧,嘿嘿~~,这两个处理机制可是偶经过了N多失败之后才发现的哦

7.添加自定义函数
 a.建立自己的函数,可以是类的成员函数(要注意实例化类哟),也可以是全局函数
 b.用TfrxReport.AddFunction把函数加到注册项中,注意,必须是函数的完整定义,比如,你的函数是:
   function MyFunction(Para0: Float): string;
 那么AddFunction格式应该这样:
   frxReport1.AddFunction('function MyFunction(Para0: Float): string','自定义函数','');
 c.必须在TfrxReport.OnUserFunction中对函数的返回值进行处理,否则在报表中即使写的格式正确,也没有返回值,这是必须注意的

8.在自定义函数中使用报表中的对象
 a.建立自定义函数
function TForm1.GetCrossObject(CrossObj: TfrxCustomCrossView): string;
begin
  // 取数据对象
  Result:='行数:'+IntToStr(CrossObj.Matrix.RowCount);
end;
 b.注册函数,可以在Form1.Create时注册哦
  with frxReport1 do
  begin
    AddFunction('function GetCrossObject(CrossObj: TfrxCustomCrossView): String',
      '扩展函数', '');
  end;
c.必须在TfrxReport.OnUserFunction中对函数的返回值进行处理
function TForm1.frxReport1UserFunction(const MethodName: String;
  var Params: Variant): Variant;
begin
  if UpperCase(MethodName)=UpperCase('GetCrossObject') then
    Result:=GetCrossObject(TfrxCustomCrossView(Integer(Params[0])));  //类型转换才能编译通过哦 
end;
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/hjmaAsC/article/details/1413348

智能推荐

随机事件及其定义_随机事件ca等于cb表示什么_许久是混子的博客-程序员秘密

简单介绍了随机事件的定义及事件间的运算公式。

Activiti中的流程配置文件_activiti配置文件_下班后的爪哇菌的博客-程序员秘密

Activiti中的流程配置文件类型可以分为以下两种:1)普通配置,即Activiti的配置风格,通常情况下,使用该方式的文件名称为activiti.cfg.xml。2)Spring配置,即Spring配置风格,使用该方式的文件名称可以自定义,例如activiti-context.xml、spring-activiti.xml等。 Activiti配置风格activiti.cf...

领域特定语言_weixin_30877227的博客-程序员秘密

《领域特定语言》基本信息原书名: Domain-Specific Languages原出版社: Addison-Wesley Professional; 1 edition作者: (英)Martin Fowler译者: ThoughtWorks中国丛书名: 华章程序员书库出版社:机械工业出版社ISBN:9787111413059上架时间:2013-3-22...

uboot流程分析--修改android启动模式按键_大繁至简的博客-程序员秘密

uboot等同于其他所有的bootloader程序,从根本上讲是一个稍复杂的裸机程序,是最底层的东西,要分析裸机程序我们要从它的连接文件开始。连接文件(.lds文件)定义了程序编译之后整个连接过程,这样我们就可以找到这个程序的第一句汇编代码,进而来下一步分析。uboot的链接文件代码在android\bootable\bootloader\uboot-imx\u-boot.lds[cp

阿里云大学云学院 “人工智能” 专业重磅预售_开发者社区小百科的博客-程序员秘密

阿里云认证专家带你探索人工智能,掌握人工智能核心技术学习链接:点击这里(阿里云认证资深专家,手把手带你6个月入门人工智能)阿里云云学院人工智能专业,由阿里云认证专家亲自辅导,并充分利用互联网的特点与优势,贴近真实的教学制度,为用户提供严谨、实用的人工智能技术,全面覆盖算法、大数据、神经网络系统等核心知识的体系化的在线课程与实验环境。零基础讲解,涵盖Python编程、算法入门、机器学习、深度学习,配...

JVM基础(八一):Java类加载时机和加载过程_jvm加载static变量时机_CodingALife的博客-程序员秘密

https://blog.csdn.net/justloveyou_/article/details/72466416?utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-4.base&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogComme

随便推点

Python web框架Tornado_tornado.web import application_代码大师麦克劳瑞的博客-程序员秘密

1.TornadoTornado:python编写的web服务器兼web应用框架1.Tornado的优势轻量级web框架异步非阻塞IO处理方式出色的抗负载能力优异的处理性能,不依赖多进程/多线程,一定程度上解决C10K问题WSGI全栈替代产品,推荐同时使用其web框架和HTTP服务器2.Tornado VS DjangoDjango:重量级web框架,功能大而全,注重高效开发内置管理后台内置封装完善的ORM操作session功能后台管理缺陷:高耦合To

10—JAVA—类(final、权限、内部类、引用类型)_classfinal 类似_彤彤的小跟班的博客-程序员秘密

目录01final关键字1.1什么是final关键字1.2 使用方式01final关键字1.1什么是final关键字概述在继承中,我们知道,子类可以在父类的基础上改写父类内容,比如,方法重写。那么我们能不能随意的继承API中提供的类,改写其内容呢?显然这是不行的。为了避免这种随意改写的情况,Java提供了 final 关键字,用于修饰不可改变内容。final: 不可改变。可以用于修饰类...

漫谈C指针第五讲---声明指针常量_有声明如下:int a=3;const int *pa=&a;下面那些工作是被允许的?_爱橙子的OK绷的博客-程序员秘密

请再看下面的代码:#include "stdio.h"main(){ int i, a[] = {3,4,5,6,7,3,7,4,4,6}; int *const pa = a; /* 注意const的位置:不是const int *pa */ for (i = 0; i <= 9; i++) { printf("%d\n", *pa);

【华为云专家原创】 服务注册与发现如何满足服务治理?_基于华为云微服务 注册发现_华为云开发者联盟的博客-程序员秘密

教授提出,分别指 Consistency (一致性)、Availablity (可用性)、Partition tolerance (分区容忍性)。Eric Brewer 认为,以上三个指标最多同时满足两个。Consistency,指数据一致性,表示一个系统的数据信息(包括备份数据)在同一时刻都是一致的。在分布式系统下,同一份数据可能存在于多个不同的实例中,在数据强一致性的要求下,对其中一份数据的修改必须同步到它的所有备份中。在数据同步的任何时候,都需要保证所有对该份数据的请求将返回同样的状态。 Ava

Semi-supervised semantic segmentation needs strong, varied perturbations_cutmix seg_凤尘的博客-程序员秘密

论文阅读:Semi-supervised semantic segmentation needs strong, varied perturbations作者声明版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。原文链接:凤尘 》》https://www.cnblogs.com/phoenixash/p/15379232.html基本信息**\1.标题:**Semi-supervised semantic segmentation need

推荐文章

热门文章

相关标签