DataReport是VB的报表工具,其简单方便快捷,解决常用的报表问题还是不错的。
不过在打印功能上有一个非常大的弱点,就是在代码中不能通过相关属性或方法来指定打印机,只能用系统默认打印机来打印报表。这个问题也是论坛上常议的话题,在网上搜索一下,你可以找到解决方法(我没测试过),不过代码量不小,而且大量的API和Printer对象,令初学者望而却步。一直在找一个较为简单的解决方案,于是想到了注册表,通过查阅Microsoft相关文章(http://support.microsoft.com/kb/271257/zh-cn),通过实践,终于解决,示例代码如下: '通过注册表修改默认打印机,来指定Rpt的打印


'模块中的代码:

Option Explicit

'打开一个主键
 Public Declare Function RegOpenKey()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()Function RegCloseKey Lib "advapi32.dll" _
( _
ByVal hKey As Long _
) As Long
'创建或改变一个键值,lpData应由缺省的ByRef型改为ByVal型
 Public Declare Function RegSetValueEx()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()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()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
Set p = Nothing

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()Sub DataReport_Initialize()
Call SetDefaultPrinter("\\PC1EPSON LQ-680K ESC/P 2")
End Sub

'完成报表打印后还原原有默认打印机,原有默认打印机可以由RegQueryValueEx获得
 Private Sub DataReport_QueryClose()Sub DataReport_QueryClose(Cancel As Integer, CloseMode As Integer)
Call SetDefaultPrinter("\\Pc8Legend LJ6112MFC")
End
End Sub
 以上代码 VB6 SP6 + Windows XP SP2 下通过 本文来源:http://blog.csdn.net/vbman2003/archive/2007/08/25/1758420.aspx
|