Chinaunix首页 | 论坛 | 博客
  • 博客访问: 16495864
  • 博文数量: 5645
  • 博客积分: 9880
  • 博客等级: 中将
  • 技术积分: 68081
  • 用 户 组: 普通用户
  • 注册时间: 2008-04-28 13:35
文章分类

全部博文(5645)

文章存档

2008年(5645)

我的朋友

分类:

2008-04-28 20:48:03

下载本文示例代码
p>本文出自delphi技术网   前几日,网友Miracle提到此问题,由于自己也被此问题困扰过,因此决心实现一下;此外,对于这个问题,我想在应用中如果用到了RB并使用了她的最终用户方案即RAP技术,那么这个问题也肯定会遇到。具体来说也就是这样一种情况:假若在一个应用中可能有几个全局的变量,我们想在RB的报表中体现出来,作为报表的内容,怎么实现?   没想到,原来RB对此在其RAP技术中已经支持的非常完善,在参考了其demo及help文档,很容易就实现了,因此,相信你也能:),当然,在你继续看下去之前,应该知道什么是Report Builder以及RAP,并且在你的应用中已经用到,要不然,你可能困难了。 实现方法 先确定一下我们要实现什么? 在RAP中,我们增加一个这样的函数: Function GetCorpName:String//取得软件用户的公司名称。 注意,我们是要在RAP中实现。如果对于Delphi的代码,这很易实现,比如这是在Delphi实现代码: Function GetCorpName:String Var LsIni:TiniFile; Begin With lsIni.Create(‘test.ini’) do Try Result:=ReadString(‘main’,’CorpName’,’’); Finally Free; End; End;   现在已经知道了要干什么了。那么如何利用RB的方案来实现呢?具体来说,要经过如下几步来实现: 1.定义TraSystemFunction的子类; 2.重载TraSystemFunction几个方法; 3.利用raRegisterFunction注册实现的子类; 第一步,如何定义 TraSystemFunction?   在RAP中,已经实现了TraSystemFunction类的5个子类,因此我们要实现的类可以直接从现有的子类中继承。看一下这几个子类: TraSystemFunction | -- TraStringFunction | -- TraConversionFunction | -- TraFormatFunction | -- TraDateTimeFunction | TraMathFunction   由于要定义的函数GetCorpName返回的是String,所以从TraStringFunction继承就是了。具体定义如下: TmyGetCorpNameFunction=class (TmyStringFunction) Public Procedure ExecuteFunction(aParams:TraParamList);override; Class Function GetSignature:String;override; Class Function HasParams:Boolean;override; 这里,TraSystemFunction及raRegisterFunction在raFunc单元中定义,因此你一定要在uses子句中引用raFunc。 第二步,重载TraSystemFunction的方法   通过第一步的定义,已经看到在TmyGetCorpNameFunction类中定义了三个方法,那你一定知道要重载的具体内容了。   1.Procedure ExecuteFunction(aParams:TraParamList);override;   从其名称不难看出,这里的代码就是在RAP中具体调用的Delphi原生代码!参数aParams的作用是:引入自定义函数参数列表及返回函数的结果。比如:自定义的函数的格式为: Function MaxNum(I,I :integer):Boolean;   那么,当在RAP中以这样的格式调用MaxNum(12,20),那么12,20会通过aParams传进去,其Boolean型结果也会通过aParams返回。为了取得传进的参数,我们会用到 GetParamValue(ParamIndex,LocalVar); 接上例MaxNum,为了得到12及20,这样写代码: GetParamValue(0,lsInteger1);//返回12 GetParamValue(1,lsInteger2);//返回20   这里,ParamIndex对应传进参数的序号;LocalVar是接受参数值的临时变量,也就是需要在ExecuteFunction中声明的,当然是有几个参数需要定义几个这样的变量。 如何返回函数的结果呢?这要用到 SetParamValue(MaxParamIndex,lsResult); 接上例,则这样调用:SetParamValue(2,lsResult); 为什么MaxParamIndex传进2作为其值呢?通过上面的GetParamValue就可以看出来,不是吗? 2. Class Function GetSignature:String;override;   这个函数返回RAP中自定义函数的声明,注意,不是Delphi版本中声明。 例如,对于上文中提到GetCorpName函数,应这样实现: class Function TmyGetCorpName.GetSignature:String; begin result:=’function GetCorpName:String’; end; 实际上,此函数结果在注册后会出现在报表设计器CALC页中的Tool Language中,以供用户使用。 3.Class Function HasParams:Boolean;override;   此函数从其名称可以猜到是判断自定义函数是否有参数。实际就是如此。如果返回True,则自定义函数有参数,否则没有参数。对于GetCorpName自定义函数,就要这么写代码: class function HasParams:Boolean;override; begin result:=false;//此定义函数无参数 end;   实际上,HasParams就是针对无参数的自定义函数而作,如果要实现的自定义函数有参数,那就不需要重载此函数。   关于此要重载的函数,除了上述说明外,还有一个isFunction,如果你定义的函数是一个过程,则需要重载,以返回False.实现过程同HasParams差不多。 第三步,注册为定义函数而定制的类   这里要用到raRegisterFunction(const aFunctionName: String; aClass: TraSystemFunctionClass); 一个定制的类,只有通过raRegisterfunction的注册,才能使其实现在函数出现在 RAP的Code ToolBox中。此外,注册函数应写在单元的initialization段中。 如: initialization raRegisterFunction(‘GetCorpName’,TmyGetCorpFunction); 写到这里,一个无参数的自定义函数GetCorpName已经定义完成,最后让我们看看其完整的代码: unit myRAPFUC; interface uses SysUtils, Windows, Messages, Classes, Graphics, Controls, Forms, Dialogs, raFunc, ppRTTI, DataMdl; type TMyGetCorpNameFunction = class(TraStringFunction) public procedure ExecuteFunction(aParams: TraParamList); override; class function GetSignature: string; override; class function HasParams: boolean; override; end; implementation procedure TmyGetCorpNameFunction.ExecuteFunction(aParams: TraParamList); var lsResult: string; begin lsResult := dm.czyMC; SetParamValue(0, lsResult); end; class Function tmyGetCorpNameFunction.GetSignature: string; begin result := ’Function GetCorpName:String;’; end; class function TmyGetCorpNameFunction.HasParams: Boolean; begin result := false; end; initialization raRegisterFunction(’GetCorpName’, TmyGetCorpNameFunction); end.   所附单元在delphi4 rb5enterprise通过,我作了最大的简化以减少入门的难度,当你掌握此处的实现方法,就可以进一步学习定义带参数的自定义函数等等,实际上,你可以在ExecuteFunction中尽情的发挥你的想象力,好让你的用户在自定义报表过程中不受你Delphi代码的束缚!   尽情享受Report builder带给我们的自由空间吧。 p>本文出自delphi技术网   前几日,网友Miracle提到此问题,由于自己也被此问题困扰过,因此决心实现一下;此外,对于这个问题,我想在应用中如果用到了RB并使用了她的最终用户方案即RAP技术,那么这个问题也肯定会遇到。具体来说也就是这样一种情况:假若在一个应用中可能有几个全局的变量,我们想在RB的报表中体现出来,作为报表的内容,怎么实现?   没想到,原来RB对此在其RAP技术中已经支持的非常完善,在参考了其demo及help文档,很容易就实现了,因此,相信你也能:),当然,在你继续看下去之前,应该知道什么是Report Builder以及RAP,并且在你的应用中已经用到,要不然,你可能困难了。 实现方法 先确定一下我们要实现什么? 在RAP中,我们增加一个这样的函数: Function GetCorpName:String//取得软件用户的公司名称。 注意,我们是要在RAP中实现。如果对于Delphi的代码,这很易实现,比如这是在Delphi实现代码: Function GetCorpName:String Var LsIni:TiniFile; Begin With lsIni.Create(‘test.ini’) do Try Result:=ReadString(‘main’,’CorpName’,’’); Finally Free; End; End;   现在已经知道了要干什么了。那么如何利用RB的方案来实现呢?具体来说,要经过如下几步来实现: 1.定义TraSystemFunction的子类; 2.重载TraSystemFunction几个方法; 3.利用raRegisterFunction注册实现的子类; 第一步,如何定义 TraSystemFunction?   在RAP中,已经实现了TraSystemFunction类的5个子类,因此我们要实现的类可以直接从现有的子类中继承。看一下这几个子类: TraSystemFunction | -- TraStringFunction | -- TraConversionFunction | -- TraFormatFunction | -- TraDateTimeFunction | TraMathFunction   由于要定义的函数GetCorpName返回的是String,所以从TraStringFunction继承就是了。具体定义如下: TmyGetCorpNameFunction=class (TmyStringFunction) Public Procedure ExecuteFunction(aParams:TraParamList);override; Class Function GetSignature:String;override; Class Function HasParams:Boolean;override; 这里,TraSystemFunction及raRegisterFunction在raFunc单元中定义,因此你一定要在uses子句中引用raFunc。 第二步,重载TraSystemFunction的方法   通过第一步的定义,已经看到在TmyGetCorpNameFunction类中定义了三个方法,那你一定知道要重载的具体内容了。   1.Procedure ExecuteFunction(aParams:TraParamList);override;   从其名称不难看出,这里的代码就是在RAP中具体调用的Delphi原生代码!参数aParams的作用是:引入自定义函数参数列表及返回函数的结果。比如:自定义的函数的格式为: Function MaxNum(I,I :integer):Boolean;   那么,当在RAP中以这样的格式调用MaxNum(12,20),那么12,20会通过aParams传进去,其Boolean型结果也会通过aParams返回。为了取得传进的参数,我们会用到 GetParamValue(ParamIndex,LocalVar); 接上例MaxNum,为了得到12及20,这样写代码: GetParamValue(0,lsInteger1);//返回12 GetParamValue(1,lsInteger2);//返回20   这里,ParamIndex对应传进参数的序号;LocalVar是接受参数值的临时变量,也就是需要在ExecuteFunction中声明的,当然是有几个参数需要定义几个这样的变量。 如何返回函数的结果呢?这要用到 SetParamValue(MaxParamIndex,lsResult); 接上例,则这样调用:SetParamValue(2,lsResult); 为什么MaxParamIndex传进2作为其值呢?通过上面的GetParamValue就可以看出来,不是吗? 2. Class Function GetSignature:String;override;   这个函数返回RAP中自定义函数的声明,注意,不是Delphi版本中声明。 例如,对于上文中提到GetCorpName函数,应这样实现: class Function TmyGetCorpName.GetSignature:String; begin result:=’function GetCorpName:String’; end; 实际上,此函数结果在注册后会出现在报表设计器CALC页中的Tool Language中,以供用户使用。 3.Class Function HasParams:Boolean;override;   此函数从其名称可以猜到是判断自定义函数是否有参数。实际就是如此。如果返回True,则自定义函数有参数,否则没有参数。对于GetCorpName自定义函数,就要这么写代码: class function HasParams:Boolean;override; begin result:=false;//此定义函数无参数 end;   实际上,HasParams就是针对无参数的自定义函数而作,如果要实现的自定义函数有参数,那就不需要重载此函数。   关于此要重载的函数,除了上述说明外,还有一个isFunction,如果你定义的函数是一个过程,则需要重载,以返回False.实现过程同HasParams差不多。 第三步,注册为定义函数而定制的类   这里要用到raRegisterFunction(const aFunctionName: String; aClass: TraSystemFunctionClass); 一个定制的类,只有通过raRegisterfunction的注册,才能使其实现在函数出现在 RAP的Code ToolBox中。此外,注册函数应写在单元的initialization段中。 如: initialization raRegisterFunction(‘GetCorpName’,TmyGetCorpFunction); 写到这里,一个无参数的自定义函数GetCorpName已经定义完成,最后让我们看看其完整的代码: unit myRAPFUC; interface uses SysUtils, Windows, Messages, Classes, Graphics, Controls, Forms, Dialogs, raFunc, ppRTTI, DataMdl; type TMyGetCorpNameFunction = class(TraStringFunction) public procedure ExecuteFunction(aParams: TraParamList); override; class function GetSignature: string; override; class function HasParams: boolean; override; end; implementation procedure TmyGetCorpNameFunction.ExecuteFunction(aParams: TraParamList); var lsResult: string; begin lsResult := dm.czyMC; SetParamValue(0, lsResult); end; class Function tmyGetCorpNameFunction.GetSignature: string; begin result := ’Function GetCorpName:String;’; end; class function TmyGetCorpNameFunction.HasParams: Boolean; begin result := false; end; initialization raRegisterFunction(’GetCorpName’, TmyGetCorpNameFunction); end.   所附单元在delphi4 rb5enterprise通过,我作了最大的简化以减少入门的难度,当你掌握此处的实现方法,就可以进一步学习定义带参数的自定义函数等等,实际上,你可以在ExecuteFunction中尽情的发挥你的想象力,好让你的用户在自定义报表过程中不受你Delphi代码的束缚!   尽情享受Report builder带给我们的自由空间吧。 下载本文示例代码


在Report Builder中增加自定义函数在Report Builder中增加自定义函数在Report Builder中增加自定义函数在Report Builder中增加自定义函数在Report Builder中增加自定义函数在Report Builder中增加自定义函数在Report Builder中增加自定义函数在Report Builder中增加自定义函数在Report Builder中增加自定义函数在Report Builder中增加自定义函数在Report Builder中增加自定义函数在Report Builder中增加自定义函数在Report Builder中增加自定义函数在Report Builder中增加自定义函数在Report Builder中增加自定义函数
阅读(831) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~