| |
Visual-Basic EinsteigerAnzahl Kopien abfragen aus Druckerdialog | | | Autor: MoveIt | Datum: 04.09.14 15:46 |
| Hallo !
Über folgende Funktion kann ich in VB6 unter Windows XP die Druck-Kopien abfragen:
Public Function GetPrinter(frmOwner As Form, Optional PrintFlags As Integer) As _
Printer
Dim PrintDlg As PRINTDLG_TYPE
Dim DevMode As DEVMODE_TYPE
Dim DevName As DEVNAMES_TYPE
Dim lpDevMode As Long, lpDevName As Long
Dim bReturn As Integer
Dim objPrinter As Printer, NewPrinterName As String
Dim strSetting As String
' Use PrintDialog to get the handle to a memory
' block with a DevMode and DevName structures
PrintDlg.lStructSize = Len(PrintDlg)
'PrintDlg.hwndOwner = frmOwner.hWnd
PrintDlg.flags = PrintFlags
'Set the current orientation and duplex setting
DevMode.dmDeviceName = Printer.DeviceName
DevMode.dmSize = Len(DevMode)
DevMode.dmFields = DM_ORIENTATION Or DM_DUPLEX
DevMode.dmOrientation = Printer.Orientation
On Error Resume Next
DevMode.dmDuplex = Printer.Duplex
On Error GoTo 0
'Allocate memory for the initialization hDevMode structure
'and copy the settings gathered above into this memory
PrintDlg.hDevMode = GlobalAlloc(GMEM_MOVEABLE Or _
GMEM_ZEROINIT, Len(DevMode))
lpDevMode = GlobalLock(PrintDlg.hDevMode)
If lpDevMode > 0 Then
CopyMemory ByVal lpDevMode, DevMode, Len(DevMode)
bReturn = GlobalUnlock(PrintDlg.hDevMode)
End If
'Set the current driver, device, and port name strings
With DevName
.wDriverOffset = 8
.wDeviceOffset = .wDriverOffset + 1 + Len(Printer.DriverName)
.wOutputOffset = .wDeviceOffset + 1 + Len(Printer.Port)
.wDefault = 0
End With
With Printer
DevName.extra = .DriverName & Chr(0) & _
.DeviceName & Chr(0) & .Port & Chr(0)
End With
'Allocate memory for the initial hDevName structure
'and copy the settings gathered above into this memory
PrintDlg.hDevNames = GlobalAlloc(GMEM_MOVEABLE Or _
GMEM_ZEROINIT, Len(DevName))
lpDevName = GlobalLock(PrintDlg.hDevNames)
If lpDevName > 0 Then
CopyMemory ByVal lpDevName, DevName, Len(DevName)
bReturn = GlobalUnlock(lpDevName)
End If
'Call the print dialog up and let the user make changes
If PrintDialog(PrintDlg) Then
'First get the DevName structure.
lpDevName = GlobalLock(PrintDlg.hDevNames)
CopyMemory DevName, ByVal lpDevName, 45
bReturn = GlobalUnlock(lpDevName)
GlobalFree PrintDlg.hDevNames
'Next get the DevMode structure and set the printer
'properties appropriately
lpDevMode = GlobalLock(PrintDlg.hDevMode)
CopyMemory DevMode, ByVal lpDevMode, Len(DevMode)
bReturn = GlobalUnlock(PrintDlg.hDevMode)
GlobalFree PrintDlg.hDevMode
NewPrinterName = UCase$(Left(DevMode.dmDeviceName, InStr( _
DevMode.dmDeviceName, Chr$(0)) - 1))
If UCase(Left(Printer.DeviceName, Len(NewPrinterName))) <> UCase( _
NewPrinterName) Then
For Each objPrinter In Printers
If UCase$(objPrinter.DeviceName) = NewPrinterName Then
Set Printer = objPrinter
End If
Next
End If
On Error Resume Next
'Set printer object properties according to selections made
'by user
With Printer
.PaperBin = DevMode.dmDefaultSource
.Copies = DevMode.dmCopies
.Duplex = DevMode.dmDuplex
.Orientation = DevMode.dmOrientation
End With
ueDeviceName = (Left(DevMode.dmDeviceName, InStr(DevMode.dmDeviceName, _
Chr$(0)) - 1))
uePaperBin = DevMode.dmDefaultSource
ueCopies = DevMode.dmCopies
ueDuplex = DevMode.dmDuplex
ueOrientation = DevMode.dmOrientation
ueQuality = DevMode.dmPrintQuality
On Error GoTo 0
Set GetPrinter = Printer
Else
ueDeviceName = ""
uePaperBin = ""
ueCopies = ""
ueDuplex = ""
ueOrientation = ""
ueQuality = ""
Set GetPrinter = Nothing
End If
End Function Das hat bisher auch wunderbar geklappt-wenn wir nicht unsere Clients auf Win 8.1 bzw Win 7 umgestellt hätten.
Bei devMode.dmCopies steht egal, wieviel Kopien man in dem Druckerdialog wählt, immer eine 1 drinne.
Gibt es da vielleicht einen anderen "Hack" ?
Vielen Dank + Viele Grüße,
Stephan
__________________
Heute ist nicht mein Tag.
| |
Re: Anzahl Kopien abfragen aus Druckerdialog | | | Autor: Blackbox | Datum: 04.09.14 21:01 |
| Hi,
die Lösung ist ganz einfach: Du darfst das Printer Objekt von VB nicht mehr verwenden, weil es nicht mehr unterstützt wird.
Anstatt musst Du selbst ein Printer-Objekt neu implementieren.
Das heißt einfach eine neue Klasse bauen.
Das meint: Weichliegen geht nicht mehr - wirklich proggen ist angesagt!
| |
Re: Anzahl Kopien abfragen aus Druckerdialog | | | Autor: MoveIt | Datum: 05.09.14 07:08 |
| ;) so mit interface, methoden, members und konstruktoren und so ?
__________________
Heute ist nicht mein Tag.
| |
| Sie sind nicht angemeldet! Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.
Einloggen | Neu registrieren |
|
|
vb@rchiv CD Vol.6 vb@rchiv Vol.6
Geballtes Wissen aus mehr als 8 Jahren vb@rchiv!
Online-Update-Funktion Entwickler-Vollversionen u.v.m.Jetzt zugreifen Tipp des Monats Neu! sevEingabe 3.0
Einfach stark!
Ein einziges Eingabe-Control für alle benötigten Eingabetypen und -formate, inkl. Kalender-, Taschenrechner und Floskelfunktion, mehrspaltige ComboBox mit DB-Anbindung, ImageComboBox u.v.m. Weitere Infos
|
|
|
Copyright ©2000-2024 vb@rchiv Dieter Otter Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.
Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel
|
|