如何用Tprinter设计BCB操作数据库程序中的报表

经常用Borland C++ Builder5编程,操作数据库时,报表打印是必不可少的。但BCB5自身所带的报表控件又显得缺少灵活性。所以,我想到了用TPrinter来打印报表。使用TPrinter必须要在程序头部加入#include

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