to boyis11:
我最后问你的问题你还没说呢。
例子?太长了,而且我那个程序是和数据环境相关的,你拿到例子也没法执行。
时间长了,两年没有动过,源码不在手边,我也记不清具体写法了。
大概给你谈一下思路吧——
简单地说,这个问题最主要的就是如何用代码创建并定下QuickRep上各个控件的正确位置。
首先,各个Band可以事先放好,省得自动生成了。每次生成新报表的时候先用一个循环把
每个Bnad里的所有东西Free掉。其实象Title栏里的那些控件倒是可以不必每次都重建,
给它们起个好记的名字,然后修改其中的内容就行了。FooterBand之类的也和Title类似。
最关键的是HeaderBand,它只要定下来,DetailBand也就随之而定了。
比如根据你在667094贴子里给出的要求,你可以把标题栏的内容表示成如下的字符串:
{[序号][上月结存][本月收入[收入1][收入2]]...}
解析这个字符串,取出相邻两个左右中括号之间的字符,这就是一个QRLabel,因为还要有边框,
所以这同时也有一个QRShape。遇到左括号开始、右括号结束一个项,在连续遇到第二个左括号
的时候进入该项的子项,很明显,这中间用到了递归,最终形成一棵树。在每一个节点项的处理
过程中从一个既定的左侧起始位置(可以是0,也可以是个系统参数,由你自己来定)开始,顺序
放置各个控件,中间只要保证记录下当前项的座标,放好一项进行相应的调整,以此类推……
为此,最好要写一个自己的类代表树中的每一项,这个类主要包括一个QRLabel,一个QRShape,
这个项的座标、大小等。座标最好就以QRShape左上角的位置为准,因为QRLabel的座标可以相对这个
边框而定,至于它们中间留下多大的空隙可以用系统参数决定,用参数做的好处是你可以利用它调整
整个报表所占的宽度,这在字段项特别多以致一行显示不下的时候很有用。
还要有一个类,就是代表这棵树的(或者说这个Band),其实它的主要作用就是记录下你动态生成的所有控件,
将来删除的时候要用到。当然它还可以有更大的作用,如进行报表总体的调整(因为必然要扫描整棵树)。
它也要记录下该Band的高度、其中的报表控件实际占据的宽度等总体信息(在调整报表水平居中时有用)。
另外你会碰到的一个重要问题就是QRLabel的垂直居中显示和换行显示问题。为了垂直居中你要先统计出
整个Band所占的行数,就是树的层数。还要有函数计算每一节点所占的行数,并且同时必须考虑上下留出
的空隙共同来确定一个QRLabel的纵座标。实现折行显示的时候也有些麻烦,好在大富翁里有这样的贴子。
HeaderBand的最后一个重要问题就是要由它给出DetailBand里各项的横座标位置。
其实到这一步已经没什么难度了,就是HeaderBand里所有最末层叶子项的位置,
把它们取出来就行了,然后DetaiBand的界面处理就与之类似,并且还要简单多了。
至于字段内容的关联,可以同样用一个字符串把所有的字段名按实际顺序传过来。
你的667177那个贴子说得也不甚明白,“一”,“2”那些是什么?是分组吗?
不过既然是三个表里取出来的,肯定要用到QuickRep的OnNeedData事件,
DetailBand里不要用QRDBText,还是用QRLabel,其中的内容在该事件里自己填进去就行了。
——希望上面这些内容对你能有所启发。