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
Option
Explicit

Private
Const
HWND_BROADCAST
As
Long
=
&
HFFFF
&
Private
Const
WM_WININICHANGE
As
Long
=
&
H1A


Private
Declare
Function SendNotifyMessage()
Function SendNotifyMessage Lib "user32" Alias "SendNotifyMessageA" ( _
ByVal hwnd As Long, _
ByVal msg As Long, _
ByVal wParam As Long, _
lParam As Any _
) As Long

Private Declare Function SetDefaultPrinter()Function SetDefaultPrinter Lib "winspool.drv" Alias "SetDefaultPrinterA" ( _
ByVal pszPrinter As String _
) As Long


Private Sub Command1_Click()Sub Command1_Click()
'直接更改默认打印机
Call SetDefaultPrinter(Trim(CmbPrinter.Text))
'通知更改
Call SendNotifyMessage(HWND_BROADCAST, _
WM_WININICHANGE, _
0, ByVal "windows")
End Sub


Private Sub Form_Load()Sub Form_Load()
Dim p As Printer
For Each p In Printers
CmbPrinter.AddItem p.DeviceName
Next
End Sub

'摘自http://community.youkuaiyun.com/Expert/topic/5774/5774558.xml?temp=.7473566









































































































以上代码 VB6 SP6 + Windows XP SP2 下通过
另外,更改默认打印机还可以用以下方法解决:






































