----幾乎所有數據庫應用軟件,都需要打印單證和報表。常見的方法是利用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環境中調試通過。->