经常用Borland C++ Builder5编程,操作数据库时,报表打印是必不可少的。但BCB5自身所带的报表控件又显得缺少灵活性。所以,我想到了用TPrinter来打印报表。使用TPrinter必须要在程序头部加入#include
1<vcl\printers.hpp>
2由于对于不是链页打印纸来说,断页很困难,所以,我所需要设定每页打印的记录数。下面就是我自己编制的一个每页打印30条符合条件记录的代码,写给大家,以供参考。
3try{
4//定位打印头
5int x,y;
6x=170;
7y=150;
8Printer()->BeginDoc();//开始一个打印工作
9//打印标头
10Printer()->Canvas->Font->Size=24;
11Printer()->Canvas->Font->Name="黑体";
12Printer()->Canvas->TextOut(x,y," -----服装请领记录-----");
13Printer()->Canvas->Font->Size=10;
14Printer()->Canvas->Font->Name="宋体";
15x=190;
16y=y+300;
17//打印表格标题行
18Printer()->Canvas->TextOut(x,y," ◇"+Trim(Label12->Caption));
19y=y+80;
20Printer()->Canvas->TextOut(x,y,"┏━━━━━━━━━┳━━━━━━━━━━┳━━┳━━━━━┳━━━━━━━━━━━┳━━━━━━━┓");
21y=y+80;
22Printer()->Canvas->TextOut(x,y," 日 期 品 名 姓 名 部 门 职 务");
23Printer()->Canvas->TextOut(x+1820,y,"数量");
24Printer()->Canvas->TextOut(x,y,"┃");
25Printer()->Canvas->TextOut(x+830,y,"┃");
26Printer()->Canvas->TextOut(x+1742.1,y,"┃");
27Printer()->Canvas->TextOut(x+1991.2,y,"┃");
28Printer()->Canvas->TextOut(x+2491.73,y,"┃");
29Printer()->Canvas->TextOut(x+3487.61,y,"┃");
30Printer()->Canvas->TextOut(x+4151,y,"┃");
31ADOQuery1->First();
32//换页记录计数器初始化
33int i=0;
34//建立循环,如果不是最后一条记录则进行循环
35while(!ADOQuery1->Eof)
36{
37//计数器加1
38i=i+1;
39y=y+80;
40//打印第一条记录
41Printer()->Canvas->TextOut(x,y,"┣━━━━━━━━━╋━━━━━━━━━━╋━━╋━━━━━╋━━━━━━━━━━━╋━━━━━━━┫");
42y=y+80;
43Printer()->Canvas->TextOut(x,y,"┃"+ADOQuery1->FieldByName("请领日期")->AsString);
44Printer()->Canvas->TextOut(x+830,y,"┃"+ADOQuery1->FieldByName("品名")->AsString);
45Printer()->Canvas->TextOut(x+1742.1,y,"┃"+ADOQuery1->FieldByName("数量")->AsString);
46Printer()->Canvas->TextOut(x+1991.2,y,"┃"+ADOQuery1->FieldByName("请领人")->AsString);
47Printer()->Canvas->TextOut(x+2491.73,y,"┃"+ADOQuery1->FieldByName("部门")->AsString);
48Printer()->Canvas->TextOut(x+3487.61,y,"┃"+ADOQuery1->FieldByName("职务")->AsString);
49Printer()->Canvas->TextOut(x+4151,y,"┃");
50ADOQuery1->Next();
51//测试是否该换页,每30条记录换一次页
52if(i%30==0)
53{
54//如果已经是最后一条记录,则退出循环
55if(ADOQuery1->Eof)
56{
57break;
58}
59//如果不是最后一条记录
60else
61{
62//如果该换页,则打印页尾和页码
63int p=Printer()->PageNumber;
64y=y+80;
65Printer()->Canvas->TextOut(x,y,"┗━━━━━━━━━┻━━━━━━━━━━┻━━┻━━━━━┻━━━━━━━━━━━┻━━━━━━━┛");
66Printer()->Canvas->TextOut(3800,y+200,"页码:"+IntToStr(p));
67Printer()->NewPage();
68Application->MessageBox("请更换纸张后按确定!","提示",MB_OK);
69x=170;
70y=150;
71Printer()->Canvas->Font->Size=24;
72Printer()->Canvas->Font->Name="黑体";
73Printer()->Canvas->TextOut(x,y," -----服装请领记录-----");
74Printer()->Canvas->Font->Size=10;
75Printer()->Canvas->Font->Name="宋体";
76x=190;
77y=y+300;
78Printer()->Canvas->TextOut(x,y," ◇"+Trim(Label12->Caption));
79y=y+80;
80Printer()->Canvas->TextOut(x,y,"┏━━━━━━━━━┳━━━━━━━━━━┳━━┳━━━━━┳━━━━━━━━━━━┳━━━━━━━┓");
81y=y+80;
82Printer()->Canvas->TextOut(x,y," 日 期 品 名 姓 名 部 门 职 务");
83Printer()->Canvas->TextOut(x+1820,y,"数量");
84Printer()->Canvas->TextOut(x,y,"┃");
85Printer()->Canvas->TextOut(x+830,y,"┃");
86Printer()->Canvas->TextOut(x+1742.1,y,"┃");
87Printer()->Canvas->TextOut(x+1991.2,y,"┃");
88Printer()->Canvas->TextOut(x+2491.73,y,"┃");
89Printer()->Canvas->TextOut(x+3487.61,y,"┃");
90Printer()->Canvas->TextOut(x+4151,y,"┃");
91}
92}
93//换页结束
94}
95//打印完全部记录后,打印表格尾部
96y=y+80;
97Printer()->Canvas->TextOut(x,y,"┗━━━━━━━━━┻━━━━━━━━━━┻━━┻━━━━━┻━━━━━━━━━━━┻━━━━━━━┛");
98//取得总页数
99int pp=Printer()->PageNumber;
100//在表格尾部打印页码
101Printer()->Canvas->TextOut(3800,y+200,"页码:"+IntToStr(pp));
102Printer()->EndDoc();//结束一个打印工作
103ShowMessage("打印完成!谢谢使用!");
104}
105//异常处理
106catch(...)
107{
108ShowMessage("打印出错!请检查打印机是否连接好或者电源是否打开及其设置!");
109}</vcl\printers.hpp>