程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> Visual Basic語言 >> VB綜合教程 >> 基於VB的通用折行打印程序

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

編輯: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))
  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環境中調試通過。->

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved