您的位置:首页 > 其它

使用FastReport 3.0及以上版本创建动态报表的几个技巧(转)

2009-12-23 11:18 543 查看
使用FastReport 3.0及以上版本创建动态报表的几个技巧
2007年07月03日 星期二 09:18
2007年03月13日 星期二 16:20
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;

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: