[AccessD] Printing in Access 2002

MartyConnelly martyconnelly at shaw.ca
Thu Apr 10 01:39:48 CDT 2003


I also have had problems with Access not seeing Non Certifiable printer 
drivers from Win XP
but not all the time. Even though they appear in the list of printers 
from the control panel


 Here is some code I use to reset the default printer

'************************
' 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
' 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!
' 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
'
' 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

In a  form just stick up a combo box to select or reset default printer.

Private Sub Combo0_AfterUpdate()
   SetDefaultPrinter (Me.Combo0)
End Sub

Private Sub Form_Load()
   Me.Combo0.RowSource = GetPrinters
   Me.Combo0 = GetDefaultPrinter
End Sub




Liz Doering wrote:

> Dear List,
>  
> We have a client (Bill) who sells a little application to local city 
> governments and comes to us about once a year for tweaks and 
> upgrades.  Today he has spent the whole day at one of his cities, 
> trying to get his app to run on their WinXP/Office XP machines.  (This 
> app was originally developed in 97 and converted to 2000).  Everything 
> is fine except that reports do not run.  Hitting the Preview button 
> causes absolutely nothing to happen.  
>  
> I was thinking that this was a problem with the app, or the conversion 
> to Access 2002, but I don't think so now.  I had Bill create a 
> completely new .mdb, create one table with four fields:  ID, Name, 
> Address, City.  The ID field is an autonumber PK, the rest are text.  
> Bill used the report wizard to create one simple report from this 
> table, and received the message that "The wizard is unable to create 
> your report".  Creating a report without the wizard produced a little 
> more information, a complaint about a lack of default printer.  (I 
> don't have the exact text of the error message, and I can't get it, 
> because Bill has given up for the day and gone home.)
>  
> We double-checked for a default printer, which there was, but in the 
> hopes of changing something, we deleted all printers and re-installed 
> one, setting that to the default.  The printer will act correctly as 
> the default printer for Word, Excel, etc. 
>  
> Rebooting hasn't helped.  Nor has a re-install of Access. 
>  
> Does anybody know what is going on here?
>  
> Thanks so much,
>  
>
> Liz Doering
> Symphony Information Services
> liz at symphonyinfo.com <mailto:liz at symphonyinfo.com>
> www.symphonyinfo.com
>
>------------------------------------------------------------------------
>
>_______________________________________________
>AccessD mailing list
>AccessD at databaseadvisors.com
>http://databaseadvisors.com/mailman/listinfo/accessd
>Website: http://www.databaseadvisors.com
>  
>




More information about the AccessD mailing list