为RB定制支持参数的自定义函数
通过昨天的短文,检阅过的朋友已经了解如何为Report Builder的RAP建立一个简单的自定义函数,同时我亦提到,发挥自已的想象力,就可以将诸多的Delphi原生代码呈现给你的用户,当然也包括你自身,站在用户角度去完成应用报表的最终定义,从而将编程与应用分为,减少开发者的麻烦。在我的编程经历中,最讨厌的就是为用户画报表,太无聊亦无意义的事情,莫过如此。我宁愿花几小时的时候去调试我的代码,也不愿花10分钟去为用户画一个报表。不知道你有没有同感……正因为如此,所以我想尽可能的通过自定义函数的形式,去增加用户可用的报表定义功能,是一件非常用意义的事情。
为了感谢大家对我的鼓励,所以想继续完成上文中没有提到的部分,作一个支持带参数的自定义函数,先确定一下具体的任务,实现下面的函数,在RAP中返回如下的页数格式‘第n页共m页’,原型如下:
Function ChinesePageNo(PageNo,PageCount):String;
现在,任务已经确定,接下来看一下如何在Delphi中完成这样的任务。
第一步,为ChinesePageNo定义类;
TMyChinesePageNoFunction=class(TmyNewCategoryFunction)
public
procedure ExecuteFunction(aParams:TraParamList);override;
class function GetSignature:String;override;
end;
第二步,实现类ChinesePageNo;
这里的关键是如何实现ExecuteFunction,使用户能够在RAP中通过参数调用ChinesePageNo。为此,按下面步骤进行即可:
1.从aParams取得参数;
2.调用delphi的实现过程;
3.利用aParams返回结果;
下面是具体的实现代码:
procedure TmyChinesePageNoFunction.ExecuteFunction(aParams:TraParamList);
var
lsInteger1,lsInteger2:integer;
lsResult:String;
begin
GetParamValue(0,lsInteger1);
GetParamValue(1,lsInteger2);
lsResult:=Format('第%d页共%d页',[lsInteger1,lsInteger2]);
SetParamValue(2,lsResult);
end;
在上述代码中,通过GetParamValue取得传进的参数,SetParamValue返回结果。
其次,为了让最终用户能够在RAP中看到并使用ChinesePageNo,还需要实现类方法
class function GetSignature:String;overrive;并在单元的Initialization部分注册这个函数。
以下是实现代码:
class function TmyChinesePageNoFunction.Getsignature:String;
begin
result:='Function ChinesePageNo(const PageNo,TotalPage:Integer):String;';
end;
initialization
raRegisterFunction('ChinesePageNo',TmyChinesePageNoFunction);
end.
综上,我们已经完成了整个函数的定义。最后来看看如何在RAP中调用。以下过程是在Report Builder的RAP中实现的。
1.在报表的Footer条上放一个Variable,右键选取“计算”菜单,进入具体的编码过程;
2.假定使用的ppReport的UserName为[Report],则为Variable写如下代码:
Value :=ChinesePageNo(Report.PageNo , Report.PageCount);
3.最后,预览一下报表,会看到在Variable处正确的显示了’第1页共1页’。
欢迎转载,但请保留出处,本文章转自[华软源码],原文链接:http://www.hur.cn/special/Delphitech/02658.htm