Printer 对象的深入研究,遵循WINDOWS “所见即所得”的思想,编写程序,实现了既能显示查询数据,又能按MSHFlexGrid 控件中内容的实际大小进行快捷输出。
1控件与打印技术简介
1.1MSHFlexGrid 控件
Microsoft Hierarchical FlexGrid (MSHFlexGrid )控件提供了类似EXCEL 电子表格的功能,控件可对表格中数据进行显示和操作,并且在对包含字符串和图片的表格进行分类合并及格式化时,具有很强的灵活性。
此控件中的Cols 和Rows 属性决定了MSHFlexGrid 控件中的列数和行数,Row 和Col 属性指定了当前单元格,使用鼠标或者方向键可改变单元格的位置,
TextMatrix (i,j )属性为显示网格中i 行j 列位置的文本内容,可进行读写赋值,表中单元格的列宽、行高分别由ColWidth 和RowHeight 属性进行设定。1.2
打印技术
VB 提供了三种打印正文和图形的技术:
(1)在窗体中建立所需要的输出,然后调用PrintForm 方法打印窗体。
(2)先设置Printers 集合中的缺省打印机,再传送正文和图形到打印机。
(3)先传送正文和图形给Printer 对象,再进行打印输出。
因为Printer 对象是一个与设备无关的图片空间,支持用Print 、PSet 、Line 、PaintPicture 和Circle 方法来创建文本和图形,并将文本和图形与打印机的分辨率、功能进行了最佳的匹配。
采用Printer 对象打印输出,主要需设置CurrentX 和CurrentY 属性,这两个属性决定Printer 对象当前页中的输
出位置。
2实现思想
假设需打印的内容通过查询已显示在MSHFlexGrid 控件中如表1。
由于MSHFlexGrid 行列值(ColWidth 、RowHeight )与Printer 对象在输出时默认行列值单位一致的,所以报表输出只要结合A4纸的尺寸大小,
统计出在MSHFlexGrid 控件中的内容所需页数、每页的行、列位置,然后调用打印过程。
窗体打印过程Print_Grid1:根据MSHFlexGrid 控件中行高、列宽及行列数,计算出每页开始与结束的行、列位置及行、列方向所需的页数,总的页数为行列方向页数的乘积,然后以求得的每页开始与结束的行、列位置为参数调用打印过程Print_Grid2。
过程Print_Grid2:为单页打印,利用Printer 对象,通过Print_Grid1的多次调用本过程,可将MSHFlexGrid 控件上的数据逐页全部打印输出。
3程序代码
3.1全部页码打印程序
Private Sub Print_Grid1()
Dim row (50),Col (50)As Integer '存放每页开始的行、列序号
收稿日期:2008-07-30
*叶建良绍兴县职业教育中心中学一级教师(浙江,绍兴312030)。
·98
·
表1
2009年4月
第2期
电脑学习
摘
要:介绍在VB 中引用MSHFlexGrid 控件、Printer 对象,将显示在MSHFlexGrid 控件中的动态报表打印输出的设计思想与
关中图分类号:TP311文献标识码:A 文章编号:1002-2422(2009)02-0098-02
Dynamic Report Printing Based on Printer Object in VB
Ye Jianliang
Abstract :The paper presents the programming ideas and source code which could in MSHFlexGrid display dynamic report pr-
Keyword:键词:程序源码。
基于VB-PRINTER 对象的动态报表打印
inting control by quoting MSHFlexGrid control,printer object in VB.
叶建良*
动态报表打印MSHFlexGrid 控件Printer 对象Dynamic Report
Print MSHFlexGrid Control Printer Object
Dim i,j,n,L As Integer
With MSHFlexGrid1
'确定每页行开始、结束位置,行方向需要的页数
PageRow=0:L=.RowHeight(0):row(PageRow)=1
For i=1To.Rows-1
L=L+.RowHeight(i)
If L>14000Then
PageRow=PageRow+1
row(PageRow)=i
L=.RowHeight(i)+.RowHeight(0)
End If
Next i
PageRow=PageRow+1:row(PageRow)=.Rows
'确定每页列开始、结束位置,列方向需要的页数
PageCol=0:L=.ColWidth(0):Col(PageCol)=1
For j=1To.Cols-1
L=L+.ColWidth(j)
If L>10500Then
PageCol=PageCol+1
Col(PageCol)=j
L=.ColWidth(j)+.ColWidth(0)
End If
Next j
PageCol=PageCol+1:Col(PageCol)=.Cols
'按先行后列打印,总页数为PageRow×PageCol
n=0
For i=1To PageRow
For j=1To PageCol
'调用打印一页过程,参数为开始行、列,结束行、列
Print_Grid2row(i-1),row(i)-1,Col(j-1),Col(j)-1
If PageRow+PageCol>2Then'若页数大于2,右下角打印页码n=n+1
Printer.CurrentX=10000:Printer.CurrentY=15500 Printer.Print″第″&n&″页″
End If
Printer.NewPage
Next j
Next i
End With
Printer.EndDoc
End Sub
'注:因为打印是以缇为单位的,1厘米=567缇,A4纸大小为21厘米(宽)×29.7厘米(高),所以转换为缇为单位的大小是11907缇×16839.9缇,故打印中横向、纵向不应超过这二个数,上面程序设定横向不超过10500缇,纵向不超过14000缇,用变量L表示3.2打印单页过程
Private Sub Print_Grid2(ByVal StartRow As Integer,ByVal EndRow As Integer,_ByVal StartCol As Integer,ByVal EndCol As Integer)
Dim Px,Py,x1,y1,i,j As Integer
Dim L As Long,W As Long x1=1000:y1=1000
Px=100:Py=50
With MSHFlexGrid1
'打印第一行
Printer.CurrentX=x1+Px
Printer.CurrentY=y1+Py
Printer.Print.TextMatrix(0,0)
W=.ColWidth(0)
For j=StartCol To EndCol
Printer.CurrentX=x1+W+Px
Printer.CurrentY=y1+Py
Printer.Print.TextMatrix(0,j)
W=W+.ColWidth(j)
Next j
L=.RowHeight(0)
Printer.Line(x1,y1)-(x1+W,y1)
Printer.Line(x1,y1+L)-(x1+W,y1+L)
'各行数据,表格线
For i=StartRow To EndRow
Printer.CurrentX=x1+Px'第一列
Printer.CurrentY=y1+L+Py
Printer.Print.TextMatrix(i,0)
W=.ColWidth(0)
For j=StartCol To EndCol
Printer.CurrentX=x1+W+Px
Printer.CurrentY=y1+L+Py
Printer.Print.TextMatrix(i,j)
W=W+.ColWidth(j)
Next j
L=L+.RowHeight(i)
Printer.Line(x1,L+y1)-(x1+W,L+y1)
Next i
'竖线打印
Printer.Line(x1,y1)-(x1,L+y1)
W=0
W=W+.ColWidth(0)
Printer.Line(x1+W,y1)-(x1+W,L+y1)
For j=StartCol To EndCol
W=W+.ColWidth(j)
Printer.Line(x1+W,y1)-(x1+W,L+y1)
Next j
End With
End Sub
4结束语
利用MSHFlexGrid控件与Printer对象的配合,采用两个过程,实现动态报表的显示与打印,解决了其它方法在VB上难以实现的动态报表输出问题。
参考文献
[1]E Winemiller,J Roff、B Heyman著.Visual Basic6.0数据库开
发.顾斌,杨德斌,译.北京:清华大学出版社,2002.
[2]王道义,等编著.Visual Basic6使用详解.北京:机械工业出
版社,1999.
·99·下载本文