QUICKREPORT即打即停的解决方案之一 ( 积分: 0 )

G

gdgztt

Unregistered / Unconfirmed
GUEST, unregistred user!
谈到打印, 即打即停、 连续打印可能是大家经常讨论的话题, 当初
在未实现之前在网上查了很多资料,但一直没有一个很好的解决方案或具
体的实现方法,郁闷之情相信大家也能够了解,为了节省各位高手宝贵的时
间(在编程上我相信只有想不到,没有做不到,即使您不看本贴,将来您
也一定可以实现,只是时间问题),现将我的解决方案列于下:
基本思路:使用自定义纸张,运行时根据数据量计算出纸张长度,
注明:这个思路不是我想出来的,网上早有人提出,
只是没有具体的实现方法
宽度可以不用管它,现在我们只关心长度
整页的长度 = 所有Band.Size.Height + QuickRep.TopMargin(页上边距)+
QuickRep.BottomMargin(页下边距)

QR控件有很多Band, 但是有两种是来列印DataSet的明细数据的,因此这
两种Band的长度也是动态的。
一个是TQrBand的 BandType = rtDetail
* 长度 := QuickRep1.DataSet.Recordcount * QrBand1.Size.Height
一个是TQRSubDetail
* 长度 := QRSubDetail1.DataSet.Recordcount * QRSubDetail1.Size.Height
注意:这里提到的所有长度都有Size.Height,千万不要用成Height, 在QR中
Size.Height是根据 单位(毫米、英寸、像素等) 换算得出的一个值,
而Height只表示像素,但是我们的纸张一般都是用 毫米表示的,如A4
长为297毫米,宽为210毫米

到这里页面的长度就计算出来了,在执行打印操作前你只需重新设置一下
QuickRep的Page属性,以前的Page怎么设置都没关系,如以前设置A4就让它
A4吧,
procedure TForm1.BforePrint;
var
LW : extended;
begin
LW := STQuickRep.Page.Width;//记下宽度
QuickRep1.Page.PaperSize := Custom;//设置为自定义纸张
QuickRep1.Page.Width := LW;//保险起见,宽度再重新赋值
QuickRep1.Page.Length := 页面长度 + 2;// 这里加2的原因是为了解决换算出的长度因为小数位数造成影响
end
procedure TForm1.StartPrint;
begin
BforePrint;
QuickRep1.Preview;// 或QuickRep1.Print
end;

可能您还有疑问, 长度能设置多长啊, 可以无限制下去吗? RE:这个与打印机型号有关, 一般都可以打2米左右的
长度吧, 但现实中打这么长的单据的情况是比较少见的, 即打即停的初衷就是打少量的数据而不走太多的纸, 对于
有2米长度的数据的单据,你完全可以不用即打即停,用分页打印就可以了嘛,把您的程序做灵活一点就可以了
其实对于一个问题的解决方法有多种多样, 大家也可能看到了, 实现有用Api函数了,也有用直接画布画的,每种方法
有各自的特色, 因此要根据自己不同的需求作出决定, 我这里提出的一个方案只供大家参考.有什么不妥请大家批评
指正.

我的运行环境: WIN2000+DELPHI7+QR4.5
http://www.delphifans.com/SoftView/SoftView_1120.html 报表控件
安装时先把旧的卸掉, 不然会安装失败, 我在网上看到很多人犯这样的经典错误.

现在的QR源码开放了, 因此不能再说实现某某功能只有FastReport办得到了, 多看看里面的代码可以学很多东西

我的邮箱: tao61@21cn.com 希望和大家交个朋友
 
谈到打印, 即打即停、 连续打印可能是大家经常讨论的话题, 当初
在未实现之前在网上查了很多资料,但一直没有一个很好的解决方案或具
体的实现方法,郁闷之情相信大家也能够了解,为了节省各位高手宝贵的时
间(在编程上我相信只有想不到,没有做不到,即使您不看本贴,将来您
也一定可以实现,只是时间问题),现将我的解决方案列于下:
基本思路:使用自定义纸张,运行时根据数据量计算出纸张长度,
注明:这个思路不是我想出来的,网上早有人提出,
只是没有具体的实现方法
宽度可以不用管它,现在我们只关心长度
整页的长度 = 所有Band.Size.Height + QuickRep.TopMargin(页上边距)+
QuickRep.BottomMargin(页下边距)

QR控件有很多Band, 但是有两种是来列印DataSet的明细数据的,因此这
两种Band的长度也是动态的。
一个是TQrBand的 BandType = rtDetail
* 长度 := QuickRep1.DataSet.Recordcount * QrBand1.Size.Height
一个是TQRSubDetail
* 长度 := QRSubDetail1.DataSet.Recordcount * QRSubDetail1.Size.Height
注意:这里提到的所有长度都有Size.Height,千万不要用成Height, 在QR中
Size.Height是根据 单位(毫米、英寸、像素等) 换算得出的一个值,
而Height只表示像素,但是我们的纸张一般都是用 毫米表示的,如A4
长为297毫米,宽为210毫米

到这里页面的长度就计算出来了,在执行打印操作前你只需重新设置一下
QuickRep的Page属性,以前的Page怎么设置都没关系,如以前设置A4就让它
A4吧,
procedure TForm1.BforePrint;
var
LW : extended;
begin
LW := STQuickRep.Page.Width;//记下宽度
QuickRep1.Page.PaperSize := Custom;//设置为自定义纸张
QuickRep1.Page.Width := LW;//保险起见,宽度再重新赋值
QuickRep1.Page.Length := 页面长度 + 2;// 这里加2的原因是为了解决换算出的长度因为小数位数造成影响
end
procedure TForm1.StartPrint;
begin
BforePrint;
QuickRep1.Preview;// 或QuickRep1.Print
end;

可能您还有疑问, 长度能设置多长啊, 可以无限制下去吗? RE:这个与打印机型号有关, 一般都可以打2米左右的
长度吧, 但现实中打这么长的单据的情况是比较少见的, 即打即停的初衷就是打少量的数据而不走太多的纸, 对于
有2米长度的数据的单据,你完全可以不用即打即停,用分页打印就可以了嘛,把您的程序做灵活一点就可以了
其实对于一个问题的解决方法有多种多样, 大家也可能看到了, 实现有用Api函数了,也有用直接画布画的,每种方法
有各自的特色, 因此要根据自己不同的需求作出决定, 我这里提出的一个方案只供大家参考.有什么不妥请大家批评
指正.

我的运行环境: WIN2000+DELPHI7+QR4.5
http://www.delphifans.com/SoftView/SoftView_1120.html 报表控件
安装时先把旧的卸掉, 不然会安装失败, 我在网上看到很多人犯这样的经典错误.

现在的QR源码开放了, 因此不能再说实现某某功能只有FastReport办得到了, 多看看里面的代码可以学很多东西

我的邮箱: tao61@21cn.com 希望和大家交个朋友
 
谢谢了,看了很受启发
 
顶部