Impostare stampanti diverse 2

Buongiorno a tutti,

sono andrea scanu e utilizzo xojo da qualche anno…

ho preso da questo post il codice per salvare il setup di una stampante per poi impostarla in automatico successivamente…

come si può puo notare è praticamente un copia incolla
Putroppo non mi funziona. Al primo accesso seleziono la stampante desiderata e la stampa viene inoltrata li. Naturalmente salvo le impostazioni su una property.
Al secondo accesso la stampa viene dirottata sulla stampante di default. (il contenuto della property “impostazioni” è correttamente conservato in memoria)

Utilizzo un macbook pro con BigSur ed ho provato sia con xojo 2022 r1.1 ed anche con xojo 2019 r3.2
ma fanno entrambi lo stesso difetto.

Cosa sbaglio?
Qualcuno mi puo dare un aiuto per cortesia?

Grazie

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)
impostazioni=ps.SetupString //impostazioni è una property del progettino…
End If
Else
ps.setupString=impostazioni
g=OpenPrinter(ps)
End If

If g<>Nil Then
//Stampa
g.DrawText(“Hello World”, ps.HorizontalResolution, ps.VerticalResolution)
End If
End If

Ciao Andrea, io utilizzo dei file di testo (uno per ogni stampante che devo utilizzare) che contengono le impostazioni delle varie stampanti.
Questi file di testo vengono creati eseguendo il seguente metodo (richiamato da una voce di menù):

WriteSetupString As Boolean

// Salvo le impostazioni della stampante

Dim f As FolderItem
Dim strOut As BinaryStream
Dim ps As New PrinterSetup

f = GetFolderItem("")

#If DebugBuild
  f = f.Parent
#EndIf

f = f.Child("PrinterSettings")

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 = BinaryStream.Create(f)
      strOut.Write(ps.SetupString)
      
      strOut.Close
      Return True
      Exit Function
    End If
  End If
End If

// Errore
Return False

Il file generato si chiama “PrinterSettings.txt” e viene creato nella sottocartella “PrinterSettings”: rinomino il file in base al tipo di stampante (per esempio per una stampante che utilizzo per stampare normagli fogli A4 chiamerò il file “PrinterSettings_A4.txt”).
Quando devo eseguire una stampa su A4, nel metodo che lancia il report inserirò il seguente codice:

Dim ps As New PrinterSetup

' ---------------------------------------------
// carico le impostazioni della stampante
Dim SetupString As String
SetupString = ReadSetupString("PrinterSettings_A4.txt")      
If SetupString <> "ERRORE" Then
  ps.SetupString = SetupString
End If
' ---------------------------------------------

Il metodo “ReadSetupString” è questo:

ReadSetupString(SettingsFile As String) As String
// carico le impostazioni

Dim f As FolderItem
Dim SetupString As String
'Dim strIn As TextInputStream
Dim strIn As BinaryStream


f = GetFolderItem("")

#If DebugBuild
  f = f.Parent
#EndIf

f = f.Child("PrinterSettings")

f = f.Child(SettingsFile)

If f <> Nil Then
  If f.Exists Then
    strIn = BinaryStream.Open(f, False)
    
    Do
      SetupString = SetupString + strIn.Read(255)
    Loop Until strIn.EOF
    
    strIn.Close
    Return SetupString
    Exit Function
  End If
End If

// errore
Return "ERRORE"

Spero che questo ti aiuti.

Buon lavoro.

Nedi

Ciao Nedi,

prima di tutto ti ringrazio per avermi risposto.

Siccome utilizzo un mac oggi ho provato il progetto di esempio su una macchina virtuale con windows 2008 e in ambiente windows funziona…

Il progettino a parte la scrittura/lettura su file che non ho implementato (salvo in una properties di tipo stringa) riporta tutte le istruzioni che hai usato tu nel tuo codice.

Che dire… funziona con il sistema operativo Windows ma non in macOS.

Grazie ancora e buon fine settimana

Andrea

In ambiente MacOS ti dà qualche errore? Perchè io ho scritto un paio di progetti per MacOS, e la tecnica che ho indicato funziona (l’unica variante è che i file PrinterSettings.txt non sono in una cartella a sè stante, ma sono nella stessa cartella dell’applicazione, per cui basta

f = GetFolderItem("")
f = f.Child("PrinterSettings_A4.txt")

In definitiva non devi usare f = f.Parent

In ambiente mac non da nessun errore…
Ho provato anche ad usare il codice che avevi messo nel post del 2018 quello in cui Antonio Rinaldi ti aveva instradato per trovare la soluzione al problema, gia in quel codice c’era il salvataggio della stringa (ps.SetupString) di setup in un file. Ma dopo il ripristino dei parametri di setup quando vai in stampa viene usata la stampante di default. (con windows si comporta correttamente)

Il codice che funziona è quello che ho postato, con la variante indicata nel mio ultimo post

Prova a farmi avere il progetto, così ci do un’occhiata

Ultima cosa: nel tuo progetto la property “impostazioni” dove l’hai definita?

Ciao Nedi,

scusa se non ti ho risposto prima ma ho avuto un weekend tormentato (bricolage estremo e giardinaggio)
Ti premetto che sto usando l’ultima versione di xojo e che ho provato anche con la pui vecchia installata (2019 r3.2).

Come faccio a mandati progetto… sul forum non si può allegare, ti posso mandare una email?

grazie
Andrea

Mandalo qui:
freguglia.nedi@gmail.com