Gambas-it

Archivi (sola lettura) => Programmazione (Gambas 2) => Topic aperto da: tornu - 03 Marzo 2008, 20:35:12

Titolo: Stampare con Gambas.
Inserito da: tornu - 03 Marzo 2008, 20:35:12
Non ho nessuna idea di come Gambas gestisce le stampe, ho reperito poca documentazione in giro che non mi ha dato nessun spunto.In particolare a me servirebbe un esempio o più di uno su cui lavorare del tipo:
poter stampare un elenco ordinato con vari criteri dei record del mio DB,
stampare documenti tipo fatture,stampa di codici a barre EAN13, mi piacerebbe anche capire come formattare i caratteri, disegnare fincature, ecc...
Qualsiasi indicazione, consiglio o esempio e bene accetto.
Titolo: Re: Stampare con Gambas.
Inserito da: fsurfing - 03 Marzo 2008, 23:31:48
la stampa viene gestita come se dovessi disegnare su una drawingarea



esempio:

Codice: [Seleziona]

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

Titolo: Re: Stampare con Gambas.
Inserito da: leo72 - 03 Marzo 2008, 23:38:40
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.

Codice: [Seleziona]

'-- 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:
Codice: [Seleziona]

DIM hStampa as Process


E poi si aggiunge questo codice:
Codice: [Seleziona]

'-- 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:
Codice: [Seleziona]

hStampa = SHELL (Nome_Visualizzatore & Application.Path & "/stampa.ps" & " &")


Dove Nome_Visualizzatore può essere kghostview, evince, ecc...
Titolo: Re: Stampare con Gambas.
Inserito da: tornu - 04 Marzo 2008, 13:39:33
Grazie per gli esempi e le indicazioni su cui cercherò di applicarmi.
Non mi ero accorto che negli esempi inclusi in Gambas c'è DataReportExample che implementa alcune funzioni tra cui il preview, che a me servirebbero, dando uno sguardo al codice ho notato (se non dico fesserie) che viene creato un file con all'interno del codice html che aggancia i dati direttamente dal DB, ho interpretato bene? Qualche delucidazione su questo esempio?

Sul mio precedente post vi ho chiesto qualche indicazione per la creazione e stampa dei codici a barre EAN13, qualcuno ha avuto esperienze in merito?
Titolo: Re: Stampare con Gambas.
Inserito da: leo72 - 05 Marzo 2008, 07:06:11
Io personalmente no.
Però se cerchi esempi per VB penso che tu possa adattarli a Gambas: bene o male, si tratta di disegnare delle linee di un determinato spessore. Il codice per disegnare le linee ce l'hai, adesso ti manca quello per stabilirne lo spessore  :oops:
Titolo: Re: Stampare con Gambas.
Inserito da: md9327 - 06 Marzo 2008, 00:08:39
Tempo fà ho fatto un porting in Gambas della libreria FPDF, originariamente scritta per PHP. La puoi trovare su:

http://sourceforge.net/projects/pdfwriter/

Con questa libreria puoi crearti file pdf, con disegni, scritte, liste, ecc. nei formati più diversi; a questo punto inviare il tutto alla stampante non è più un problema.
Inoltre, faccio pubblicità... :-) , nelle ultime versioni del programma pgDesigner, ho incluso la libreria e ho creato alcune funzioni e classi per gestire la stampa dei progetti. Puoi dargli un'occhiata e prendere quello che ti serve come spunto.

pgDesigner lo puoi trovare sempre su:

http://sourceforge.net/projects/pgdesigner/

Tutte e due i progetti sono open-source e scritti interamente in Gambas.

Per il webmaster:
se puoi, includi questi due link al sito; ho fatto un mucchio di esperimenti con questi due programmi, e credo sia logico pubblicizzarli per aiutare a comprendere Gambas.
Titolo: Re: Stampare con Gambas.
Inserito da: leo72 - 06 Marzo 2008, 07:52:57
Il sito non ha una sezione link, per cui ho inserito i collegamenti all'interno dell'area download: ho però precisato che i collegamenti portano a pagine esterne. Dimmi anche tu se una soluzione del genere è accettabile.
Titolo: Re: Stampare con Gambas.
Inserito da: tornu - 06 Marzo 2008, 21:32:11
Grazie md9327 per i link, li proverò appena ho un attimo di tempo insieme alle altre indicazioni che mi hanno dato leo e gamberetto.
Chiunque abbia suggerimenti o esempi li posti, penso che sia un'aspetto (la stampa) su Gambas che interessi a tanti.
Titolo: Re: Stampare con Gambas.
Inserito da: tornu - 06 Marzo 2008, 23:09:47
@md9327:
ho scaricato pdfwriter che dalla prima occhiata penso che risolva alcune mie esigenze, ho incluso la libreria nel mio progetto ho compilato ma mi riporta il seguente errore:

Unknown identifier: SpinBox1
alla linea 34 in FMain1.class

presumo che ci sia qualche componente da attivare, ma quale?
Titolo: Re: Stampare con Gambas.
Inserito da: md9327 - 07 Marzo 2008, 00:22:23
Per tornu
Nella libreria non c'è alcun riferimento ad oggetti del tipo form, spinbox, ecc... Probabilmente ha fatto qualcosa di errato nella tua parte di codice, controlla bene.

Per il webmaster:
In effetti, a suo tempo, mi avevi indicato come probabile alternativa la pubblicazione degli aggiornamenti in parallelo; purtroppo me ne sono dimenticato e provvederò nel futuro. Per quanto riguarda i link, non sò, per me non ci sono problemi; potrei anche postare gli aggiornamenti su questo sito, se hai spazio a sufficienza, e in questo caso dovrei prevedere un doppio trasferimento su due diversi siti (questo e sf.net)...
Boh!?! Dimmi tu, non sarebbe neanche un problema, almeno da parte mia, devo solo ricordarmelo e prendere il via; posso anche postarti subito l'ultimissima versione di qualche giorno fà, ma ricorda che sono circa 16/17 mega di file compressi (RPM compresi) per ogni release.

Fammi sapere, anche via email.

Ciao
Titolo: Re: Stampare con Gambas.
Inserito da: leo72 - 07 Marzo 2008, 07:06:13
Lo spazio non è un problema, così come la banda: sono illimitati entrambi ;-)
Titolo: Re: Stampare con Gambas.
Inserito da: md9327 - 07 Marzo 2008, 10:35:17
Va bene, allora invierò il programma anche qui.
Appena ho un attimino di tempo, ora sono l lavoro, invio l'ultima versione.

Ciao
Titolo: Re: Stampare con Gambas.
Inserito da: tornu - 07 Marzo 2008, 23:02:42
Allora non ho capito come usarlo.
md9327 mi potresti spiegare dopo che ho estratto il pacchetto come importare la libreria all'interno di un progetto. Grazie
Titolo: Re: Stampare con Gambas.
Inserito da: robertozr - 08 Marzo 2008, 17:27:21
buon giorno a tutti,quesito ?
come si puo agganciare all'istruzione draw.text il result di una tabella
con piu campi.
es. draw.text(rresult............
Titolo: Re: Stampare con Gambas.
Inserito da: fsurfing - 08 Marzo 2008, 18:16:22
potresti fare cosi:

Codice: [Seleziona]

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
Titolo: Re: Stampare con Gambas.
Inserito da: fsurfing - 08 Marzo 2008, 18:20:42
se i campi da stampare sono di piu di uno componi la variabile stringa come vuoi tu es:

Codice: [Seleziona]



testo=rresult!mio_campo_1 & " " & rresult!mio_campo_n

Titolo: Re: Stampare con Gambas.
Inserito da: tornu - 08 Marzo 2008, 21:30:34
Citazione

leo72 ha scritto:

Codice: [Seleziona]

'-- 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



Cerco di applicare le tue indicazioni ma trovo sempre qualche difficoltà (mea culpa) mi da questo messaggio:

Unknown identifier: Printer

  :-?  :-?
Titolo: Re: Stampare con Gambas.
Inserito da: Pixel - 08 Marzo 2008, 23:23:44
Controlla se nel tuo progetto è presente il componente gb.qt se non c'è mettilo.
Ciao
Titolo: Re: Stampare con Gambas.
Inserito da: tornu - 08 Marzo 2008, 23:50:38
Citazione

pixel ha scritto:
Controlla se nel tuo progetto è presente il componente gb.qt se non c'è mettilo.
Ciao


Grazie pixel, gb.qt era presente mancava gb.qt.ext
Ciao
Titolo: Re: Stampare con Gambas.
Inserito da: md9327 - 10 Marzo 2008, 17:47:26
Per tornu

L'inclusione della libreria è semplicissimo, dato che è scritta interamente in gambas, devi solo includerla tra i sorgenti del tuo programma. Per poterla utilizzare, devi solo crearti degli oggetti personalizzati che sono INHERITS di questa libreria, e utilizzare i metodi "header" e "footer" per poterci scrivere le tue personalizzazioni, ovviamente sulla TUA classe...
Per l'utilizzo, se non ricordo male dato che l'ho messa su sf.net un pò di tempo fà, e se non me lo sono dimenticato, nel file compresso è incluso anche un esempio.
Titolo: Re: Stampare con Gambas.
Inserito da: tornu - 10 Marzo 2008, 23:27:17
Purtroppo l'esempio non c'è, se per caso te lo ritrovassi potresti postarlo?
In caso contrario un nuovo esempio per darmi lo spunto per poter applicare la libreria?
Titolo: Re: Stampare con Gambas.
Inserito da: md9327 - 11 Marzo 2008, 01:44:28
Strano ??? Ero convinto di si, ad ogni modo verifico e, comunque ti invio l'esempio.
Titolo: Re: Stampare con Gambas.
Inserito da: tornu - 11 Marzo 2008, 15:34:31
L'esempio era presente, mea culpa, ti ringrazio comunque per la sollecitudine.
Ciao
Titolo: Re: Stampare con Gambas.
Inserito da: md9327 - 11 Marzo 2008, 21:31:19
Nessun problema...

Se ti leggi il modulo di test, vedrai che ho fatto varie prove utilizzando un pò tutte le caratteristiche della libreria.
Se trovi qualcosa di errato, fammelo sapere!

Ciao
Titolo: Re: Stampare con Gambas.
Inserito da: robertozr - 15 Marzo 2008, 18:56:06
Citazione

fsurfing ha scritto:
potresti fare cosi:

Codice: [Seleziona]

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


Buona sera e grazie per la risposta,tutto ok vorrei sapere se possibile
l'unita di misura delle coordinate e degli oggetti ( rettangolo ecc.)
Titolo: Re: Stampare con Gambas.
Inserito da: fsurfing - 15 Marzo 2008, 19:08:48
essendo delle funzioni di disegno si tratta di pixel :-)
Titolo: Re: Stampare con Gambas.
Inserito da: md9327 - 16 Marzo 2008, 03:26:30
Non proprio... Se guardi il sorgente, nella creazione della classe, ti trovi dei controlli relative alla misura adottata, che tra l'altro si passa nel secondo parametro:

  SELECT CASE Lower(unit)
  CASE "pt"
    $k = 1
  CASE "mm"
    $k = 72 / 25.4
  CASE "cm"
    $k = 72 / 2.54
  CASE "in"
    $k = 72
  DEFAULT
    Error.Raise("Incorrect unit: " & unit)
  END SELECT

dove:
"pt" = punti
"mm" = millimetri
"cm" = centimetri
"in" = inches
Titolo: Re: Stampare con Gambas.
Inserito da: fsurfing - 16 Marzo 2008, 11:10:36
per md9327

forse robertozr si riferiva all' unità di misura utilizzata in gambas nelle funzioni di stampa o disegno che se non sbaglio possono essere solo  pixel. :-)
Titolo: Re: Stampare con Gambas.
Inserito da: md9327 - 17 Marzo 2008, 02:19:24
Ops... Probabilmente è vero, chiedo venia.

Ad ogni modo in Gambas le misure sono ovviamente in pixel; se provi a fare una PRINT delle proprietà dell'oggetto Desktop, vedrai che corrispondono alle dimensioni del tuo schermo allo stato attuale (es. 1024x768).
Se ci pensi bene, quali altre misure potrebbe prendere in considerazione, a meno di non fare algoritmi di conversione ? Lo schermo è formato da punti, quindi pixel; se poi si parla di altri device, allora il discorso cambia, come ad esempio una stampante.

Comunque, e questo non è un rimprovero bensì un consiglio, leggiamo la documentazione su web!

Ciao
Titolo: Re: Stampare con Gambas.
Inserito da: Mario - 07 Luglio 2008, 16:59:45
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

Codice: [Seleziona]

draw.line(10, 10, 100, 100)


potrebbe diventare

Codice: [Seleziona]

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?
Titolo: Re: Stampare con Gambas.
Inserito da: Mario - 07 Luglio 2008, 17:55:55
Uhm, mi sa che ho scritto una cavolata...

Codice: [Seleziona]

dim res as integer   'Risoluzione su printer'

draw.line(res/75*10, res/75*10, res/75*100, res/75*100)


Decisamente meglio :-)
Titolo: Re: Stampare con Gambas.
Inserito da: giuseppe249 - 22 Marzo 2009, 22:46:46
Fino a qui ci sono anche io,

Codice: [Seleziona]
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?
Titolo: Re: Stampare con Gambas.
Inserito da: leo72 - 22 Marzo 2009, 23:58:41
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):
Codice: [Seleziona]

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....
Titolo: Re: Stampare con Gambas.
Inserito da: tornu - 13 Maggio 2009, 00:26:50
Come si fa ad allineare a destra la stampa del dato contenuto da "testo" se sono cifre con decimali?

Citazione

leo72 ha scritto:
Codice: [Seleziona]

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

Titolo: Re: Stampare con Gambas.
Inserito da: leo72 - 13 Maggio 2009, 01:09:58
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
Codice: [Seleziona]

draw.Text(Stringa, X1, Y1, X2, Y2, Align.allineamento)


Su Align, premendo il punto, avrai le costanti utilizzabili.
Titolo: Re: Stampare con Gambas.
Inserito da: tornu - 13 Maggio 2009, 16:32:59
Credo di aver applicato correttamente il tuo suggerimento, ma non riesco ad ottenere l'allineamento che mi serve, questa è la porzione di codice interessato:
Codice: [Seleziona]

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ì
Codice: [Seleziona]

10,50
25,00
4,50


io vorrei ottenere questo allineamento
Codice: [Seleziona]

10,50
25,00
 4,50
Titolo: Re: Stampare con Gambas.
Inserito da: fsurfing - 13 Maggio 2009, 16:57:53
non vorrei dire una fregnaccia ma a me pare che per utilizzare correttamente l' allineamento bisogna anche indicare la larghezza e l' altezza del rettangolo dove si vuole scrivere il testo altrimenti come fa gambas a capire rispetto a cosa allineare il testo?



altrimenti una soluzione alternativa e di calcolare la larghezza del testo

con  draw.font.whidth  e indicare dove stampare poi il testo di conseguenza
Titolo: Re: Stampare con Gambas.
Inserito da: md9327 - 13 Maggio 2009, 19:47:10
Infatti, la tua affermazione è corretta!
Titolo: Re: Stampare con Gambas.
Inserito da: leo72 - 14 Maggio 2009, 00:23:36
Infatti, io ho specificato X1,Y1 e X2,Y2.
Se non si crea il rettangolo testuale, l'oggetto non sa esattamente quanto è larga l'area e quindi non fa ciò che deve riguardo all'allineamento.
Titolo: Re: Stampare con Gambas.
Inserito da: tornu - 14 Maggio 2009, 20:42:21
:nulla:  ... ok ho capito  :leggere:  con più attenzione.
Grazie
Titolo: Re: Stampare con Gambas.
Inserito da: md9327 - 16 Maggio 2009, 13:23:13
E farai bene, altrimenti frustate sui "diti" dei piedi... :-)
Titolo: Re: Stampare con Gambas.
Inserito da: tornu - 10 Giugno 2009, 23:00:55
E se volessi stampare testo in verticale ?

Draw.Text("Testo", ???, ???)

P.S.: Spero di non beccare altre frustate sui "diti"....
Titolo: Re: Stampare con Gambas.
Inserito da: leo72 - 11 Giugno 2009, 00:17:54
In verticale intendi sviluppato in verticale o proprio ruotato in verticale?
Nel primo caso potresti creare un'area più alta che larga e poi mettere il testo con un sacco di ritorno a capo dopo ogni lettera:

Testo = "P\nr\no\nv\na"

Risultato:
Codice: [Seleziona]

P
R
O
V
A


Nel secondo credo tu debba usare un'immagine preparata in anticipo e poi ruotata.
Titolo: Re: Stampare con Gambas.
Inserito da: tornu - 11 Giugno 2009, 21:10:03
Ruotato in verticale.

Quindi con questa istruzione non posso ottenere la "verticalità del testo"
Codice: [Seleziona]
draw.Text(Stringa, X1, Y1, X2, Y2, Align.allineamento)


ma trasformare il testo in immagine e gestirlo come tale, ho capito bene?
Titolo: Re: Stampare con Gambas.
Inserito da: fsurfing - 11 Giugno 2009, 21:24:15
esatto , dovresti prima creare una picture con il testo e poi ruotarla,

unico problema è che la creaziona della picture devi farla prima di iniziare a stampare altrimenti otterresti un errore
Titolo: Re: Stampare con Gambas.
Inserito da: tornu - 11 Giugno 2009, 23:56:22
Un esempio?
Titolo: Re: Stampare con Gambas.
Inserito da: vuott - 12 Gennaio 2012, 02:37:39
Un esempio?

Potresti crearti un file immagine con sfondo trasparente, e successivamente effettuare l'inserimento del testo e - quindi - la rotazione a specchio dell'immagine:

http://www.gambas-it.org/smf/index.php?topic=1977.msg21866#msg21866



Riguardo alla questione della stampa con Gambas riporto di seguito per i futuri lettori la seguente discussione:

http://www.gambas-it.org/smf/index.php?topic=1348.0