Newsgroup: it.comp.lang.visual-basic
Titolo: Come modifiacare le impostazioni della stampante?

Salve a tutti e un grazie anticipato
Il mio prob è con le stampe in VB6
in pratica nel mio progettop o creato diversi dataReport alcuni dei quali
ottimizzati per una stampa in orizzontale su A4 altri per una stampa in
vertuicale su A4
Il problema è che.. se magari la stampante predefinita è configuarta per una
stampa in verticale ed io lancio uno di quei report che utilizzano la stampa
in orizzontale, l'applicazione si blocca e va in errore
Il problema puo' essere risolto facendo sesezionare dall'utente , attraverso
una finestra di dialogo e prima del lancio dela stampa , l'orientamento
relativo ai fogli della stampante predefinita.
La cosa è poco professionale, non posso andare a dire all'utente .. "guarda
prima x questo report seleziona la stampa verticale e per quelòlo ..
orizzontale" con l'eventualità che se sbaglia o non effettua la selezione..
bhè.. ERRORE" , vorrei poter cambiare le impostazioni della stampante
predefinita , io tramite codice, prima di ogni stampa.
A nulla è servito settare tramite codice,le proprietà del commondialog ,
che se non è lanciato non aggiorna conctretamente le impostazioni
predefinite lella stampante.
COME SI FA??? Qualcuno di voi si è mai trovato a risolvere un prob. del
genere ?
Grazie a tutti
Nio_
ni...@HotERASEmail.com  *** l'indirizzo corretto si ottiene eliminando ERASE
dall'indirizzo specificato***

 predefinita , io tramite codice, prima di ogni stampa.
Vecchio post. Sto pensando di utilizzarlo come firma.
=======================================
'Costanti per la struttura DevMode
Private Const CCHDEVICENAME = 32
Private Const CCHFORMNAME = 32
'Costanti per security e access rights (NT)
Private Const STANDARD_RIGHTS_REQUIRED = &HF0000
Private Const PRINTER_ACCESS_ADMINISTER = &H4
Private Const PRINTER_ACCESS_USE = &H8
Private Const PRINTER_ALL_ACCESS = (STANDARD_RIGHTS_REQUIRED Or PRINTER_ACCESS_ADMINISTER Or PRINTER_ACCESS_USE)
'Costanti di selezione usati da DevMode
Private Const DM_MODIFY = 8
Private Const DM_IN_BUFFER = DM_MODIFY
Private Const DM_COPY = 2
Private Const DM_OUT_BUFFER = DM_COPY
Private Const DM_DUPLEX = &H1000&
Private Const DMDUP_SIMPLEX = 1
Private Const DMDUP_VERTICAL = 2
Private Const DMDUP_HORIZONTAL = 3
Private Const DM_ORIENTATION = &H1&
Private PageDirection As Integer
'------USER DEFINED TYPES
'La struttura DevMode contiene i parametri di stampa.
'Questo rappresenta solo la porzione pubblica della struttura DevMode.
'  La struttura DevMode completa contiene sezione privata di lunghezza
'  variabile che cambia in contenuto in base al driver di stampa.
'NON usare mai questo UDT per chiamate dirette all'API.
'  Occorre sempre combinarlo in una struttura DevMode completa e utilizzare
'  questa per la chiamata.
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
    dmLogPixels As Integer
    dmBitsPerPel As Long
    dmPelsWidth As Long
    dmPelsHeight As Long
    dmDisplayFlags As Long
    dmDisplayFrequency As Long
    dmICMMethod As Long        ' // Windows 9x
    dmICMIntent As Long        ' // Windows 9x
    dmMediaType As Long        ' // Windows 9x
    dmDitherType As Long       ' // Windows 9x
    dmReserved1 As Long        ' // Windows 9x
    dmReserved2 As Long        ' // Windows 9x
End Type
Private Type PRINTER_DEFAULTS
'Nota:
'  La definizione della struttura Printer_Defaults contenuta
'  nell'API viewer di VB5 non è corretta
'  -> pDevMode è stato cambiato in LONG.
    pDatatype As String
    pDevMode As Long
    DesiredAccess As Long
End Type
'------DICHIARAZIONI
Private Declare Function OpenPrinter Lib "winspool.drv" _
            Alias "OpenPrinterA" ( _
            ByVal pPrinterName As String, _
            phPrinter As Long, _
            pDefault As PRINTER_DEFAULTS) As Long
Private Declare Function SetPrinter Lib "winspool.drv" _
            Alias "SetPrinterA" ( _
            ByVal hPrinter As Long, _
            ByVal Level As Long, _
            pPrinter As Any, _
            ByVal Command As Long) As Long
Private Declare Function GetPrinter Lib "winspool.drv" _
            Alias "GetPrinterA" ( _
            ByVal hPrinter As Long, _
            ByVal Level As Long, _
            pPrinter As Any, _
            ByVal cbBuf As Long, _
            pcbNeeded As Long) As Long
Private Declare Sub CopyMemory Lib "kernel32" _
            Alias "RtlMoveMemory" ( _
            hpvDest As Any, _
            hpvSource As Any, _
            ByVal cbCopy As Long)
Private Declare Function ClosePrinter Lib "winspool.drv" ( _
            ByVal hPrinter As Long) As Long
'La dichiarazione di DocumentProperties è stata modificata :
'  i parametri pDevModeOutput e pDevModeInput sono in genere dichiarati ByRef.
'  Vengono qui dichiarati ByVal allo scopo di utilizzare la struttura Printer_Info_2.
'  La struttura contiene una variabile di tipo LONG che riporta il puntatore alla
'  struttura DevMode. Il valore LONG deve essere passato ByVal.
'  Generalmente la funzione viene chiamata con un array di byte che contengono la
'  struttura DevMode; l'array di byte viene passato ByRef.
Private Declare Function DocumentProperties Lib "winspool.drv" _
            Alias "DocumentPropertiesA" ( _
            ByVal hwnd As Long, _
            ByVal hPrinter As Long, _
            ByVal pDeviceName As String, _
            ByVal pDevModeOutput As Any, _
            ByVal pDevModeInput As Any, _
            ByVal fMode As Long) As Long
Private Sub SetOrientation(NewSetting As Long, chng As Integer, ByVal frm As Form)
Dim PrinterHandle As Long
Dim PrinterName As String
Dim pd As PRINTER_DEFAULTS
Dim MyDevMode As DEVMODE
Dim Result As Long
Dim Needed As Long
Dim pFullDevMode As Long
Dim pi2_buffer() As Long   ' Blocco di memoria per la struttura Printer_Info_2
   PrinterName = Printer.DeviceName
   If PrinterName = "" Then
      Exit Sub
   End If
   pd.pDatatype = vbNullString
   pd.pDevMode = 0&
   'Printer_Access_All è richiesto per la sicurezza in NT
   pd.DesiredAccess = PRINTER_ALL_ACCESS
   Result = OpenPrinter(PrinterName, PrinterHandle, pd)
   'la prima chiamata a GetPrinter restituisce la grandezza, in byte, del buffer richiesto.
   'Il valore viene diviso per 4 dato che ogni elemento di pi2_buffer è un long.
   Result = GetPrinter(PrinterHandle, 2, ByVal 0&, 0, Needed)
   ReDim pi2_buffer((Needed \ 4))
   Result = GetPrinter(PrinterHandle, 2, pi2_buffer(0), Needed, Needed)
   'Il settimo elemento di pi2_buffer è il puntatore ad un blocco di memoria
   'che contiene la struttura DevMode (inclusa la porzione PRIVATE).
   pFullDevMode = pi2_buffer(7)
   'Copia la porzione pubblica della struttura DevMode
   'completa nella struttura DevMode utile
   Call CopyMemory(MyDevMode, ByVal pFullDevMode, Len(MyDevMode))
   'effettua le modifiche del caso
   MyDevMode.dmDuplex = NewSetting
   MyDevMode.dmFields = DM_DUPLEX Or DM_ORIENTATION
   MyDevMode.dmOrientation = chng
   'Ricopia la struttura DevMode nella strutura completa
   Call CopyMemory(ByVal pFullDevMode, MyDevMode, Len(MyDevMode))
   'Copia le modifiche alla porzione pubblica di DevMode nella porzione privata
   Result = DocumentProperties(frm.hwnd, _
                PrinterHandle, _
                PrinterName, _
                ByVal pFullDevMode, _
                ByVal pFullDevMode, _
                DM_IN_BUFFER Or DM_OUT_BUFFER)
   'Aggiorna le proprietà predefinite
   Result = SetPrinter(PrinterHandle, 2, pi2_buffer(0), 0&)
   Call ClosePrinter(PrinterHandle)
   'Nota: Dopo l'esecuzione di Set Printer(), le modifiche vengono applicate
   '      solo alla stampante di sistema - non aggiornano l'oggetto Printer
   '      di VB. Quindi si può rendere necessario resettare l'oggetto printer
   '      per conformarlo alle caratteristiche impostate tramite DevMode.
   Dim p As Printer
   For Each p In Printers
      If p.DeviceName = PrinterName Then
         Set Printer = p
         Exit For
      End If
   Next p
   Printer.Duplex = MyDevMode.dmDuplex
End Sub
Public Sub PrinterOrientation_Landscape(ByVal frm As Form)
   PageDirection = 2
   Call SetOrientation(DMDUP_SIMPLEX, PageDirection, frm)
End Sub
Public Sub ResetPrinterOrientation(ByVal frm As Form)
   If PageDirection = 1 Then
       PageDirection = 2
   Else
       PageDirection = 1
   End If
   Call SetOrientation(DMDUP_SIMPLEX, PageDirection, frm)
End Sub
Public Sub PrinterOrientation_Portrait(ByVal frm As Form)
    PageDirection = 1
    Call SetOrientation(DMDUP_SIMPLEX, PageDirection, frm)
End Sub

GRAZIE  1K!!!!!!!!!