从应用程序中打印 Visual Basic 为打印正文和图形提供了三种技术。 可在窗体中建立所需要的输出,然后用 PrintForm 方法打印窗体。 通过设置 Printers 集合中的缺省的打印机,可传送正文和图形到打印机。 可先传送正文和图形给 Printer 对象,再用 NewPage 和 EndDoc 方法打印。 这部分将探讨以上三种方法的优缺点。 使用 PrintForm 方法 PrintForm 方法将指定窗体的图象传送到打印机。要用 PrintForm 方法打印应用程序中的信息,需先将该信息显示在窗体中,然后再用 PrintForm 打印窗体。语法如下所示: [form.]PrintForm 若省略窗体名称,则 Visual Basic 打印当前窗体。PrintForm 打印窗体的全部内容,即使窗体的某部分在屏幕上见不到。若窗体中包含图形,只有当 AutoRedraw 属性设置为 True 时,才能将图形打印出来。打印结束后,PrintForm 调用 EndDoc 方法清空打印机。 例如,可通过将正文显示在屏幕上的方法,把正文传送到打印机,然后用下列语句调用 PrintForm 方法: Print "Here is some text." PrintForm PrintForm 方法是应用程序打印的最简便的方法。因为它可按用户屏幕的分辨率传送信息到打印机(每英寸打印 96 点),即使打印机有更高的分辨率(对于激光打印机,每英寸打印 300 点),结果也不会更好。结果根据窗体中的对象可以变化。 详细信息 请参阅《语言参考》的“PrintForm 方法”。 使用打印机集合 打印机集合是一个包括操作系统中所有可用打印机的对象。打印机列表与打印安装对话框或 Windows“控制面板”中的那些有效内容相同。打印机集合中的每台打印机有唯一索引定义。索引从 0 开始,每台打印机都可根据索引编号来引用。 不论用何种打印方法,所有 Visual Basic 应用程序打印输出的内容,都直接指向 Printer 对象,它最初时代表 Windows“控制面板”中指定的缺省打印机。不过,也可把 Printers 集合中的任意一台设置为缺省打印机。 使用下列语法,可从打印机集合中选择打印机: Set Printer = Printers(n) 下列语句打印操作系统中所有打印机的设备名称到“立即”窗口中: Private Sub Command1_Click() Dim x As Printer For Each x In Printers Debug.Print x.DeviceName Next End Sub 注意 不能在代码中创建新的 Printer 对象实例,也不能在 Printers 集合中直接添加或删除打印机。要在系统中添加或删除打印机,应使用 Windows“控制面板”。 使用 Printer 对象 Printer 对象是一个与设备无关的图片空间,支持用 Print、PSet、Line、PaintPicture 和 Circle 方法来创建文本和图形。只有在窗体或图片框中,才能将这些方法用于 Printer 对象。Printer 对象也包括本章前面所描述的所有字体属性。当完成在 Printer 对象中放置信息后,用 EndDoc 方法将输出传送到打印机。每次应用程序结束时,它们会自动使用 EndDoc 方法,将打印机对象中任何未确定的信息送到打印机。 对于各种不同的打印机,Printer 对象提供最好的打印质量,因为 Windows 在 Printer 对象设备无关的图片空间中,将文本和图形与打印机的分辨率和功能进行了最佳的匹配。也可在打印机对象中使用 NewPage 方法来打印多页文档。 使用 Printer 对象的主要缺点,是取得最佳结果所需要的代码量较大。在 Printer 对象中打印位图也要花费时间,因此会降低应用程序的性能。 VB下数据报表打印输出方法有多种,一是通过自己的设计和编程完成报表打印输出。二是通过MS OFFICE实现报表打印输出。三是应用数据报表设计器的报表打印输出。本人经常使用第一种方法,它具有根据需要灵活应用的特点,但需编写程序。下附代码,第一段代码定义基本变量,第二段代码定义打印函数,第三段代码是具体打印代码,含数据转换。第四段代码是窗体加载代码,具体连接数据库和打印代码根据你所涉及的数据要求进行修改。 Option Explicit Private n As Integer Private m As Integer Private zh_dm(10) As Double Private dy_dm(3000, 10) As Variant Private zsl As Integer Private y As Integer Private x As Integer Private I As Integer Private k As Integer Private p As Integer Private pa As Integer Private j As Integer Private txt As String Private fnt As Integer Private dd As VariantPublic Function prnt(x As Variant, y As Variant, fnt As Variant, txt0 As Variant) Printer.CurrentX = x Printer.CurrentY = y Printer.FontSize = fnt Printer.Print txt0 End FunctionPrivate Sub cmdPrint_Click() Adodc1.Recordset.MoveFirst For I = 0 To zsl - 1 For j = 0 To 7 dy_dm(I, j) = Adodc1.Recordset(j) Next j Adodc1.Recordset.MoveNext Next I '确定页数 k = Int(zsl / 80)'80为每页行数 If k - zsl / 80 < 0 Then k = k + 1 End Iffnt = 8 For p = 0 To k - 1 pa = p + 1 y = 300 x = 4500 txt = "机物料库存" dd = prnt(x, y, fnt, txt) x = 8500 txt = "第" & p + 1 & "页" dd = prnt(x, y, fnt, txt) y = 500 x = 600 txt = "备件代码" dd = prnt(x, y, fnt, txt) x = 1500 txt = "备件名称" dd = prnt(x, y, fnt, txt) x = 3500 txt = "备件规格" dd = prnt(x, y, fnt, txt) x = 5500 txt = "进口计算机号" dd = prnt(x, y, fnt, txt) x = 7500 txt = "最低储备量" dd = prnt(x, y, fnt, txt) x = 9000 txt = "库存量" dd = prnt(x, y, fnt, txt)For I = 0 + p * 80 To 79 + p * 80 y = 700 + 180 * (I - p * 80) x = 600 txt = dy_dm(I, 1) dd = prnt(x, y, fnt, txt) x = 1500 txt = dy_dm(I, 2) dd = prnt(x, y, fnt, txt) x = 3500 txt = dy_dm(I, 3) dd = prnt(x, y, fnt, txt) x = 5500 txt = dy_dm(I, 4) dd = prnt(x, y, fnt, txt) x = 7500 txt = dy_dm(I, 5) dd = prnt(x, y, fnt, txt) x = 9000 txt = dy_dm(I, 6) dd = prnt(x, y, fnt, txt) If Int(I / 10) - I / 10 = 0 Then Printer.Line (500, 695 + (I - p * 80) * 180)-(10000, 695 + (I - p * 80) * 180) End If Next I If zsl - p * 80 > 80 Then Printer.Line (500, 695 + 180 * 80)-(10000, 695 + 180 * 80) Printer.NewPage End If Next p Printer.EndDoc ' 打印完成。 Cls End SubPrivate Sub Form_Load() Adodc1.ConnectionString = "Provider=MSDASQL.1;Persist Security Info=False;Data Source=jwl_dbf" Adodc1.RecordSource = "select cs.js_dm,cs.备件代码,cs.备件名称,cs.备件规格,cs.进口计算机号,cs.最低库存量,sl.结存数量,sl.结存金额,sl.结存单价,sl.类别代码 from JWCK_BM as cs,jwl_jiec as sl" & _ " where cs.备件代码 = sl.备件代码" & " and cs.备件代码>" & "''" & " order by sl.类别代码,sl.备件代码" Adodc1.Refresh DataGrid1.Refresh zsl = Adodc1.Recordset.RecordCount Adodc3.ConnectionString = "Provider=MSDASQL.1;Persist Security Info=False;Data Source=jwl_dbf" Adodc3.RecordSource = "select sum(结存金额) as hj from jwl_jiec" Adodc3.Refresh End Sub以上供参考。其它请参考西安交通大学出版社出版的“VISUAL BASIC 6.0 高级编程技巧-ADO数据访问篇“
Visual Basic 为打印正文和图形提供了三种技术。
可在窗体中建立所需要的输出,然后用 PrintForm 方法打印窗体。
通过设置 Printers 集合中的缺省的打印机,可传送正文和图形到打印机。
可先传送正文和图形给 Printer 对象,再用 NewPage 和 EndDoc 方法打印。
这部分将探讨以上三种方法的优缺点。
使用 PrintForm 方法
PrintForm 方法将指定窗体的图象传送到打印机。要用 PrintForm 方法打印应用程序中的信息,需先将该信息显示在窗体中,然后再用 PrintForm 打印窗体。语法如下所示:
[form.]PrintForm
若省略窗体名称,则 Visual Basic 打印当前窗体。PrintForm 打印窗体的全部内容,即使窗体的某部分在屏幕上见不到。若窗体中包含图形,只有当 AutoRedraw 属性设置为 True 时,才能将图形打印出来。打印结束后,PrintForm 调用 EndDoc 方法清空打印机。
例如,可通过将正文显示在屏幕上的方法,把正文传送到打印机,然后用下列语句调用 PrintForm 方法:
Print "Here is some text."
PrintForm
PrintForm 方法是应用程序打印的最简便的方法。因为它可按用户屏幕的分辨率传送信息到打印机(每英寸打印 96 点),即使打印机有更高的分辨率(对于激光打印机,每英寸打印 300 点),结果也不会更好。结果根据窗体中的对象可以变化。
详细信息 请参阅《语言参考》的“PrintForm 方法”。
使用打印机集合
打印机集合是一个包括操作系统中所有可用打印机的对象。打印机列表与打印安装对话框或 Windows“控制面板”中的那些有效内容相同。打印机集合中的每台打印机有唯一索引定义。索引从 0 开始,每台打印机都可根据索引编号来引用。
不论用何种打印方法,所有 Visual Basic 应用程序打印输出的内容,都直接指向 Printer 对象,它最初时代表 Windows“控制面板”中指定的缺省打印机。不过,也可把 Printers 集合中的任意一台设置为缺省打印机。
使用下列语法,可从打印机集合中选择打印机:
Set Printer = Printers(n)
下列语句打印操作系统中所有打印机的设备名称到“立即”窗口中:
Private Sub Command1_Click()
Dim x As Printer
For Each x In Printers
Debug.Print x.DeviceName
Next
End Sub
注意 不能在代码中创建新的 Printer 对象实例,也不能在 Printers 集合中直接添加或删除打印机。要在系统中添加或删除打印机,应使用 Windows“控制面板”。
使用 Printer 对象
Printer 对象是一个与设备无关的图片空间,支持用 Print、PSet、Line、PaintPicture 和 Circle 方法来创建文本和图形。只有在窗体或图片框中,才能将这些方法用于 Printer 对象。Printer 对象也包括本章前面所描述的所有字体属性。当完成在 Printer 对象中放置信息后,用 EndDoc 方法将输出传送到打印机。每次应用程序结束时,它们会自动使用 EndDoc 方法,将打印机对象中任何未确定的信息送到打印机。
对于各种不同的打印机,Printer 对象提供最好的打印质量,因为 Windows 在 Printer 对象设备无关的图片空间中,将文本和图形与打印机的分辨率和功能进行了最佳的匹配。也可在打印机对象中使用 NewPage 方法来打印多页文档。
使用 Printer 对象的主要缺点,是取得最佳结果所需要的代码量较大。在 Printer 对象中打印位图也要花费时间,因此会降低应用程序的性能。
VB下数据报表打印输出方法有多种,一是通过自己的设计和编程完成报表打印输出。二是通过MS OFFICE实现报表打印输出。三是应用数据报表设计器的报表打印输出。本人经常使用第一种方法,它具有根据需要灵活应用的特点,但需编写程序。下附代码,第一段代码定义基本变量,第二段代码定义打印函数,第三段代码是具体打印代码,含数据转换。第四段代码是窗体加载代码,具体连接数据库和打印代码根据你所涉及的数据要求进行修改。
Option Explicit
Private n As Integer
Private m As Integer
Private zh_dm(10) As Double
Private dy_dm(3000, 10) As Variant
Private zsl As Integer
Private y As Integer
Private x As Integer
Private I As Integer
Private k As Integer
Private p As Integer
Private pa As Integer
Private j As Integer
Private txt As String
Private fnt As Integer
Private dd As VariantPublic Function prnt(x As Variant, y As Variant, fnt As Variant, txt0 As Variant)
Printer.CurrentX = x
Printer.CurrentY = y
Printer.FontSize = fnt
Printer.Print txt0
End FunctionPrivate Sub cmdPrint_Click()
Adodc1.Recordset.MoveFirst
For I = 0 To zsl - 1
For j = 0 To 7
dy_dm(I, j) = Adodc1.Recordset(j)
Next j
Adodc1.Recordset.MoveNext
Next I
'确定页数
k = Int(zsl / 80)'80为每页行数
If k - zsl / 80 < 0 Then
k = k + 1
End Iffnt = 8
For p = 0 To k - 1
pa = p + 1
y = 300
x = 4500
txt = "机物料库存"
dd = prnt(x, y, fnt, txt)
x = 8500
txt = "第" & p + 1 & "页"
dd = prnt(x, y, fnt, txt)
y = 500
x = 600
txt = "备件代码"
dd = prnt(x, y, fnt, txt)
x = 1500
txt = "备件名称"
dd = prnt(x, y, fnt, txt)
x = 3500
txt = "备件规格"
dd = prnt(x, y, fnt, txt)
x = 5500
txt = "进口计算机号"
dd = prnt(x, y, fnt, txt)
x = 7500
txt = "最低储备量"
dd = prnt(x, y, fnt, txt)
x = 9000
txt = "库存量"
dd = prnt(x, y, fnt, txt)For I = 0 + p * 80 To 79 + p * 80
y = 700 + 180 * (I - p * 80)
x = 600
txt = dy_dm(I, 1)
dd = prnt(x, y, fnt, txt)
x = 1500
txt = dy_dm(I, 2)
dd = prnt(x, y, fnt, txt)
x = 3500
txt = dy_dm(I, 3)
dd = prnt(x, y, fnt, txt)
x = 5500
txt = dy_dm(I, 4)
dd = prnt(x, y, fnt, txt)
x = 7500
txt = dy_dm(I, 5)
dd = prnt(x, y, fnt, txt)
x = 9000
txt = dy_dm(I, 6)
dd = prnt(x, y, fnt, txt)
If Int(I / 10) - I / 10 = 0 Then
Printer.Line (500, 695 + (I - p * 80) * 180)-(10000, 695 + (I - p * 80) * 180)
End If
Next I
If zsl - p * 80 > 80 Then
Printer.Line (500, 695 + 180 * 80)-(10000, 695 + 180 * 80)
Printer.NewPage
End If
Next p
Printer.EndDoc ' 打印完成。
Cls
End SubPrivate Sub Form_Load()
Adodc1.ConnectionString = "Provider=MSDASQL.1;Persist Security Info=False;Data Source=jwl_dbf"
Adodc1.RecordSource = "select cs.js_dm,cs.备件代码,cs.备件名称,cs.备件规格,cs.进口计算机号,cs.最低库存量,sl.结存数量,sl.结存金额,sl.结存单价,sl.类别代码 from JWCK_BM as cs,jwl_jiec as sl" & _
" where cs.备件代码 = sl.备件代码" & " and cs.备件代码>" & "''" & " order by sl.类别代码,sl.备件代码"
Adodc1.Refresh
DataGrid1.Refresh
zsl = Adodc1.Recordset.RecordCount
Adodc3.ConnectionString = "Provider=MSDASQL.1;Persist Security Info=False;Data Source=jwl_dbf"
Adodc3.RecordSource = "select sum(结存金额) as hj from jwl_jiec"
Adodc3.Refresh
End Sub以上供参考。其它请参考西安交通大学出版社出版的“VISUAL BASIC 6.0 高级编程技巧-ADO数据访问篇“