基于VB的通用折行打印程序

yh15201301337

yh15201301337

2016-02-19 12:31

get新技能是需要付出行动的,即使看得再多也还是要动手试一试。今天图老师小编跟大家分享的是基于VB的通用折行打印程序,一起来学习了解下吧!
----几乎所有数据库应用软件,都需要打印单证和报表。常见的方法是利用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))
  IfiirowlabThen
  'ii记录同一记录内字段最大打印行
   ii=rowlab
  EndIf
  strx=strx a(i)
   Next
   p=p ii
   rowlab=ii
   ii=1'重新初始化
   Ifppage1Then
   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
   Ifppage1Then
   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环境中调试通过。->

展开更多 50%)
分享

猜你喜欢

基于VB的通用折行打印程序

编程语言 网络编程
基于VB的通用折行打印程序

让VB在程序中显示错误行

编程语言 网络编程
让VB在程序中显示错误行

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

基于Windows95平台的VB5串行端口通信程序的设计

编程语言 网络编程
基于Windows95平台的VB5串行端口通信程序的设计

为你的VB程序程序加密(VB新手)

编程语言 网络编程
为你的VB程序程序加密(VB新手)

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

基于Win95的VB5串口通信程序

编程语言 网络编程
基于Win95的VB5串口通信程序

MySQL通用查询程序

PHP
MySQL通用查询程序

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

Java Servlet编程及应用之二

Java Servlet编程及应用之二

编写网页木马详解

编写网页木马详解
下拉加载更多内容 ↓