Newsgroup: it.comp.lang.visual-basic
Titolo: Re: Problema con oggetto Printer

 ha scritto
CommonDialog.ShowPrinter
il problema qual'è? se metto a False la proprietà "PrinterDefault"
dell'oggetto CommonDialog, la stampa viene inviata solamente alla
stampante di default, anche se l'utente ne ha scelta un'altra. Se metto
tale proprietà a True, la stampa viene inviata correttamente alla
stampante selezionata MA successivamente mi trovo modificata la
stampante di default che non è più quella che era impostata prima, ma
quella che l'utente ha scelto dalla finestra della CommonDialog.
Vorrei che l'utente potesse inviare la stampa alla stampante che ha
scelto dalla finestra senza però ritrovarmi successivamente la
stampante predefinita modificata.
Questo è il codice:
di solito direi che ci si salva la predefinita, si stampa su quella che si
desidera, poi si ripristina la predefinita.
ciao, a.

 ripristina la predefinita, come mai?
Con l'ultimo for each tu reimposti la predefinita dell'applicativo, non 
di sistema.
Col commondialog, con PrinterDefault=True, imposti la predefinita di 
sistema E la predefinita dell'applicativo.
Ciao
Alberto
-- 
"Se viriamo, viriamo viriamo viriamo;
Se andiamo dritti, viriamo"
(Cit. "il tattico")

 ha scritto
Grazie per la tua tempestività!
è quello che ho provato a fare con l'ultimo For Each ma non mi
ripristina la predefinita, come mai?
-
albe ti ha risposto perfettamente mentre buttavo giu' del codice, perché
printer non lo uso mai.
servisse, direi funzioni.
ciao, a.
form:
http://www.sundaysw.com/tmp/form1.png
codice:
Option Explicit
Dim defP As String
Private Sub cmdTest_Click()
    Dim p As Printer
    For Each p In Printers
        If p.DeviceName = cboPrinters Then
            Set Printer = p
            lblCurrentPrinter = p.DeviceName
            lblCurrentPrinter.Refresh
            MsgBox "scelta: " & p.DeviceName
            With Printer
                .CurrentX = 300: .CurrentY = 300
                Printer.Print ""
                Printer.Print "abcde0123456789ABCDE"
                .EndDoc
            End With
        End If
    Next
    For Each p In Printers
        If p.DeviceName = defP Then
            Set Printer = p
            cboPrinters = p.DeviceName
            MsgBox "ripristinata: " & p.DeviceName
        End If
    Next
End Sub
Private Sub Form_Load()
    Dim p As Printer
    For Each p In Printers
        cboPrinters.AddItem p.DeviceName
    Next
    defP = Printer.DeviceName
    cboPrinters = defP
    lblDefaultPrinter = defP
End Sub

Come faccio a impostare la predefinita di sistema anzichè
dell'applicativo?

 ha scritto
Come faccio a impostare la predefinita di sistema anzichè
dell'applicativo?
il mio codice l'hai letto?

 dell'applicativo?
Ma vuoi risolvere il problema o perfezionare la pezza?
Cioè, quella di impostare la predefinita e poi tornare indietro è una 
pezza.
Anzi, diciamocelo chiaramente, è una porcheria, perchè se la stampa 
impiega tempo, avresti un tempo t durante il quale il tuo sistema ha la 
predefinita sbagliata. E se capita un errore, e il tuo app si inchioda 
prima di reimpostare la predefinita, sono cazzi. E comunque non è detto 
che l'utente abbia il diritto di cambiare la predefinita.
E' quindi una pezza da usare quando proprio non esiste altro modo (ad 
esempio per il datareport).
Quindi, devi trovare il modo di usare una printer diversa da quella 
predefinita di sistema, senza modificare quest'ultima.
E purtroppo, l'unico modo è quello di abbandonare il commondialog, e di 
utilizzare un altro stumento di scelta, come ad esempio il combo 
proposto da Andrea.
Il cmdlg infatti ti restituisce l'HDc della stampante selezionata. Se 
il tuo metodo di stampa prevede di dirigere l'output verso un HDc, va 
benissimo anche il CmdDlg. Ma se vuoi sfruttare i metodi di Printer, 
non ci sono cazzi.


Grazie per il vostro supporto, comunque ho risolto il mio problema
usando la classica dialog, come? Ho trovato un post del 27-nov-2004 con
il link a questo articolo: 
http://support.microsoft.com/?kbid=322710
mais76

 mais76
bene cosi'. ma quello che diceva carmine nel thread interoperabilità è un
esempio del perche' mi piacciono pochi fronzoli e piu' portabilità. il
codice riesco probabilmente a portarlo (e/o a gestirlo meglio, se serve),
ocx dll ecc di terzi, ms compresa, non si sa.
anni fa avevo provato a giocherellare con proprietà e metodi printer.* e
mi sembrava si potesse fare parecchio senza installare niente di
aggiuntivo.
pero', ripeto, se ti risolve il problema, bene cosi'.
ciao, a.
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 aggiuntivo.
Purtroppo, quello che chiedeva l'OP con printer non si fa proprio.
Se riesce a modificare il codice e a usare l'HDc anzichè printer, 
meglio per tutti. Ma se è costretto a usare Printer, non c'è verso.


 Purtroppo, quello che chiedeva l'OP con printer non si fa proprio.
ne sai ben piu' di me e mi fido, anche perche' forse non ho capito il
problema: ora ho preso il mio vbp di oggi e gli ho detto di stampare su
pdf (che non è la predefinita). *mentre* era aperta la finestra del
filename per il pdf, quindi il set printer aveva già funzionato, ho
provato da oe a stampare un messaggio, e mi ha proposto la predefinita.
cioè il set printer non dovrebbe causare rischi alla predef di sistema.
non era questo il prob in questione?
o sta continuando il mio no-fly period ? forse le vacanze devo prenotarle
a lourdes ? :)


 provato da oe a stampare un messaggio, e mi ha proposto la predefinita.
Ma OE l'hai avviato mentre il dialog del pdf era aperto, o era già 
avviato da prima?


 avviato da prima?
fa' conto di avermi infilato un ghiacciolo nel colletto :)
prima effettivamente era gia' aperto.
ora l'ho chiuso, ho avviato il vbp, a dialog del pdf aperto ho lanciato oe
-> stampa -> epson predefinita.


 -> stampa -> epson predefinita.
Mmhh, strano.
Siccome lo switch della predefinita è l'unico modo per stampare su 
stampante alternativa col datareport, lo usiamo proprio per commutare 
sulla pdf, stampare, e poi rimettiamo la predefinita su quella 
precedente.
E tutti i test fatti (non con OE, ma credo con notepad, word, insomma, 
le solite cose), avevano appurato che la predefinita di sistema andava 
sulla pdf per tutta la durata della stampa su pdf (anche minuti, se ci 
si fermava col dialog).
Forse la differenza è che noi facevamo lo switch sulla pdf mediante 
codice, e non attraverso un cmdlg...
Ciao


 codice, e non attraverso un cmdlg...
sto appunto usando esattamente il codice postato oggi, di common dialog
non ce n'e'.
riprovato, in ide e poi con il compilato.
a pdf_filename aperto, anche word ripropone la predefinita.
tenendo il dialog del pdf aperto, ho chiuso word, e da stampanti ho
cambiato la predef dalla epson di casa alla hp6l su lpt1. aperto word,
propone la hp6.
mi sembra vagamente di ricordare che con la predefinita ci fosse un buco
in vb5. qui ho vb6sp6.


 non ce n'e'.
Aspetta.
Forse non ci capiamo.
Io stavo ragionando sul discorso di cambiare la predefinita di sistema, 
e poi ripristinarla.
Col codice postato (quello che usa il combo e il Set Printer), tu cambi 
la predefinita *dell'applicativo, non di sistema*.
Ma questo era noto fin dall'inizio. Il punto del thread era, in 
sostanza: come poter usare un cmdlg e stampare poi usando l'oggetto 
printer. E la mia risposta è stata: "non si può. O usi un altro 
strumento di scelta, ad esempio il combo consigliato da Andrea, oppure, 
se vuoi mantenere il cmdlg, devi fare impostare le predefinita di 
sistema dal cmdlg, poi ripristinarla (con le Api) a fine stampa, ma non 
mi piace perchè genera problemi con altre applicazioni."
Il fatto che non generi problema l'impostazione dell'oggetto printer 
usando un devicename ottenuto in modo diverso dal cmdlg (nel tuo caso 
con una combo), è assodato.


 la predefinita *dell'applicativo, non di sistema*.
ok, ora è chiaro :)
ciao, a.