Hab da eine Routine, ursprünglich in XProfan
von Andreas Hötker geschrieben, die ich in
PB umgesetzt habe. Umstellen auf Landscape
geht, aber es läßt sich nicht mehr zurückstellen.
Weiß jemand, wo der Haken ist ?
Außerdem würde ich noch gerne eine Fehlerbehandlung
einbauen.
PS: Die Printer -lib scheint bei mir unter XP und PB4.4
Beta 6 nicht zu funktionieren. Hab auch sonst nichts
gefunden, was funktioniert hätte.
Code: Alles auswählen
#VER_PLATFORM_WIN32_WINDOWS = 1
#VER_PLATFORM_WIN32_NT = 2
Global Dim OS.OSVERSIONINFO(1)
Procedure PrinterMode(mode.l) ; 1=Portait 2= Landscape
; ursprüngliche Routine in XProfan von Andreas Hötker
Protected WinVer.l, SectionName.s, Keyname.s, DefaultString.s, ReturnBuffer.l, PrinterName.s, PHandle.l
Protected PDevice.s, Count.l, Laenge.l, DevMode.l, DevMode2.l, Fehler.l, Offset.l, Zaehler.l
Protected Found.l, Laenge2.l, Vergleich.l, SubKey.s
Protected pcount.l, Pointer_To_DevMode.l, pHandle1.l
;OnErrorGoto(?ErrorHandler)
OS(0)\dwOSVersionInfoSize = 148
GetVersionEx_(@*OS)
WinVer = 8
If OS(0)\dwPlatformID = #VER_PLATFORM_WIN32_WINDOWS
If OS(0)\dwMajorVersion = 4
Select OS(0)\dwMinorVersion
Case 0 : WinVer = 1
Case 10 : WinVer = 2
Case 90 : WinVer = 3
EndSelect
EndIf
ElseIf OS(0)\dwPlatformID = #VER_PLATFORM_WIN32_NT
Select OS(0)\dwMajorVersion
Case 4 : Win_Ver = 4
Case 5 : Win_Ver = 5
Case 6 : Win_Ver = 6
Case 7 : Win_Ver = 7
EndSelect
EndIf
*ReturnBuffer = AllocateMemory(256)
SectionName = "Windows"
KeyName = "device"
DefaultString = ""
GetProfileString_(@SectionName, @KeyName, @DefaultString, *ReturnBuffer, 256)
Printername = StringField(PeekS(*ReturnBuffer), 1, ",")
FreeMemory(*ReturnBuffer)
PDevice = ""
If Win_Ver < 6
*pHandle = AllocateMemory(4)
Fehler = OpenPrinter_(@PrinterName, *pHandle, 0)
;Fehler = ErrorCode()
Laenge = DocumentProperties_(WindowID(#MyWindow), PeekL(*pHandle), @PDevice, 0, 0, 0)
;Fehler = ErrorCode()
*DevMode = AllocateMemory(Laenge)
*DevMode2 = AllocateMemory(Laenge)
Fehler = DocumentProperties_(WindowID(#MyWindow), PeekL(*pHandle), @Device, *DevMode, 0, 2)
;Fehler = ErrorCode()
Fehler = DocumentProperties_(WindowID(#myWindow), PeekL(*pHandle), @PDevice, *DevMode2, 0, 2)
;Fehler = ErrorCode()
Fehler = PeekW(*DevMode + 44)
PokeL(*DevMode + 40, 1)
PokeW(*DevMode + 44, mode)
Fehler = DocumentProperties_(WindowID(#MyWindow), PeekL(*pHandle), @PDevice, *DevMode, *DevMode, 8|2|1)
;Fehler = ErrorCode()
Fehler = ClosePrinter_(PeekL(*pHandle))
Fehler = OpenPrinter_(@PrinterName, *pHandle, 0)
;Fehler = ErrorCode()
Fehler = DocumentProperties_(WindowID(#MyWindow), PeekL(*pHandle), @PDevice, *DevMode2, 0, 2)
;Fehler = ErrorCode()
Fehler = PeekW(*DevMode +44)
Fehler = ClosePrinter_(PeekL(*pHandle))
FreeMemory(*DevMode)
FreeMemory(*pHandle)
FreeMemory(*DevMode2)
Else
*pHandle = AllocateMemory(4)
Fehler = OpenPrinter_(@PrinterName, *pHandle, 0)
;Fehler = ErrorCode()
Laenge2 = DocumentProperties_(WindowID(#MyWindow), PeekL(*pHandle), @PDevice, 0, 0, 0)
;Fehler = ErrorCode()
*DevMode = AllocateMemory(Laenge2)
Fehler = DocumentProperties_(WindowID(#MyWindow), PeekL(*pHandle), @PDevice, *DevMode, 0, 2)
;Fehler = ErrorCode()
Fehler = PeekW(*DevMode + 44+32)
*DevMode2 = AllocateMemory(Laenge2)
Fehler = ClosePrinter_(PeekL(*pHandle))
PokeW(*DevMode + 44+32, mode)
*Handle = AllocateMemory(4)
SubKey = "Printers\DevModePerUser"
RegCreateKey_($80000001, @SubKey, *Handle)
RegSetValueEx_(PeekL(*Handle), @PrinterName, 0, 3, *DevMode, Laenge2)
RegCloseKey_(PeekL(*Handle))
SubKey = "Printers\DevModes2"
RegCreateKey_($80000001, @Subkey, *Handle)
RegSetValueEx_(PeekL(*Handle), @PrinterName, 0, 3, *DevMode, Laenge2)
RegCloseKey_(PeekL(*Handle))
FreeMemory(*Handle)
SendMessage_($FFFF, $001A, 0, 0)
SendMessage_($FFFF, $001B, 0, 0)
Fehler = OpenPrinter_(@PrinterName, *pHandle, 0)
;Fehler = ErrorCode()
Fehler = DocumentProperties_(WindowID(#MyWindow), PeekL(*pHandle), @PDevice, *DevMode2, 0, 2)
;Fehler = ErrorCode()
Fehler = PeekW(*DevMode2 + 44+32)
Fehler = ClosePrinter_(PeekL(*pHandle))
FreeMemory(*pHandle)
FreeMemory(*DevMode2)
FreeMemory(*DevMode)
EndIf
ErrorHandler:
;MessageRequester("Fehlermeldung", "Der folgende Fehler trat auf: " + ErrorMessage(Fehler))
EndProcedure