1. In einem Programm unter MS-Access 97 soll in einer Routine zum Ausdruck von Rechnungen der Druckerschacht mittels Programmcode umgeschaltet werden. Hierzu benutze ich die untenstehende Routine, die jeweils unmittelbar vor dem eigentlichen Druck aufgerufen wird und den Druckerschacht auswählt und speichert. Die Routine wurde im wesentlichen aus einem Beispiel der Access-Online-Hilfe abgeleitet.
Im Betrieb kommt es jedoch – nicht immer, aber sehr häufig – in der letzten zeile der Routine zu Laufzeitfehlern „Zu wenig Speicher“, die ich mir nicht erklären kann. Das Programm läuft in einem Netzwerk auf einem PC mit 128 MB Hauptspeicher unter Windows NT mit Servicepack 6.
Wer kann mir einen Rat geben? Gibt es andere Möglichkeiten der Druckerschachtumschaltung zur Laufzeit?
2. Wie kann man zur Laufzeit beim Druck eines mehrseitigen Reports nach Druck der ersten Seite auf einen anderen Druckerschacht umschalten (Problem: erste Seite auf Kopfbogen, weitere Seiten auf Blankopapier)?
Für Ihre freundliche Hilfe danke ich sehr.
Hans Grigull
'Für PrtDevMode (Wechseln Druckerschacht)
Type str_DEVMODE
strGZF As String * 94
End Type
Type type_DEVMODE
strDeviceName As String * 16
intSpecVersion As Integer
intDriverVersion As Integer
intSize As Integer
intDriverExtra As Integer
lngFields As Long
intOrientation As Integer
intPaperSize As Integer
intPaperLength As Integer
intPaperWidth As Integer
intScale As Integer
intCopies As Integer
intDefaultSource As Integer
intPrintQuality As Integer
intColor As Integer
intDuplex As Integer
intResolution As Integer
intTTOption As Integer
intCollate As Integer
strFormName As String * 16
lngPad As Long
lngBits As Long
lngPW As Long
lngPH As Long
lngDFI As Long
lngDFr As Long
End Type 'type_DEVMODE
Private Sub SetAPaperCase(strRptName As String, intSchacht As Integer)
'Gibt für einen bestimmten Report den Drucvkerschacht vor, aus dem später gedruckt werden soll.
'PARAMETER: IN: strRptName = Name des Reports
' intSchacht = Kennziffer für den Druckerschacht
'HINWEISE:
'- Die Kennziffer für den jeweiligen Druckschacht ist druckerspezifisch
'- Der Druckerschacht wird mit diesem Report gespeichert. Aus ihm wird solange
' gedruckt, bis er mit dieser Prozedur geändert wird
Dim GeräteZF As str_DEVMODE
Dim DM As type_DEVMODE
Dim strGerätemodus As String
Dim rpt As Report
DoCmd.OpenReport strRptName, acViewDesign 'Bericht öffnen.
Set rpt = Reports(strRptName)
If Not IsNull(rpt.PrtDevMode) Then
strGerätemodus = rpt.PrtDevMode 'PrtDevMode holen
GeräteZF.strGZF = strGerätemodus
LSet DM = GeräteZF
DM.lngFields = DM.lngFields Or DM.intDefaultSource 'Das Element Fields initialisieren.
DM.intDefaultSource = intSchacht
LSet GeräteZF = DM 'PrtDevMode aktualisieren.
Mid(strGerätemodus, 1, 94) = GeräteZF.strGZF
rpt.PrtDevMode = strGerätemodus
End If
'Bericht schließen; Änderungen speichern
'Hier tritt der Laufzeitfehler „Zu wenig Speicher“ auf!!!!!!!!!
DoCmd.Close acReport, strRptName, acSaveYes
End Sub
Im Betrieb kommt es jedoch – nicht immer, aber sehr häufig – in der letzten zeile der Routine zu Laufzeitfehlern „Zu wenig Speicher“, die ich mir nicht erklären kann. Das Programm läuft in einem Netzwerk auf einem PC mit 128 MB Hauptspeicher unter Windows NT mit Servicepack 6.
Wer kann mir einen Rat geben? Gibt es andere Möglichkeiten der Druckerschachtumschaltung zur Laufzeit?
2. Wie kann man zur Laufzeit beim Druck eines mehrseitigen Reports nach Druck der ersten Seite auf einen anderen Druckerschacht umschalten (Problem: erste Seite auf Kopfbogen, weitere Seiten auf Blankopapier)?
Für Ihre freundliche Hilfe danke ich sehr.
Hans Grigull
'Für PrtDevMode (Wechseln Druckerschacht)
Type str_DEVMODE
strGZF As String * 94
End Type
Type type_DEVMODE
strDeviceName As String * 16
intSpecVersion As Integer
intDriverVersion As Integer
intSize As Integer
intDriverExtra As Integer
lngFields As Long
intOrientation As Integer
intPaperSize As Integer
intPaperLength As Integer
intPaperWidth As Integer
intScale As Integer
intCopies As Integer
intDefaultSource As Integer
intPrintQuality As Integer
intColor As Integer
intDuplex As Integer
intResolution As Integer
intTTOption As Integer
intCollate As Integer
strFormName As String * 16
lngPad As Long
lngBits As Long
lngPW As Long
lngPH As Long
lngDFI As Long
lngDFr As Long
End Type 'type_DEVMODE
Private Sub SetAPaperCase(strRptName As String, intSchacht As Integer)
'Gibt für einen bestimmten Report den Drucvkerschacht vor, aus dem später gedruckt werden soll.
'PARAMETER: IN: strRptName = Name des Reports
' intSchacht = Kennziffer für den Druckerschacht
'HINWEISE:
'- Die Kennziffer für den jeweiligen Druckschacht ist druckerspezifisch
'- Der Druckerschacht wird mit diesem Report gespeichert. Aus ihm wird solange
' gedruckt, bis er mit dieser Prozedur geändert wird
Dim GeräteZF As str_DEVMODE
Dim DM As type_DEVMODE
Dim strGerätemodus As String
Dim rpt As Report
DoCmd.OpenReport strRptName, acViewDesign 'Bericht öffnen.
Set rpt = Reports(strRptName)
If Not IsNull(rpt.PrtDevMode) Then
strGerätemodus = rpt.PrtDevMode 'PrtDevMode holen
GeräteZF.strGZF = strGerätemodus
LSet DM = GeräteZF
DM.lngFields = DM.lngFields Or DM.intDefaultSource 'Das Element Fields initialisieren.
DM.intDefaultSource = intSchacht
LSet GeräteZF = DM 'PrtDevMode aktualisieren.
Mid(strGerätemodus, 1, 94) = GeräteZF.strGZF
rpt.PrtDevMode = strGerätemodus
End If
'Bericht schließen; Änderungen speichern
'Hier tritt der Laufzeitfehler „Zu wenig Speicher“ auf!!!!!!!!!
DoCmd.Close acReport, strRptName, acSaveYes
End Sub
Comment