----几乎所有数据库应用软件,都需要打印单证和报表。常见的方法是利用VB的CrystalReports(水晶报表)方式,通过TextBox等数据绑定控件,调用Print方法直接输出。虽然CrystalReport这一个功能强大、样式丰富且无编程方式的报表编制程序能适应大部分单证、报表打印的需要,但是CrystalReports引擎是一个动态链接库,需许多文件支持和调用更多系统资源,大大增加系统负担。
----另一种解决办法是通过Printer对象的Print方法,直接打印字符串。这虽然减少了系统资源的开销,但它不能直接用于打印复杂的单证和报表。本文通过两个实例,阐述一个通用折行打印程序的编程和在单证及报表的应用。
----二.编程实现及实例
----为便于阐述的方便,我们先建立一个Access数据库Standards.mdb,其内SN表由以下几个字段组成:
----标准号(文本,17)
----标准名称(文本,255)
----英文名称(文本,255)
----实施日期(日期,8)
----修定日期(日期,8)
----发布日期(日期,8)
----代替标准(文本,50)
----通用折行打印程序编制操作如下:
----1.在VB5.0编程环境中,新建一个工程Project1;
----2.在Project1中添加Moduel,在Moduel模块中定义一个记录最大折行数的公用变量Rowlab和Function函数(以下程序都经过实际运行测试,可以原样复制使用);
PublicrowlabAsInteger '定义一个公用变量 Functionprnt11(XAsInteger,YAs Integer,FontAsSingle,TxtAsString,ValAsInteger) DimstrAsString,str1AsString, str2AsString,iAsInteger Printer.CurrentX=X Printer.CurrentY=Y Printer.FontBold=False Printer.FontSize=font str=txt str2=str i=0 rowlab=0 IfLen(Trim(str))=0Then rowlab=1 '待打印字符串为空的标志 Else DoWhileLen(str)>0 Printer.CurrentX=X Printer.CurrentY=Y rowlab*240 rowlab=rowlab 1 IfLen(str)>=valThen str1=Mid(str,1,val) Printer.Printstr1 i=i 1 str=Mid(str2,i*val 1) Else Printer.Printstr ExitDo EndIf Loop EndIf EndFunction
----3.在Project1中新建一个窗体Form1,窗体上添加一个Data控件Data1,一个MSFlexGrid控件MSFGrid1,7个TextBox和两个命令按钮CmdPrnt1、CmdPrnt2。设置Data控件的属性:
..DatabaseName="Standards.mdb" ..RecordSourse="SN" MSFGrid1属性: .DataSource="Data1" Text1属性: .DataSource="Data1" .DataField="标准号" Text2~Text7类同。
----CmdPrnt1、CmdPrnt2分别为打印单条记录和多条记录的按钮。
----实例1:文字串定位折行打印在口岸联检部门中应用非常广泛。下述例子是用CmdPrnt1的Click事件代码实现了对文字串定位折行打印:
PrivateSubCmdPrnt1_Click() DimstrAsString,str1AsString,txtAsString DimstrxAsInteger,stryAsInteger,iAsInteger strx=200 stry=0 txt=Space(20) "中国出入境检验检疫标准目录检索STEMS2000" Printer.FontName="黑体" dd=prnt11(strx,stry,10,txt,50) stry=stry rowlab*240 Printer.Line(0,stry)-(9000,stry) Printer.FontName="宋体" txt="标准号:" Space(2) Trim(Text1) Space(3) "发布日期:" Trim(Text4) Space(3) "实施日期:" Trim(Text6) Space(3) "修定日期:" Trim(Text5)' Chr(13) stry=stry 240 dd=prnt11(strx,stry,10,txt,70) stry=stry rowlab*240 txt="代替标准:" dd=prnt11(strx,stry,10,txt,10) dd=prnt11(strx 1000,stry,10,Trim(Text7),60) stry=stry rowlab*240 txt="标准名称:" dd=prnt11(strx,stry,10,txt,10) dd=prnt11(strx 1000,stry,10,Trim(Text4),38) stry=stry rowlab*240 txt="英文名称:" dd=prnt11(strx,stry,10,txt,10) dd=prnt11(strx 1000,stry,10,Text5,72) Printer.EndDoc EndSub
----注:Prnt11函数原形:prnt11(XAsInteger,YAsInteger,FontAsSingle,TxtAsString,ValAsInteger),其各参数含义如下:
----X、Y为待打印字符串左上角起始座标;
----Font为字体大小;
----Txt为待打印字符串;
----Val为字符串打印折行长度。
----实例2:直接打印表格式窗体显示的多记录多字段,往往因某些字段的字节太多而造成纸张宽度不足。以下CmdPrnt2的Click事件中的代码,实现了对上述MSFGrid1表格记录的打印:
PrivateSubCmdPrnt2_Click() DimfntAsSingle DimppAsInteger DimstryAsInteger,strxAsInteger Dimstry1AsInteger, strx1AsInteger,linwAsInteger Dimpage1AsInteger,pAsInteger, gridrowAsInteger,iiAsInteger p=0 ii=1 'ii记录MSFGRID1表格同一记录内字段最大打印行 pp=0'开始页码 ss$="中国出入境检验检疫标准目录检索STEMS2000"'表头 Statica(4)AsInteger kan=0 a(2)=1680 a(3)=2800 a(4)=5300 page1=46'定义每页行数 strx=200 strx1=200 stry=1400 stry1=1400 linw=240'定义行宽 fnt=10'定义字体大小 Fori=2To4 kan=kan a(i) Next gridrow=Datdatact1.Recordset.RecordCount Ifgridrow=0Then MsgBox"无满足条件记录打印!" ExitSub EndIf Printer.FontName="黑体" dd=prnt11(3300,700,fnt,ss$,26)'打印标题 dd=prnt11(500,stry-250,fnt,"标准号",26) dd=prnt11(2690,stry-250,fnt,"标准名称",26) dd=prnt11(6690,stry-250,fnt,"英文名称",26) Printer.Line(strx-20,stry-30)-(10460,stry-30) Printer.FontName="宋体" Forj=1Togridrow '打印gridrow条记录 MSFGrid1.Row=j strx=strx1 Fori=2To4'假设只打印2-3列 MSFGrid1.Col=i dd=prnt11(strx,stry,fnt, MSFGrid1.Text,IIf(i=3,13,55)) Ifii<rowlabThen 'ii记录同一记录内字段最大打印行 ii=rowlab EndIf strx=strx a(i) Next p=p ii rowlab=ii ii=1'重新初始化 Ifp>page1Then p=0 strx=strx1 Forn=2To4 strx=strx a(n) Next pp=pp 1 stry=stry rowlab*linw foot$="第" CStr(pp) "页" dd=prnt11(strx/2,stry 3*linw,10,foot$,26) stry=stry1 Printer.NewPage Printer.FontName="黑体" dd=prnt11(3300,700,fnt,ss$,26) dd=prnt11(500,stry-250,fnt,"标准号",26) dd=prnt11(2690,stry-250,fnt,"标准名称",26) dd=prnt11(6690,stry-250,fnt,"英文名称",26) Printer.Line(-20,stry-30)-(10460,stry-30) '打印起始线 Printer.FontName="宋体" strx=strx1 Else stry=stry rowlab*linw EndIf Next Ifp<page1Then Forp=0Topage1 1 strx=strx1 Next EndIf strx=strx1 Forn=2To4 strx=strx a(n) Next pp=pp 1 foot$="第" CStr(pp) "页" dd=prnt11(strx/2,stry 3*linw,10,foot$,26) Printer.EndDoc EndSub
----以上程序在简体中文Windows98、VB5.0环境中调试通过。->
|