Charlotte Foust
cfoust at infostatsystems.com
Mon Mar 3 15:22:00 CST 2003
That's more or less what we're using because we've found the Printer
method and the PrtDevMode method of the report object to be not as
robust as one might have been led to expect in Access 2002. Those
methods weren't available in any of the earlier versions, so I had high
hopes for them. But since Ctl+P is a Windows hotkey, I haven't found a
way to prevent users from setting options that override the settings
made using the report objects Printer or PrtDevMode methods.
Charlotte Foust
-----Original Message-----
From: MartyConnelly [mailto:martyconnelly at shaw.ca]
Sent: Monday, March 03, 2003 1:01 PM
To: accessd at databaseadvisors.com
Subject: Re: [AccessD] more on printing
On Ken Getz's site http://www.mcwtech.com
try these two methods
I used a variation on these to scan through all reports and identify
what the original code was
calling or had setup as a printer attached to ther report. I have an mdb
that does this somewhere.
Under Publications Download
DefaultPRT.ZIP, a sample Access 97 project for changing your default
printer at runtime. If you're printing, and want to change the output
device simply, this code is for you.
and
Download a replacement for Ch10.MDB (Access 97 Developer's Handbook)
containing the full set of forms (missing from the book's CD).
Or you can try this alternate from
Albert D. Kallal (kallal at msn.com) Printer settings in mde
comp.databases.ms-access
While you can't change the printer settings in a MDE, you actually don't
want to store the printer with report anyway. In other words, you should
NOT be storing the printer name with the report.
If you leave all reports with NO printer name, then simple solution
becomes to change the current windows default printer. The following
code will do just that. This code is minimal, and is smaller than the
daily FAQ posted in this newsgroup. Just paste the following into a
module.
Option Compare Database
Option Explicit
'************************
' Printer setup module
' Set/retrieves the default printer - originaly for VB6
' Works for A97/a2000
' This is minimal code.
' Albert D.Kallal - 01/13/2002, kallal at msn.com
' Rev history: Date Who notes
' 01/13/2002 Albert D. kallal
'
' I wrote this after looking at some the code on the net. Some of the
routines
' to change a printer were approaching 500 + of lines of code. Just the
printer
' constant defs was over 100 lines of code! Yikes! (not mention the
whole thing being
' 4 or more modules! How in heck is one supposed to add a simple printer
change to
' ones app? The solution is below!
' In addition the code on dev's site has some bugs, and will cause
windows to show
' *more* than one printer as the default. This is especially noticeable
on windows ME. The
' code here does NOT have this problem.
' I have not had time to clean this code up...it is "as is"
' I use only TWO API's (the 3rd one is optional). There is a total of
only 4 functions!
' KISS is the word. Keep it simple stupid. I don't care about device
drivers, or the
' port number. All these routines just work with the simple printer
name. If you do
' actually care about the device driver and port stuff..then use the one
of many
' examples available on the net. Those other examples also deal with
margins, orientation
' etc.
'
' You can paste this code into a module..and away you go
'
'************************
' How to use
' To get the default printer
' debug.print GetDefaultPrinter
' To set the default printer
' debug.print SetDefaultPrinter("HP Laser JET")
' above returns true if success.
' To get a list of printers suitable for a listbox, or combo
' debug.print GetPrinters (in forms on-load event you
' would use:
' Me.Combo0.RowSource = GetPrinters
' Me.Combo0 = GetDefaultPrinter
' the first line loads up the combo box, the 2nd sets
' the combo to the default.
'
' that is all there folks!
'
' Thus, when printing a report, you can:
'
' 1) save the default printer into a string
' strCurrentPtr = GetDefaultPrinter
' 2) switch to your report printer
' SetDefaultPrinter strReportsPtr
' 3) print report
' 4) switch back to the default printer
' SetDefaultPrinter strCurrentPtr
'
Private Const HWND_BROADCAST As Long = &HFFFF&
Private Const WM_WININICHANGE As Long = &H1A
' The following code allows one to read, and write to the WIN.INI files
' In win 2000 the printer settings are actually in the registry.
However, windows
' handles this correctly
'
Private Declare Function GetProfileString Lib "kernel32" _
Alias "GetProfileStringA" _
(ByVal lpAppName As String, _
ByVal lpKeyName As String, _
ByVal lpDefault As String, _
ByVal lpReturnedString As String, _
ByVal nSize As Long) As Long
Private Declare Function WriteProfileString Lib "kernel32" _
Alias "WriteProfileStringA" _
(ByVal lpszSection As String, _
ByVal lpszKeyName As String, _
ByVal lpszString As String) As Long
Private Declare Function SendMessage Lib "user32" _
Alias "SendMessageA" _
(ByVal hwnd As Long, _
ByVal wMsg As Long, _
ByVal wParam As Long, _
lparam As Any) As Long
Private Function fstrDField(mytext As String, delim As String, groupnum
As Integer) As String
' this is a standard delimiter routine that every developer I know
has.
' This routine has a million uses. This routine is great for
splitting up
' data fields, or sending multiple parms to a openargs of a form
'
' Parms are
' mytext - a delimited string
' delim - our delimiter (usually a , or / or a space)
' groupnum - which of the delimited values to return
'
Dim startpos As Integer, endpos As Integer
Dim groupptr As Integer, chptr As Integer
chptr = 1
startpos = 0
For groupptr = 1 To groupnum - 1
chptr = InStr(chptr, mytext, delim)
If chptr = 0 Then
fstrDField = ""
Exit Function
Else
chptr = chptr + 1
End If
Next groupptr
startpos = chptr
endpos = InStr(startpos + 1, mytext, delim)
If endpos = 0 Then
endpos = Len(mytext) + 1
End If
fstrDField = Mid$(mytext, startpos, endpos - startpos)
End Function
Function SetDefaultPrinter(strPrinterName As String) As Boolean
Dim strDeviceLine As String
Dim strBuffer As String
Dim lngbuf As Long
' get the full device string
'
strBuffer = Space(1024)
lngbuf = GetProfileString("PrinterPorts", strPrinterName, "",
strBuffer, Len(strBuffer))
'Write out this new printer information in
' WIN.INI file for DEVICE item
If lngbuf > 0 Then
strDeviceLine = strPrinterName & "," & _
fstrDField(strBuffer, Chr(0), 1) & "," & _
fstrDField(strBuffer, Chr(0), 2)
Call WriteProfileString("windows", "Device", strDeviceLine)
SetDefaultPrinter = True
' Below is optional, and should be done. It updates the existing
windows
' so the "default" printer icon changes. If you don't do the
below..then
' you will often see more than one printer as the default! The
reason *not*
' to do the SendMessage is that many open applications will now
sense the change
' in printer. I vote to leave it in..but your case you might not
want this.
'
Call SendMessage(HWND_BROADCAST, WM_WININICHANGE, 0, ByVal
"windows")
Else
SetDefaultPrinter = False
End If
End Function
Function GetDefaultPrinter() As String
Dim strDefault As String
Dim lngbuf As Long
strDefault = String(255, Chr(0))
lngbuf = GetProfileString("Windows", "Device", "", strDefault,
Len(strDefault))
If lngbuf > 0 Then
GetDefaultPrinter = fstrDField(strDefault, ",", 1)
Else
GetDefaultPrinter = ""
End If
End Function
Function GetPrinters() As String
' this routine returns a list of printers, separated by
' a ";", and thus the results are suitable for stuffing into a combo
box
Dim strBuffer As String
Dim strOnePtr As String
Dim intPos As Integer
Dim lngChars As Long
strBuffer = Space(2048)
lngChars = GetProfileString("PrinterPorts", vbNullString, "",
strBuffer, Len(strBuffer))
If lngChars > 0 Then
intPos = InStr(strBuffer, Chr(0))
Do While intPos > 1
strOnePtr = Left(strBuffer, intPos - 1)
strBuffer = Mid(strBuffer, intPos + 1)
If GetPrinters <> "" Then GetPrinters = GetPrinters & ";"
GetPrinters = GetPrinters & strOnePtr
intPos = InStr(strBuffer, Chr(0))
Loop
Else
GetPrinters = ""
End If
End Function
Public Function testPrintersGet()
Debug.Print GetDefaultPrinter
Debug.Print GetPrinters
End Function
------------------------------------------------------------------------
--------
Susan Harkins wrote:
>I didn't know that -- that's kind of a problem, isn't it? ;) But, if
>the Page Setup dialog is available to the user, it kind of negates the
>need to customize the process anyway -- I would think for most apps
>anyway. It's good to know though -- thanks Charlotte.
>
>Some of us are API challenged -- in my case that's a euphemism for
>lazy. :)
>
>Susan H.
>
>
>
>
>>In case you haven't discovered it, using page setup will set the
>>PrtDevMode and override you report.Printer settings. Not only that, it
>>appears to override the report.PrtDevMode settings as well. We gave
up
>>on the Printer and PrtDevMode methods and went back to API calls.
>>
>>Charlotte Foust
>>
>>
>
>
>
_______________________________________________
AccessD mailing list
AccessD at databaseadvisors.com
http://databaseadvisors.com/mailman/listinfo/accessd
Website: http://www.databaseadvisors.com