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

2016-02-19 12:31 7 1 收藏

get新技能是需要付出行动的,即使看得再多也还是要动手试一试。今天图老师小编跟大家分享的是基于VB的通用折行打印程序,一起来学习了解下吧!

【 tulaoshi.com - 编程语言 】

----几乎所有数据库应用软件,都需要打印单证和报表。常见的方法是利用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环境中调试通过。->

来源:http://www.tulaoshi.com/n/20160219/1601092.html

延伸阅读
打印是日常办公常有的事,简单的打印一些文档还是比较容易的,如果有要求,需要打印Excel中指定的行,你会吗?如果还没有比较好的方法,那么不妨看看这篇所介绍的如何顺利打印出Excel中需要的行。主要通过隐藏行简单实现这一需求,下面以图文并茂的形式为大家详细介绍下具体的操作步骤。 1、我们看到,黄色的行是不需要打印的,怎么办。 2...
标签: Java JAVA基础
JNDI(The Java Naming and Directory Interface,Java命名和目录接口)是一组在Java应用中访问命名和目录服务的API。命名服务将名称和对象联系起来,使得我们可以用名称访问对象。目录服务是一种命名服务,在这种服务里,对象不但有名称,还有属性。 命名或目录服务使你可以集中存储共有信息,这一点在网络应用中是重要的,...
dim a(10,10),b(100) as longFor i = 1 To 10 For j = 1 To 10 a(i, j) = "0" Next jNext iFor k = 1 To 20 '²¼À×10: a1 = Int(Rnd * 10) + 1 b1 = Int(Rnd * 10) + 1 If a(a1, b1) = "0" Then a(a1, b1) = "*" n = n + 1 Else GoTo 10 End IfNext k'ÉèÖÃ&...
一、界面设计 新建一个标准的EXE工程。在Form1窗体中放置一个定时器(Timer1)、两个文本框(Label1,Label2)、两个命令按钮(Command1,Command2)和包含7个元素的控件数组(Label3(0)Label3(6))。 二、属性设置 Label3控件数组中的所有元素皆采用相同设置。 三、代码编写 本程序的实现原理是:当用户单击...
在WINDOWS里,右下角有许多应用程序的图标。而程序本身的窗口是隐藏的,若你需要调用应用程序的窗口,则双击该图标即可。这种程序称为托盘程序。这是WINDOWS98操作系统的一大特色。使用户能够更加快捷的显示和隐藏应用程序,可以使任务栏不致于太乱。托盘程序在Visual Basic里是怎么实现的呢? 编写托盘程序主要解决两个问题: ...

经验教程

857

收藏

49
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部