Newsgroup: it.comp.lang.visual-basic
Titolo: Leggere e settare stampante predefinita

Salve a tutti,
ho le necessità di leggere e impostare la stampante predefinita in win.
Una cosa del genere:
PIPPO= Stampante Predefinita
SET Stampante Predefinita= PLUTO
Call MiaRoutine
SET Stampante Predefinita= PIPPO
Avete qualche idea? Con l'oggetto Printer non credo che si possa fare, in
ogni caso tipo che la riconosca Word.
Con il CommonDialog si farebbe, ma c'è la scelta dell'utente, invece
dovrebbe essere automatico.
-- 
DBMS Firebird
VB6 + Ado

 SET Stampante Predefinita= PIPPO
L'oggetto Printer definisce la stampante predefinita dell'applicazione, 
non del sistema. All'avvio dell'applicazione, comunque, questa viene 
impostata su quella predefinita dell'utente, quindi memorizzandosi il 
valore di Printer.DeviceName al Load, poi è valido come PIPPO.
Se la MiaRoutine è una normale routine di VB6, teoricamente puoi usare 
Printer. Se invece utilizza la predefinita dell'utente, come fa ad 
esempio il DataReport, sbattendosene di dove punti Printer, l'unica è 
usare delle Api.
Io utilizzo un WriteProfileString seguito da un messaggio di refresh 
dei parametri di sistema con un SendMessage.
ciao
Alberto
-- 
Il tuo stesso identico umore,
ma la divisa di un altro colore

 dei parametri di sistema con un SendMessage.
In realtà lancio un report fatto con ReporMan (opensource).
Mi serve per selezionare un cassetto sulla stampante.
Le mie idee erano:
1) Usare l'impostazione di scelta cassetto di reportman (da 1 a 15)
2) Usare i caratteri predefiniti della stampante per scelta cassetto (tipo
cassetto 2 gli devo mandare CHR(120) CHR(95) ecc.)
3) Definire 2 stampanti uguali con vassoio differente da windows, quella
normale e quella che voglio usare in quell'applicazione, e usare il metodo
del post..
Dato che 1 e 2 mi pare che non funzionino, avevo pensato alla 3?
Ti viene in mente qualche altro sistema per aggirare il problema?
In pratica il cliente ha una stampante con 4 cassetti
1) Fogli bianchi
2) Moduli Bolle prestampati
3) Moduli Fatture prestampati
E io se sono in bolle o fatture devo scegliere 2 o 3.
Non vorrei fare la stampa su file di testo con i Chr(120) ecc, come
facevano in DOS.



[snip]
Se il tuo data report stampa sulla stampante di default il metodo di 
Albe funziona benissimo. È peraltro quello che uso sempre anche io. 
Questo è un esempio di codice per impostare secondo il metodo di Albe:
Private Declare Function WriteProfileString Lib "kernel32.dll" _
    Alias "WriteProfileStringA" (ByVal lpszSection As String, _
    ByVal lpszKeyName As String, ByVal lpszString As String) As Long
Private Declare Function SendNotifyMessage Lib "user32" _
    Alias "SendNotifyMessageA" (ByVal hwnd As Long, _
    ByVal msg As Long, ByVal wParam As Long, _
    ByVal lParam As Long) As Long
Private Declare Function SetDefaultPrinter Lib "winspool.drv" _
    Alias "SetDefaultPrinterA" (ByVal pszPrinter As String) As Boolean
Private Const WM_SETTINGCHANGE = &H1A
Private Const HWND_BROADCAST = &HFFFF&
Function impostaSTAMPANTE(nomeSTAMPANTE As String) As Boolean
    Dim l As Integer, A As String
    Dim Ret As Long
    impostaSTAMPANTE = False
    For l = 0 To Printers.Count - 1
        A = Printers(l).DeviceName
        If UCase(nomeSTAMPANTE) = UCase(A) Then
            'Debug.Print "nomeSTAMPANTE=|" & _
                        nomeSTAMPANTE & "|"
            Set Printer = Printers(l)
            Ret = WriteProfileString("Windows", "Device", _
                        nomeSTAMPANTE)
            SetDefaultPrinter nomeSTAMPANTE & Chr(0)
            Ret = SendNotifyMessage(HWND_BROADCAST, _
                        WM_SETTINGCHANGE, 0, 0)
            impostaSTAMPANTE = True
            Exit For
        End If
    Next l
End Function
Una volta impostata la stampante puoi accedere a tutte le sue proprietà 
in lettura e scrittura. Ricorda di mettere le cose a posto alla fine del 
tuo programma, quindi di ripristinare la stampante di default. Odio i 
programmi che mi sconvolgono uindos.
Hola :)
-> GbC
www.gbcweb.com

 programmi che mi sconvolgono uindos.
Già mi immagino i crash con la stampante rimasta nell'altro modo :))
Comunque è solo per un cliente specifico, nulla di che :)
Tnx



Ciao ciao
-> GbC
www.gbcweb.com

 capisco.
No, immagino già il programma che va in crash durante la stampa, e rimane
impostata la stampante "temporanea", senza che al termine rimetta quella
corretta :)
Comunque tnx, funziona!



Ah, ho capito. In questo caso nulla possiamo.
Si potrebbe memorizzare la stampante predefinita in un file di appoggio 
e gestirlo, ma mi sembra di essere paranoico. Se una volta crasha 
pace... Si rimette la stampante a posto a manina e basta.
Emmica posso fa' tutto io...
Hola
-> GbC
www.gbcweb.com

 Emmica posso fa' tutto io...
Nono infatti :)
In ogni caso ci sono due routine con gestione d'errore per leggere e
settare.
E nel mezzo *non dovrebbero* generarsi errori, o perlomeno non da far
crashare l'app, al limite il report.
In ogni caso è per un solo cliente.
