如何用打印机的"名称"来指定打印机打印?

haorong 2007-08-23 04:02:11
怎样指定打印机的名称来打印下面查询报表?

sql = "select * from Rec_Flow "
rs.Open sql, cn, 1, 1
DataEnvironment1.rsCommand1.Open sql

If DataEnvironment1.rsCommand1.State = adStateOpen Then
DataEnvironment1.rsCommand1.Close
End If
DataReport1.Show '调出报表打印
...全文
793 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
迈克揉索芙特 2007-08-24
  • 打赏
  • 举报
回复
http://forums.devx.com/showthread.php?t=36822
vbman2003 2007-08-24
  • 打赏
  • 举报
回复
的确,用DataReport打印,用以上方法指定打印机是不行的
在win2000和winxp下我是用修改注册表的方法来修改默认打印机,从面达到指定打印机目的,示例代码如下,自己完善,我在winxp下通过:

模块中的代码:

Option Explicit

'通过注册表修改默认打印机,来指定Rpt的打印


'打开一个主键
Public Declare Function RegOpenKey Lib "advapi32.dll" Alias "RegOpenKeyA" _
( _
ByVal hKey As Long, _
ByVal lpSubKey As String, _
ByRef phkResult As Long _
) As Long

'关闭一个主键
Public Declare Function RegCloseKey Lib "advapi32.dll" _
( _
ByVal hKey As Long _
) As Long

'创建或改变一个键值,lpData应由缺省的ByRef型改为ByVal型
Public Declare Function RegSetValueEx Lib "advapi32.dll" Alias "RegSetValueExA" _
( _
ByVal hKey As Long, _
ByVal lpValueName As String, _
ByVal Reserved As Long, _
ByVal dwType As Long, _
ByVal lpData As Any, _
ByVal cbData As Long _
) As Long

'查询一个键值,lpData应由缺省的ByRef型改为ByVal型
Public Declare Function RegQueryValueEx Lib "advapi32.dll" Alias "RegQueryValueExA" _
( _
ByVal hKey As Long, _
ByVal lpValueName As String, _
ByVal lpReserved As Long, _
ByRef lpType As Long, _
ByVal lpData As Any, _
ByRef lpcbData As Long _
) As Long

'根键常数
Const HKEY_CLASSES_ROOT = -2147483648#
Const HKEY_CURRENT_USER = -2147483647#
Const HKEY_LOCAL_MACHINE = -2147483646#
Const HKEY_USERS = -2147483645#

'键值类型
Const REG_SZ = 1& '字符串值
Const REG_BINARY = 3& '二进制值
Const REG_DWORD = 4& 'DWORD值


'通过修改注册表修改默认打印机
'win2000,winXP: HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\Windows

Public Sub SetDefaultPrinter(ByVal sPrinter As String)

Dim nKeyHandle As Long, nValueType As Long, nLength As Long
Dim sValue As String

Dim p As Printer
For Each p In Printers
If p.DeviceName = sPrinter Then
sValue = p.DeviceName & "," & p.DriverName & "," & p.Port
Exit For
End If
Next

nValueType = REG_SZ
nLength = 255

Call RegOpenKey(HKEY_CURRENT_USER, "Software\Microsoft\Windows NT\CurrentVersion\Windows", nKeyHandle)
'修改Device这个值
Call RegSetValueEx(nKeyHandle, "Device", 0, nValueType, sValue, nLength)
'查询Device这个值
'sValue = Space(255)
'Call RegQueryValueEx(nKeyHandle, "Device", 0, nValueType, sValue, nLength)
'MsgBox sValue
Call RegCloseKey(nKeyHandle)

End Sub

DataReport中的代码:
'指定DataReport打印机
Private Sub DataReport_Initialize()
Call SetDefaultPrinter("\\PC1\EPSON LQ-680K ESC/P 2")
End Sub

'完成报表打印后还原原有默认打印机,原有默认打印机可以由RegQueryValueEx获得

Private Sub DataReport_QueryClose(Cancel As Integer, CloseMode As Integer)
Call SetDefaultPrinter("\\Pc8\Legend LJ6112MFC")
End
End Sub
haorong 2007-08-24
  • 打赏
  • 举报
回复
Private Sub Command1_Click()
Dim Printer As Printer
Set Printer = PrinterByName("BB") '打印机名称
If Not Printer Is Nothing Then
'.....这里打印
PrintForm '打印窗体,用于测试
End If
End Sub

我是这样改的,我测试后还是不行,打印机名更改不起作用,它始终从默认打印出来
师傅:我跟你敬礼了,你在帮我看一看好吗?

迈克揉索芙特 2007-08-24
  • 打赏
  • 举报
回复
Private Sub Command1_Click()
Dim Printer As Printer
Set Printer = PrinterByName("打印机名称")
If Not Printer Is Nothing Then
'.....这里打印
End If
End Sub

Public Function PrinterByName(s As String) As Printer
Dim p As Printer
For Each p In Printers
If LCase(p.DeviceName) = LCase(s) Then
Set PrinterByName = p
Exit Function
End If
Next
End Function
haorong 2007-08-24
  • 打赏
  • 举报
回复
谢谢啊,师傅
我在研究一下你给我的代码
vbman2003 2007-08-24
  • 打赏
  • 举报
回复
DataEnvironment是数据环境设计器,现在使用的人不多了,用ADO比较好
gxqianqin 2007-08-24
  • 打赏
  • 举报
回复
DataEnvironment1 是什麼?
我還沒用過
haorong 2007-08-24
  • 打赏
  • 举报
回复
谢谢楼上的兄弟!
你给的代码我看不懂,你能给我一个调试好的代码? 谢谢你了!

例如:我有两个打印机一个名字叫"AA",一个名字叫"BB"
我现在要打印报表DataReport1.Show ,请问如何指定打印机的名称"BB"来打印?
haorong 2007-08-24
  • 打赏
  • 举报
回复
谢谢楼上的兄弟!
你给的代码我看不懂,你能给我一个调试好的代码? 谢谢你了!

例如:我有两个打印机一个名字叫"AA",一个名字叫"BB"
我现在要打印报表DataReport1.Show ,请问如何指定打印机的名称"BB"来打印?
vbman2003 2007-08-24
  • 打赏
  • 举报
回复
上面 手误了  ^_^
vbman2003 2007-08-24
  • 打赏
  • 举报
回复
http://forums.devx.com/showthread.php?t=36822
迈克揉索芙特 2007-08-23
  • 打赏
  • 举报
回复
http://www.zhougenrong.cn/item/168878.aspx
迈克揉索芙特 2007-08-23
  • 打赏
  • 举报
回复
VB中不是有Printers集合吗
写个For Each循环就能枚举Printers集合中的所有打印机



Printer 对象和 Printers 集合


使用 Printer 对象可以实现与系统打印机的通讯(最初是缺省系统打印机)。

用 Printers 集合可获取有关系统上所有可用打印机的信息。

语法

Printer

Printers(index)

index 所在处表示从 0 到 Printers.Count-1 之间的整数。

说明

用图形方法在 Printer 对象上绘制文本和图形。一旦 Printer 对象中含有将要打印的输出信息,可用 EndDoc 方法直接将输出信息送到应用程序的缺省打印机上。

如果要打印这些信息,应该检查和可能还要修正窗体的布局。例如,如果用 PrintForm 方法打印窗体,则到页底图形图象可能被剪切,而文本则被移到下一页。

Printers 集合可用来查询可用的打印机,这样就可以为应用程序指定一台缺省打印机。例如也许要找出哪些可用打印机用了指定的打印驱动程序。下面的代码查找所有的可用打印机,定位在第一个将页码方向设置为纵向的打印机,然后将其设置为 Portrait。

Dim X As Printer
For Each X In Printers
If X.Orientation = vbPRORPortrait Then
'设定为系统缺省打印机。
Set Printer = X
' 终止查找打印机。
Exit For
End If
Next

用 Set 语句指定 Printers 集合中的某一打印机为缺省打印机。前面的示例指定由对象变量 X 标识的打印机为应用程序的缺省打印机。

注意 如果用 Printers 集合来确定某一特定打印机,如 Printers(3),则只能访问只读属性。如果想访问个别打印机的可读写属性,那么首先要使那个打印机成为应用程序的缺省打印机。





使用打印机集合
打印机集合是一个包括操作系统中所有可用打印机的对象。打印机列表与打印安装对话框或 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“控制面板”。

7,763

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧