FastReport的一些总结

1、问题:中文Memo时常在运行时不能正确显示。但用文件载入后的Memo没有问题。
由于FastReport默认把报表文件保存在dfm里面,我看了下dfm,FastReport的Memo编码是以UTF8存的。估计还是字符集的问题。所以解决方法是:直接LoadFromFile....
2、FastReport中变量的表达方式和注意问题。
在Script里面(至少Pascal是这样的),<>括起的内容可以是 DataSet."Fieldname",作为常量(没试过赋值,不过应该不行的)使用。在Memo里面,用[]来表达需要变量的值。
另外需要注意的,我发现似乎<>里面的引用最好只有一次,否则会报一个莫名其妙的“XXX不存在”。应该是FastReport的智能感知机制的问题,所以一般如果需要用多次,可以用临时变量赋值。
3、数据库驱动的选择
我面对的是数据库是MySql,所以选的是DBX(dbExpress)。配置很简单,就是发布时要注意一下,等会说。
3、主表和子表的关联。
我本来是用MasterField的关联方式(DBXTable),但是后来发现不知道是我哪里用错了还是怎么回事,每次运行程序第一次察看预览的时候,都会报错,说某关键字不能为空。后来我还是用了DBXQuery,比较灵活一些。大部分情况不需要设置MasterDataSet,不过我有一个查询必须指定MasterDataSet才能使用。使用了类似于以下语法作为SQL:
SELECT fieldname1,fieldname2... FROM tablename WHERE AField = :A1;
说明:1) 如果不把FieldName明确写出来,在WHERE子句存在的情况下,FastReport的数据感知不会告诉你这个查询结果将由哪些字段组成的。
2)用参数来作为条件,在Params里面设置。注意类型。如果是varchar,要用VarToStr函数转换成String才可以比较。
4、Pascal Script里面能够使用CompareText做String的比较,但是,应该是由于编码的问题,不能比较中文。千万注意。
5、如果使用了Subreport,似乎Subreport那一页的页面设置必须和调用它的那一页相同。换页也不行。
6、绘制表格。
绘制表格在FastReport里面看似有些麻烦(要自己画),但是后来发现,真是灵活到了极点,极为好用。静态表格就不说了,动态的话,由于MasterBand是会自动重复的,所以只把MasterBand上放上线,前后放上Header和Footer,配合一下,产生的效果就是连续的,非常好用。
7、关于Band。
我这次面对的东西有点点有趣:第一页是一个人的个人信息,第二页是这个人的一些数据统计(后来是由Script生成的),第三页是这个人的一个相关报表(也是生成第二页的依据)。说实话,我也是第一次做报表……所以有点摸不着头脑。但是我查看了FastReport的Demo后,发现Subreport似乎能够很好满足这种要求,在Subreport里加上Header,然后把Header的StartNewPage设为true就可以很自然的分页了。当然,先要把第二张和第三张位子换一下……虽然Fastreport现在已经支持多层明细表,但是一方面我还是觉得Subreport更加清晰,另一方面,我这里纸张有严格要求,肯定不能挤到一张纸里。在Subreport里面使用的也都是MasterBand(似乎是废话……)。
8、Script
FastReport的强大除了它的数据感知以外(有人都觉得这个过于强大过分了,而且我经常由于这个原因,Delphi在数据库关闭的时候就挂掉了……),另外的精髓怕就是Script了。我很喜欢那个设计,很随心所欲的在页面上加入自己的变量,然后在各个事件触发的时候进行处理,好用极了。本来我以为达到设计需要还是很有困难的(有很多需要在报表内部统计的东西,还要自己生成序号等等),但是有了Script,一切都是易如反掌。尽管要注意一些问题,而且有中文兼容性问题,但是由于代码一般都很简洁,用ShowMessage也可以达到调试的目的,所以我实在很喜欢这个,呵呵。不知道其他报表软件是怎么做的。

其实啊,我最不喜欢碰的东西就包括报表。麻烦,繁琐,没有什么技术含量,还经常进行界面微调,还有现在的报表软件都不够稳定,简单的来说:不碰最好。不过这次虽然遇到了很多麻烦事,不过还算顺利解决。
基本上,写这个东西,大概花了两天时间,当然,是全身心投入的两天。我从完全对报表一无所知,到把这个搞定,感觉还是不错的。呵呵。碰到的其他问题可以google一下。

还有个小问题:我最后才发现dbExpress是需要发行的……最后发行的方法如下(对于MySql而言):
把dbexpmysql.dll、dbxconnections.ini、dbxdrivers.ini和libmysql.dll放在主程序目录,然后设置好两个ini中的Mysql服务器地址,就搞定了……当初花了我两个小时,直到抓狂,还是受大富翁一个帖子的提醒才搞定……

UPDATE: 发现,如果需要从dbxconnections.ini读取数据源信息,需要加上一句:
SQLConnection1.LoadParamsFromIniFile(ExtractFilePath(Application.ExeName) +
  'dbxconnections.ini');
同时,要保证SQLConnection1.LoadParamsOnConnect为false, 否则会覆盖以上读取的设定。
 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值