Skulle behöva få tag i vald skrivare i klartext, tex "HP Laserjet 6P" ur CommonDialog för printer. Ja det är ju lite enklare än att böka runt med en CommonDialog Tycker Peters Lösning är mycket bra, lätt att ladda en comboruta med alternativen. "Messar" ju också lite med minnet. Kan vara farligt i VB... :O) Tack alla som hjälpt mig med problemet, valde ett API anrop till sist funkar utmärkt!!Skrivarnamn ur CommonDialog för printer?
Kan tänka mig att man skall nyttja CommonDialog1.hDC, men hur sätter man flags etc för att Text1.text = CommonDialog1.hDC skall ge skrivarnamet i klartext, eller är jag inne på fel väg? Sv: Skrivarnamn ur CommonDialog för printer?
Starta ett nytt projekt.
Lägg in en command1
klistra in följande:
===========================================
Private Sub Command1_Click()
'Lista namnet på standardskrivaren
Debug.Print Printer.DeviceName
End Sub
===========================================
Printerobjektet är det du skall pyssla med när det gäller utskrifter.
Private Sub Command1_Click()
'Lista namnet på alla installerade skrivare
Dim printer_ as Printer
For Each printer_ in Printers
Debug.Print printer_.DeviceName
Next printer_
End Sub
Ja det finns mycket roligt........
/peterhSv: Skrivarnamn ur CommonDialog för printer?
Men om du vill utmana ödet och använda api anrop.
Så kan du göra såhär:
Option Explicit
Private Const GMEM_MOVEABLE = &H2
Private Const GMEM_ZEROINIT = &H40
Private Const CCHDEVICENAME = 32
Private Const CCHFORMNAME = 32
Private Type POINTAPI
x As Long
y As Long
End Type
Private Type RECT
Left As Long
Top As Long
Right As Long
Bottom As Long
End Type
Private Type PageSetupDlg
lStructSize As Long
hwndOwner As Long
hDevMode As Long
hDevNames As Long
flags As Long
ptPaperSize As POINTAPI
rtMinMargin As RECT
rtMargin As RECT
hInstance As Long
lCustData As Long
lpfnPageSetupHook As Long
lpfnPagePaintHook As Long
lpPageSetupTemplateName As String
hPageSetupTemplate As Long
End Type
Private Type DEVMODE
dmDeviceName As String * CCHDEVICENAME
dmSpecVersion As Integer
dmDriverVersion As Integer
dmSize As Integer
dmDriverExtra As Integer
dmFields As Long
dmOrientation As Integer
dmPaperSize As Integer
dmPaperLength As Integer
dmPaperWidth As Integer
dmScale As Integer
dmCopies As Integer
dmDefaultSource As Integer
dmPrintQuality As Integer
dmColor As Integer
dmDuplex As Integer
dmYResolution As Integer
dmTTOption As Integer
dmCollate As Integer
dmFormName As String * CCHFORMNAME
dmUnusedPadding As Integer
dmBitsPerPel As Long
dmPelsWidth As Long
dmPelsHeight As Long
dmDisplayFlags As Long
dmDisplayFrequency As Long
End Type
Private Type DEVNAMES
wDriverOffset As Integer
wDeviceOffset As Integer
wOutputOffset As Integer
wDefault As Integer
extra As String * 100
End Type
Private Declare Function GlobalAlloc Lib "kernel32" (ByVal wFlags As Long, ByVal dwBytes As Long) As Long
Private Declare Function GlobalFree Lib "kernel32" (ByVal hMem As Long) As Long
Private Declare Function GlobalLock Lib "kernel32" (ByVal hMem As Long) As Long
Private Declare Function GlobalUnlock Lib "kernel32" (ByVal hMem As Long) As Long
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
Private Declare Function PageSetupDlg Lib "comdlg32.dll" Alias "PageSetupDlgA" (pPagesetupdlg As PageSetupDlg) As Long
Public Function ShowPageSetupDlg(Optional OwnerForm As Form) As String
Dim lReturn As Long
Dim pPagesetupdlg As PageSetupDlg
Dim lpDevMode As Long
Dim lpDevName As Long
Dim DEVMODE As DEVMODE
Dim DEVNAMES As DEVNAMES
With pPagesetupdlg
.lStructSize = Len(pPagesetupdlg)
If OwnerForm Is Nothing Then
.hwndOwner = 0&
Else
.hwndOwner = OwnerForm.hWnd
End If
.hDevMode = GlobalAlloc(GMEM_MOVEABLE Or GMEM_ZEROINIT, Len(DEVMODE))
lpDevMode = GlobalLock(.hDevMode)
If lpDevMode > 0 Then
CopyMemory ByVal lpDevMode, DEVMODE, Len(DEVMODE)
lReturn = GlobalUnlock(.hDevMode)
End If
With DEVNAMES
.wDriverOffset = 8
.wDeviceOffset = .wDriverOffset + 1 + Len(Printer.DriverName)
.wOutputOffset = .wDeviceOffset + 1 + Len(Printer.Port)
.wDefault = 0
End With
With Printer
DEVNAMES.extra = .DriverName & vbNullChar & .DeviceName & vbNullChar & .Port & vbNullChar
End With
.hDevNames = GlobalAlloc(GMEM_MOVEABLE Or GMEM_ZEROINIT, Len(DEVNAMES))
lpDevName = GlobalLock(.hDevNames)
If lpDevName > 0 Then
CopyMemory ByVal lpDevName, DEVNAMES, Len(DEVNAMES)
lReturn = GlobalUnlock(lpDevName)
End If
'flags As Long
'ptPaperSize As POINTAPI
'rtMinMargin As RECT
'rtMargin As RECT
'hInstance As Long
'lCustData As Long
'lpfnPageSetupHook As Long
'lpfnPagePaintHook As Long
'lpPageSetupTemplateName As String
'hPageSetupTemplate As Long
End With
lReturn = PageSetupDlg(pPagesetupdlg)
If lReturn Then
With pPagesetupdlg
lpDevName = GlobalLock(.hDevNames)
CopyMemory DEVNAMES, ByVal lpDevName, Len(DEVNAMES)
lReturn = GlobalUnlock(lpDevName)
GlobalFree .hDevNames
lpDevMode = GlobalLock(.hDevMode)
CopyMemory DEVMODE, ByVal lpDevMode, Len(DEVMODE)
lReturn = GlobalUnlock(.hDevMode)
GlobalFree .hDevMode
ShowPageSetupDlg = Left(DEVMODE.dmDeviceName, InStr(DEVMODE.dmDeviceName, vbNullChar) - 1)
'flags As Long
'ptPaperSize As POINTAPI
'rtMinMargin As RECT
'rtMargin As RECT
'hInstance As Long
'lCustData As Long
'lpfnPageSetupHook As Long
'lpfnPagePaintHook As Long
'lpPageSetupTemplateName As String
'hPageSetupTemplate As Long
End With
End If
End FunctionSv: Skrivarnamn ur CommonDialog för printer?
Det beror ju lite på vad man vill göra.
Om man bara ska välj en skrivar är det ju utan tvekan lätt och smidigt att använda Printer och Printers.
Men om du skall ändra inställningarna för skrivaren och också kunna välja vilken skrivare. Så har ju API anropet en klar fördel. Det är inte så mycket kod som det ser ut. Deklerationerna tar lite plats men man sliper ju distrubera och använd commondialogs kontrollen. Vilket jag tycker är mer till besvär än nytta
Kanske är lite för "kåt" på API anrop. Får ju erkänna det... :O)Sv: Skrivarnamn ur CommonDialog för printer?
Lasse