急!中国式报表的问题。棘手.... (166分)

  • 主题发起人 主题发起人 terra
  • 开始时间 开始时间
to terra:
我上面说的就是网格的实现呀,你应该注意到我提到了“调整格线”的问题,
如果只是单纯的数据导入就不用OnNeedData事件了,不过怪我说得不够详细,再来——
对于数据,我的意思是先用SQL把你的数据集组织成这样的形式:
X art class1 class1 * * *
X art class2 class2 * * *
X math class3 class3 * * *
X math class4 class4 * * *
Y A B B1 * * *
Y A B B2 * * *
Y C D D * * *
即按第一、二、三、四列分组并排序,上面的这个样式也是你简单地利用QuickReport的DataSet
关联之后必然得到的结果。现在要对之进行改造的地方就是每一个分组项的内容(如X、class1等)只显示一次,
以及分组项对应的格线只在整个分组项的“大”边框处出现。为此必须是至少分组项的每一格都要用一个TQRShape
当然它的形状就是一个矩形。因为想必你也注意到了,当这个QRShape的高度比DetailBand的高度大的时候,
它的底部的那条横线是不会显示出来的,利用这一点就可以做到在分组没有显示完的时候避免被横线隔断,同时
可以保留两边的竖线连续显示;而当分组显示完了的时候再把QRShape的高度减到和DetailBand一样,就完成了
大边框的绘制。所以我说这是“QRShape的高度加1减1的事”。不过我少说了一点,就是分组项内容本身的显示,
也是同样的方法:当分组内容改变的时候只显示一次,其它时候不让它显示就行了。而这一点只是代表分组项的
控件的Visible属性的True和False的调整问题。横向的格线的调整也是一样的。
因此最关键的就是数据的组织,这样才能掌握住恰当的时机供程序去做适当的调整。
 
用Word,没有做不出来的报表,
只不过要老老实实写代码,巧是没的取的。
 
to 5rain6sky:
感谢你的耐心解答。
美中不足的是大方格中的文字内容只能在一行显示,实际中一个分组(如X)
它的单元格有时会很长,跨越十多条记录,而且文字描述也较长,在加上
单元格的宽度有限,在一行里一两个字符宽度的单元格内无法显示近十个字的描述。
不知您以前是如何解决的,请指教。
 
to terra:
以前考虑过这个问题,但是实际中没有遇到(碰到的分组内容都不长:),所以没有
着手解决。不过思路是有的:如前面aizb所说,不要用数据感知控件,QRDBText肯定没戏。
用QRLabel,比如你要显示的分组项内容为“abcd”,但是这一格只够显示一个字符的,
那你就第一次给QRLabel.Caption赋值为“a”,第二次为“b”……当然你得保证这一组的
数据行数不小于分组项内容的字数,并且要小心汉字拆分问题(最好用WideString操作)。
但是这样做很可能有一个明显的缺点就是:行与行相邻字之间的间隔过大,如果行数不够,
不能把内容紧凑地显示出来。对此,我想过的解决方法是在每组的起始和结束的时候记下
该分组所占矩形的上下位置,在该组显示结束的时候直接在QuickRep.QRPrinter.Canvas上
用DrawText加最后一个DT_WORDBREAK参数打出分组内容。但是这中间又可能遇到换页的问题,
再有你可能还想让分组内容显示在该组垂直方向的正中间……这些都需要大量细心的计算:)
 
用quickreport可以做,但是比较麻烦,设定margin,将工作区右移。
在左边的非工作区内,使用qrshape来构造需要显示的信息。在
工作区内显示记录。这样就可以避免上述的大量计算,关键就是在
画左侧的单元格时需要比较细致的判断。
 
TO:Ray Alian
你的解决方案,很简单,的确也很实用。深表感谢。
只是左侧的边框用RQShape矩形拼凑起来显得有点笨拙,不知道有没有画表格的控件?
TO:5rain6sky
对你的回应再次表示感谢,几次讨论学到不少东西。
TO:zcm1975117
我还没有收到你的mail,如果方便的话能不能重发一下(mymail:terraguo◎263.net)
一定送分的,不过希望大家对此问题继续深入的探讨下去。
 
用F1BOOK完全可以解决,不用想WORD,EXCEL或其他控件!
 
多人接受答案了。
 
后退
顶部