Ciao a tutti, in una mia applicazione ho la necessit di eseguire delle stampe e di dover selezionare la stampante corretta (stampante A per normali stampa A4, stampante B per una particolare stampa su modulo, e stampante C per stampa di etichette).
Vorrei evitare che, ad ogni stampa che viene lanciata, l’utente debba scegliere la stampante corretta tramite OpenPrinterDialog, un po’ per la rottura di scatole che questo comporta, e un po’ anche per evitare che venga scelta una stampante piuttosto che un’altra.
C’ modo di impostare da codice la stampante corretta?
Avevo pensato ad un file di configurazione dove reperire il nome delle 3 stampanti, ma non so come impostarle direttamente da codice al momento del lancio di una stampa.
Spero che qualcuno mi sappia indirizzare nel modo giusto.
Grazie
Nedi
Puoi registrare le impostazioni della stampa in una stringa (db o altro) e riprenderle prima di stampare
Grazie Antonio, ma se mi spieghi nel dettaglio come fare te ne sarei grato.
Poniamo che vuoi stampare sulla stampanteA e sulla StampanteB a seconda del metodo e che non vuoi richiamare sempre le finestre di dialogo per stampare.
Le impostazioni saranno un campo binario ad esempio su db o altro.
Nella procedura leggi (da dove salvi) la stringa delle impostazioni (se non la trovi restituisci una stringa vuota)
Imposta anche una funzionalit per resettare (cancellare) le impostazioni di stampa in modo da poterle ricreare (stampante diversa etc)
dim ps as new PrinterSetup
dim ok as boolean
Dim g As Graphics
if impostazioni="" then
//In setup puoi annullare l'operazione
ok=ps.PageSetupDialog
else
ok=true
end if
if ok then
if impostazioni="" then
g = OpenPrinterDialog(ps)
if g<>nil then
//Hai creato le impostazioni da dialogo le puoi salvare
saveImpostazioni(ps.SetupString)
end if
else
ps.setupString=impostazioni
g=openPrinter(ps)
end if
if g<>nil then
//Stampa
end if
Grazie Antonio, appena possibile prover la tua soluzione.
Ciao Antonio, seguendo le tue indicazioni ho risolto il problema (non avevo dubbi che tu mi avresti portato sulla “retta via”!!)
Vorrei per sottoporre la soluzione che ho adottato al tuo giudizio, e ti prego di segnalarmi tutto quello che sbagliato o che potrebbe essere sviluppato in altro modo.
Allora: nella mia applicazione c’ una voce in un men che mi permette di salvare le impostazioni della stampante. Questo il codice:
// salvo le impostazioni della stampante
Dim f As FolderItem
Dim strOut As TextOutputStream
Dim ps As New PrinterSetup
#if DebugBuild Then
f = GetLocalFolderItem("")
#else
f = GetFolderItem("")
#endif
f = f.Child("PrinterSettings.txt")
' se il file non esiste lo creo
If f <> Nil Then
If ps.PageSetupDialog = True Then
Dim g As Graphics
g = OpenPrinterDialog(ps, Nil)
If g <> Nil Then
strOut = TextOutputStream.Create(f)
strOut.Write(EncodeBase64(ps.SetupString))
strOut.Close
Return True
Exit Function
End If
End If
end if
// errore
Return False
Poich sono 3 le impostazioni che mi servono, ogni volta che il codice di cui sopra genera il file “PrinterSettings.txt” io lo rinomino manualmente, per cui alla fine ho 3 file (PrinterSettings_1.txt, PrinterSettings_2.txt, PrinterSettings_3.txt)
I metodi che eseguono le stampe sanno, ovviamente, quale file utilizzare.
Per stampare eseguo il codice seguente
Dim rpt As Report
Dim RS As RecordSet
Dim ps As new PrinterSetup
rpt = New SchedaColore
RS = oArticolo.ElencoPerSchedaColore(CodArtIni, CodArtFin, DesArtIni, DesArtFin)
' ---------------------------------------------
// carico le impostazioni della stampante
Dim SetupString As String
SetupString = ReadSetupString("PrinterSettings_1.txt")
If SetupString <> "ERRORE" Then
ps.SetupString = SetupString
End If
' ---------------------------------------------
ps.Landscape = False
ps.MaxHorizontalResolution = 300
ps.MaxVerticalResolution = 300
Dim g As Graphics
' g = OpenPrinterDialog(ps, Nil)
g = OpenPrinter(ps)
If g <> Nil Then
If rpt.Run( RS, ps ) Then 'if the report runs successfully
rpt.Document.Print(g)
End If
End If
Il metodo ReadSetupString esegue il seguente codice:
// carico le impostazioni
Dim f As FolderItem
Dim SetupString As String
Dim strIn As TextInputStream
#if DebugBuild Then
f = GetLocalFolderItem("")
#else
f = GetFolderItem("")
#endif
f = f.Child(SettingsFile)
If f <> Nil Then
If f.Exists Then
strIn = TextInputStream.Open(f)
SetupString = DecodeBase64(strIn.ReadAll)
strIn.Close
Return SetupString
Exit Function
End If
End If
// errore
Return "ERRORE"
Attendo il tuo parere…e grazie ancora!
Nedi
Un’ultima cosa: hai provato la versione 2018r2? Come ti sembra?
Per il momento bene, ma non l’ho ancora usata per le applicazioni importanti (visto il periodo)
Tu come ti ci trovi?
Io ho fatto una breve carrellata con qualche progetto sviluppato in precedenza, ma niente di approfondito.
La prima impressione buona, anche se ho notato un discreto rallentamento nel design di una window, man mano che aggiungevo controlli (ma forse dipendeva da qualche cosa d’altro).
Una volta poi mi successo che, impostando la propriet Mask di un TextField, questi scompariva dalla window: con Ctrl+Z riapparso (ma forse avevo involontariamente modificato qualche propriet).
Comunque non ho disinstallato la 2017r3, non si sa mai.