la stampa viene gestita come se dovessi disegnare su una drawingarea
esempio:
public sub Button_stampa_click()
dim x as integer
dim y as integer
IF Printer.Setup() THEN RETURN 'fai apparire il modulo di conf. stampante
Draw.Begin(Printer) ' Initializes the draw
draw.LineWidth = 1
Draw.Foreground = Color.black
x=10
y=10
draw.rect(x, y, 400, 200)
draw.Font.Name = "Utopia"
draw.Font.size = 9
draw.Font.Italic = TRUE
Draw.Text("ciao a tutti", x , y)
Draw.end
END
Primo:
la stampa con Gambas è possibile solo usando il componente gb.qt perché l'oggetto Printer non è stato ancora implementato nel componente gb.gtk, per cui la tua applicazione deve per forza essere legata alle Qt.
Secondo:
armati di tanta pazienza perché questo è uno di quei casi in cui la documentazione di Gambas è più lacunosa.
Terzo:
sull'oggetto Printer stampi (o per meglio dire scrivi) con il metodo Draw(). Quindi sia la grafica che il testo lo devi inserire sul tuo documento come se stessi realizzando un disegno.
'-- inizializzo l'oggetto Printer
Printer.Copies = 1 '-- numero di copie
Printer.Name = Nome_stampante '-- nome della stampante di sistema (se ne hai una predefinita, non serve stabilirlo)
'-- inizi la generazione del documento
Draw.Begin(Printer) '-- lego l'oggetto Printer al metodo Draw
'-- colori primario e dello sfondo
Draw.Foreground = Color.Black
Draw.Background = color.White
'-- inserisco del testo
Draw.Font.Size = 12 '-- stabilisco la dimensione
Draw.Text(Stringa_da_stampare, 1200, 320) '-- coordinate relative al foglio dell'angolo in alto a SX da cui iniziare ad inserire il testo
'-- inserisco una linea
Draw.LineWidth = 4 '-- spessore
Draw.Line(300, 1600, 4650, 1600) '-- coordinate di inizio e fine espresse nella coppia X,Y
'-- inserisco un rettangolo
Draw.Rect(300, 1450, 4350, 400)
'-- inserisco una nuova pagina
Printer.NewPage()
'-- stampo il documento
Draw.End
Un mio personale consiglio è quello di non stampare mai direttamente verso la stampante ma utilizzare un file PostScript temporaneo in cui riversare il documento generato e poi stampare quel file con il comando di console lpr. Prima si dichiara un nuovo processo nella procedura di stampa:
E poi si aggiunge questo codice:
'-- al posto di Printer.Name
Printer.File = Application.Path & "/stampa.ps" '-- se vuoi stampare su file, metti qui il nome del file
(....... tutto come sopra......... )
'-- dopo Draw.End aggiungere:
hStampa = SHELL ("lpr " & Application.Path & "/stampa.ps") WAIT
Oppure, meglio ancora, si può invocare un visualizzatore di documenti per far vedere l'anteprima del documento:
hStampa = SHELL (Nome_Visualizzatore & Application.Path & "/stampa.ps" & " &")
Dove Nome_Visualizzatore può essere kghostview, evince, ecc...
potresti fare cosi:
for each rresult
testo =rresult!mio_campo
draw.text(testo,x,y)
y=y+15
next
in questo modo ti stampa un elenco di elementi del campo mio_campo
se i campi da stampare sono di piu di uno componi la variabile stringa come vuoi tu es:
testo=rresult!mio_campo_1 & " " & rresult!mio_campo_n
Volevo rendervi partecipi della mia gioia :-)
Seguendo i consigli di questo topic sono arrivato a stampare la mia prima fattura!
Sono contento come una pasqua!!! :-)
Ovviamente a guardarla fa pietà e anche un po' di pena, ma cavoli che soddisfazione!!
Adesso ho qualche dubbio amletico, che però temo di essermi già risolto da solo.
Per eseguire la stampa ho seguito i consigli all'inizio di questo topic, creando la stampa per prima su una Drawing Area di dimensioni 600x850 che corrispondono, all'incirca, a un foglio A4 a 75 dpi.
La domanda, alla quale temo di essermi già dato risposta, è: se decido di stampare a 300dpi, come faccio a modificare la stampa?
Ovviamente la risposta è: metti i posizionamenti parametrici e non assoluti.
Ad esempio, se ho una linea del tipo
draw.line(10, 10, 100, 100)
potrebbe diventare
dim X as integer 'Dimensione orizzontale
dim Y as integer 'Dimensione verticale
draw.line(X/75*10, Y/75*10, X/75*100, Y/75*100)
giusto?
Uhm, mi sa che ho scritto una cavolata...
dim res as integer 'Risoluzione su printer'
draw.line(res/75*10, res/75*10, res/75*100, res/75*100)
Decisamente meglio :-)
Fino a qui ci sono anche io,
for each rresult
testo =rresult!mio_campo
draw.text(testo,x,y)
y=y+15
next
Ho notato però nel caso di una Tabella con una grande quantità di dati, come fargli capire che deve continuare a stampare alla pagina successiva?
Io sono rimasto all'istruzione
Printer.NewPage()
e poi?
E poi devi rigenerare la struttura base della pagina e ricominciare con il contatore dal punto d'inizio, finché non hai stampato tutti gli elementi.
Ad esempio, potresti far così (in pseudocodice, riprendendo un po' il tuo esempio):
Y = valore_iniziale
Imposta_Pagina()
for each rresult
testo = rresult!mio_campo
draw.text(testo,x,y)
y=y+15
if y>valore_max then
printer.newpage()
Imposta_pagina()
Y = valore_iniziale
endif
next
Insomma, una roba del genere....
Io formatto tutto in valuta per cui ho sempre 2 decimali dopo la virgola, che siano una coppia di zeri oppure due cifre qualunque. Per allineare a destra usa
draw.Text(Stringa, X1, Y1, X2, Y2, Align.allineamento)
Su Align, premendo il punto, avrai le costanti utilizzabili.
Credo di aver applicato correttamente il tuo suggerimento, ma non riesco ad ottenere l'allineamento che mi serve, questa è la porzione di codice interessato:
FOR EACH xResult
Draw.Text(codice, x, y)
codice = xResult!cdart
Draw.Text(articolo, x + xinc1, y)
articolo = xResult!descrizione
Draw.Text(prezzo, x + 3000, y, Align.Right)
prezzo = Format(xResult!prezzo2, "#0.00")
NEXT
praticamente ottengo una stampa allineata così
io vorrei ottenere questo allineamento
Ruotato in verticale.
Quindi con questa istruzione non posso ottenere la "verticalità del testo"
draw.Text(Stringa, X1, Y1, X2, Y2, Align.allineamento)
ma trasformare il testo in immagine e gestirlo come tale, ho capito bene?