Impostare stampanti diverse

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.