Autore Topic: [Risolto] Nuovo Passo --->> La stampa  (Letto 10510 volte)

Offline Picavbg

  • Senatore Gambero
  • ******
  • Post: 1.620
    • Mostra profilo
[Risolto] Nuovo Passo --->> La stampa
« il: 17 Dicembre 2011, 12:53:23 »
Ora che il mio ContabFam ha cominciato a compiere i suoi primi passi, è arrivato il momento di fargli stampare i movimenti giornalieri. Per fare questo, ho cominciato a leggere qualcosa e da quel poco che ho letto, mi pare di avere capito che G3 offra un metodo (Configure) che G2 non aveva. Se è veramente come ho capito, probabilmente, mi converrebbe sin da subito, passare a G3.
Alla suddetta prima perplessità se ne aggiungono però altre:
- devo tracciare una form per l'output di stampa?
- una stampante multifunzione(l'unica che posseggo io)  può essere riconosciuta come una monofunzione?
 ???
« Ultima modifica: 08 Marzo 2012, 18:29:54 da Picavbg »
:ciao:

Offline fsurfing

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.484
    • Mostra profilo
Re: Nuovo Passo --->> La stampa
« Risposta #1 il: 17 Dicembre 2011, 13:45:28 »
del riconoscimento della stampante se ne uccupa i  SO tu non te ne devi preoccupare.

se devi stampare una tabella ti allego il codice che uso in gesthotel per stamparle(usabile per gambas2), alla funzione passi direttamente l' oggetto gridview o tableview e la funzione si occupa di stamparla, inoltre puoipassare anche il titolo da dare alla stampa

Codice: [Seleziona]
PUBLIC SUB stampatabella(oggetto AS Object, intestazione AS String, OPTIONAL dimfont AS Integer)
 
  DIM larghezze AS NEW Integer[]
  DIM altezze AS NEW Integer[]
  DIM i, I1, TOTALE, bx, by, fw, fh, b, x, y, j AS Integer
  DIM testo AS String
   DIM temparray AS NEW Integer[]
 
 
  IF dimfont = NULL OR dimfont = 0 THEN
    dimfont = 9
  ENDIF
  bx = 150
  by = 150
  fw = 5000
  fh = 7000
  b = 15
 
  ' 'memorizzazione larghezze celle
  '
  ' FOR i = 0 TO oggetto.Columns.Count - 1
  '     larghezze.Add(oggetto.Columns[i].Width * 6)
  ' NEXT
  '
  ' 'memorizzazione altezze celle
  '
  ' FOR i = 0 TO oggetto.Rows.Count - 1
  '     altezze.Add(oggetto.rows[i].h * 6)
  ' NEXT
  ' IF oggetto.rows.Count > 0 THEN
  '
  ' Printer.Resolution = avvio.risoluzione
   IF Printer.Setup() THEN RETURN
               
                         Draw.Begin(Printer)
                           
                          Draw.Font.Size = dimfont
                        FOR i1 = 0 TO oggetto.Columns.Count - 1
                         temparray.Clear
                         temparray.Add(Draw.TextWidth(oggetto.Columns[i1].title) + 20)
                         FOR i = 0 TO oggetto.rows.count - 1
                             temparray.Add(Draw.TextWidth(oggetto[i, i1].Text) + 20)
                         NEXT
                         temparray.sort(gb.Ascent)
                         larghezze.Add(temparray[temparray.Max])
                        NEXT 
                         'memorizzazione altezze celle
                       
                         FOR i = 0 TO oggetto.Rows.Count - 1
                             altezze.Add(oggetto.rows[i].h * 6)
                         NEXT
                         IF oggetto.rows.Count > 0 THEN
                         WAIT
                         Printer.Resolution = avvio.risoluzione
                         
                         FOR i = 0 TO larghezze.Max
                           totale = larghezze[i] + totale
                         NEXT
                         totale = totale + 300
                         IF totale > Printer.Width THEN
                         
                             Printer.Orientation = 1
                             fh = 5000
                             fw = 7000
                         ELSE
                             Printer.Orientation = 0
                             fh = 7000
                             fw = 5000
                         ENDIF
 
       
                             'disegno bordo pagina
                            ' Draw.Rect(bx, by, fw - bx * 2, fh - by * 2)
                             
                             'disegno intestazione
                             
                             Draw.ForeColor = Color.Black
                             Draw.Font.Size = dimfont * 2
                             x = bx
                             y = by + b
                             Draw.Text(intestazione, x, y, fw, Draw.TextHeight(intestazione), 3)
                             
                             y = y + Draw.TextHeight(intestazione) + b * 3
                             x = bx + b
                             
                             Draw.Font.Size = dimfont
                             
                             'disegnointestazione tabella
                             FOR i = 0 TO larghezze.Max
                                 
                                 Draw.FillColor = 13024767
                                 Draw.FillStyle = 1
                                 Draw.Rect(x, y, larghezze[i], altezze[0] * 2)
                                 Draw.FillStyle = 0
                                     x = x + b
                                     Draw.Text(oggetto.Columns[i].Title, x, y, larghezze[i], altezze[0] * 2, 1)
                                     x = x + larghezze[i] - b
                             NEXT
                             y = y + altezze[0] * 2
                             
                             
                             'disegno celle
                             FOR i = 0 TO altezze.Max
                                 x = bx + b
                                 FOR j = 0 TO larghezze.Max
                                     Draw.Rect(x, y, larghezze[j], altezze[i])
                                     x = x + b
                                     Draw.Text(oggetto[i, j].Text, x, y, larghezze[j], altezze[i], 1)
                                     x = x + larghezze[j] - b
                                 NEXT
                                 y = y + altezze[i]
                                 IF y > fh - by * 2 - altezze[i] THEN ' cambio pagina
                                   Printer.NewPage()
                                   'Draw.Rect(bx, by, fw - bx * 2, fh - by * 2)
                                   y = by + b * 3
                                 ENDIF
                                   
                             NEXT
                             TRY Draw.Font.Size = dimfont - 1
                             testo = "Gesthotel Ver. " & Application.Version & " " & ("Report di stampa") & ",  Powered By fsurfing"
                             Draw.Text(testo, fw - Draw.TextWidth(testo) - bx, fh - Draw.TextHeight(testo) - by)
                             
                             
                         Draw.End
        ELSE
          Message.Info(("la tabella non contiene nessun elemento") & "!", "OK")
        ENDIF
 
END

Offline Picavbg

  • Senatore Gambero
  • ******
  • Post: 1.620
    • Mostra profilo
Re: Nuovo Passo --->> La stampa
« Risposta #2 il: 18 Dicembre 2011, 00:10:04 »
@ fsurfing
Io pensavo di creare un report di stampa che racchiudesse sia il dettaglio movimenti risultante dalla Form02, sia il riepilogo relativo a quadratura e resta di cassa visibile nella form03, come da esempi allegati.
Per fare ciò dalla tua risposta, capisco che devo creare un Form dove dovrei inserire sotto forma di gridview/tableview tutti i dati da stampare; dopo di che posso procedere alla stampa seguendo il tuo codice di esempio.  ;)
Ciò varrebbe sia per  G2 che per G3?
 :ciao: :ciao:
:ciao:

Offline Golia

  • Senatore Gambero
  • ******
  • Post: 1.298
  • no xe mai massa tardi
    • Mostra profilo
Re: Nuovo Passo --->> La stampa
« Risposta #3 il: 18 Dicembre 2011, 10:41:17 »
Ciao Picavbg.
Per le mie stampe uso esclusivamente e con soddisfazione PdfWriter di md9327, prova a dare un'occhiata a questo post, ci sono esempi sia per g2 che per g3. Casomai se hai bisogno non hai che da chiedere :2birre:

oops  :D il link http://www.gambas-it.org/smf/index.php?topic=1056.0
« Ultima modifica: 18 Dicembre 2011, 10:44:07 da Golia »

Offline Picavbg

  • Senatore Gambero
  • ******
  • Post: 1.620
    • Mostra profilo
Re: Nuovo Passo --->> La stampa
« Risposta #4 il: 21 Dicembre 2011, 15:57:18 »
@ Golia:
Ti ringrazio moltissimo per il tuo suggerimento, ma come faccio a richiamare pdfwriter internamente al programma che deve stampare?

@fsurfing:
volevo sbirciare sul tuo gesthotel per capire meglio l'utilizzo di certe funzioni che, leggendo il codice, non ho capito:
Es.:
  IF Printer.Setup() THEN RETURN               
  Printer.Resolution = avvio.risoluzione       dove e come é dichiarato l'oggetto Printer ?

Il codice è molto interessante e, non so come lo hai usato nel tuo programma, personalmente, penso che potrebbe costituire una classe dinamica a cui passare i parametri opportuni per costruire di volta in volta l'area di stampa da  riempire coi dati da stampare.
 :ciao:  :ciao:
:ciao:

Offline fsurfing

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.484
    • Mostra profilo
Re: Nuovo Passo --->> La stampa
« Risposta #5 il: 22 Dicembre 2011, 12:11:54 »
l ' oggetto printer è proprio di gambas 2
printer.setup fa apparire la finestra di configurazione
della stampante.
Su g3 l'utilizzo e leggermente differente, puoi guardarti gli esempi presenti in g3

in linea di massima stampare e come disegnare in una drawing area
io per semplicità uso quel codiceper stampare delle tabelle, cosi con un unica funzione faccio tutte le stampe.
In alternativa puoi usare pdf writer oppure crearti linea doppo linea la stampa

Offline Picavbg

  • Senatore Gambero
  • ******
  • Post: 1.620
    • Mostra profilo
Re: Nuovo Passo --->> La stampa
« Risposta #6 il: 09 Gennaio 2012, 18:29:45 »
Non so perchè, ma non riesco a compiere il primo approccio con la stampa. Ho realizzato una gridview dove ho ripotrtato tutte le righe da stampare. La mia pagina è dovrebbe rispettare il formato A5 e le righe impegnate nella gridview di stampa potrebbero superare la capacità di una pagina A5.
Non avendo alcuna dimestichezza, ho dato una sbirciatina al Wiki. --> "Guida ai report" per l'utilizzo di PdfWriter. Mi sembra di capire che l'utilizzo di PdfWriter, non comporta la preimpostazione di una Gridview o di una Tableview; infatti l'anteprima può essere fornita dall stesso PdfWriter. Perciò, sia per l'impaginazione automatica delle righe di stampa, sia per la non necessaria preimpostazione di una pagina dentro un'oggetto come  Gridview o Tableview, potrebbe essere assai pratico orientarmi su PdfWriter. Ho trovato il file corrispondente nell'area di Download, ma detta versione è valida per G3, G2 o entrambe? Ancora, PdfWriter permette di stampare nel formato A5?  ???
Ciao
:ciao:

Offline Golia

  • Senatore Gambero
  • ******
  • Post: 1.298
  • no xe mai massa tardi
    • Mostra profilo
Re: Nuovo Passo --->> La stampa
« Risposta #7 il: 09 Gennaio 2012, 22:59:20 »
Citazione
ma detta versione è valida per G3, G2 o entrambe
Mi sembra che non vada bene per g3, per G3 prova questo http://www.gambas-it.org/smf/index.php?action=dlattach;topic=1964.0;attach=1869, trovi anche vari esempi fatti da md, dex e io.
Qualche dritta, anche per chi non ha guardato il wiki come te  ;)
Per usare Pdfwriter devi abilitare i componenti gb.pdf e gb.compress.
Pdfwriter non manda direttamente dati in stampa, crea un file PDF, quindi sarà facile mandare il file in stampa o creare una visualisazione per fare un'anteprima. Nell'esempio del link c'è un form che fa da anteprima e invia il file alla stampante, puoi benissimo usarlo, l'ho fatto anch'io  :).
Per portare Pdfwriter nel tuo progetto devi copiarti le classi PdfWriter e PdfWriterFont, le "sottoclassi" di pdfwriter che vedi nell'esempio sono praticamente report, una per ogni report. Quindi per ogni tuo report dovrai crearti una classe simile, basta che ne copi una e poi l'adatti alle tue esigenze. Nella sottoclasse ci sono 3 importanti function, Header() Data() e Footer(), rispettivamente: Intestazione, corpo e piè di pagina.
Comunque guardati l'esempio, una volta capito è davvero facile creare i report.
Dimenticavo:
Citazione
PdfWriter permette di stampare nel formato A5?
Si, in tutti i formati, adirittura (lo trovi in un'altra discussione) puoi mettere mano alla classe e crearti un formato personalizzato, naturalmente, verticale e orrizontale.
Ciao


Offline Picavbg

  • Senatore Gambero
  • ******
  • Post: 1.620
    • Mostra profilo
Re: Nuovo Passo --->> La stampa
« Risposta #8 il: 10 Gennaio 2012, 00:05:11 »
Citazione
ma detta versione è valida per G3, G2 o entrambe
Mi sembra che non vada bene per g3, per G3 prova  questo, trovi anche vari esempi fatti da md, dex e io.
Ho capito: ho risposto troppo presto; avrei dovuto leggere piu a fondo il wiki  :-[ , però devo anche dirti che utilizzo ancora oggi G2.  Comunque non ho ancora deciso se impiegare nel mio programma PdfWriter.
 :ciao: :ciao:
:ciao:

Offline Golia

  • Senatore Gambero
  • ******
  • Post: 1.298
  • no xe mai massa tardi
    • Mostra profilo
Re: Nuovo Passo --->> La stampa
« Risposta #9 il: 10 Gennaio 2012, 11:34:06 »
Ok, se hai bisogno son quà, ciao  :ciao:  :2birre:

Offline Picavbg

  • Senatore Gambero
  • ******
  • Post: 1.620
    • Mostra profilo
Re: Nuovo Passo --->> La stampa
« Risposta #10 il: 10 Gennaio 2012, 16:45:16 »
PdfWriter o printer? E' un bel problema. Ho riletto la guida al PdfWriter del wiki, ma non ho trovato alcun riferimento  circa la sua esclusiva compatibilità con G2. Dovendo gestire un documento di stampa nell'ambiaente G2, mi pare di capire, che è indifferente utilizzare l'una o l'altra funzione, ma in ambiente G3, visto che PdfWriter è nato sotto G2, potrebbe non funzionare, perciò sembrerebbe più pratico l'uso di printer. Con esso infatti l'evoluzione verso G3 sarebbe meno dolorosa. Detto questo, è chiaro che sarei orientato ad utilizzare la funzione printer.
Dall'esempio fornitomi gentilmente da dfsurfing, noto che per la stampa viene richiamata una classe (stampatabella) alla quale vengonono passati alcuni parametri ed esattamente:
Codice: [Seleziona]
PUBLIC SUB stampatabella(oggetto AS Object, intestazione AS String, OPTIONAL dimfont AS Integer)
dove:
-  oggetto dovrebbe essere, nel mio caso, la gridview, contenente le righe di stampa
- intestazione è la stringa contenente la testata del documento
- dimfont dovrebbe contenere il valore corrispondente alla dimensione del carattere di stampa.

Se printer.setup come dice fsurfing,  fa apparire la finestra di configurazione della stampante, il dmfont non dovrebbe essere necessario, altrimenti, mancano,
secondo la mia modestissima logica altri parametri, come la dimensione del formato carta (A4, A5, ...), il set-caratteri da stampare (Arial, Monospace, Nimbus Roman, ...), nonchè lo stile di stampa(Normal, Italic, Bold, Bold-Italic). Vedo poi che le coordinate di iniziio stampa sono stabilite dalla classe di stampa, come pure il n° massimo di righe da stampare in ciascuna pagina.
Ahiahi, comincia a girarmi la testa  :rolleyes:
 :ciao: :ciao:
:ciao:

Offline fsurfing

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.484
    • Mostra profilo
Re: Nuovo Passo --->> La stampa
« Risposta #11 il: 10 Gennaio 2012, 18:05:35 »
forse non ci siamo capiti.

con print non è che devi per forza crearti una tabella per stampare, io ti ho solo fornito un pezzo di codice che io utilizzo per stampare l etabelle, visto che nel mio programma utilizzo moltissime viste a tabella e un codice del genere mi permette di stanparle tutte con un unica funzione.

logicamente printer.setup fa apparire la pagina di setup della stampante , percui ogni altro settaggio inserito dopo è un sovrappiù messo da me per i miei fini , e quindi non necessario.

se devi stampare altre cose questo codice non ti sarà utile e dovrai costruirti a manina la stampa.

con pdfwriter teoricamente il lavoro potrebbe essere più semplice (io ad esempio trovo più semplice usare printer perchè mi sono abituato così:) ) o più difficile.

anche con printer il passo a g3 potrebbe essere non del tutto indolore.

come vedi dall' esempio in g2 si stampa direttamente come e quando vuoi con draw.begin e draw.end
in g3 invece devi inizializzare la stampante , far apparire il form di setup e poi il codice di stampa è all' interno della funzione nome_oggetto_printer_draw()
inoltre non usi + draw.begin ecc ecc ma si usa paint.text ecc ecc .
forse può anche essere che il metodo draw funzioni anche in g3 ma non ho ancora trovato.
se guardi nella sezione di g3 qualche giorno fa ho postato un esempio di stampa in g3 con printer

Offline Golia

  • Senatore Gambero
  • ******
  • Post: 1.298
  • no xe mai massa tardi
    • Mostra profilo
Re: Nuovo Passo --->> La stampa
« Risposta #12 il: 10 Gennaio 2012, 18:33:18 »
Citazione
PdfWriter o printer? E' un bel problema. Ho riletto la guida al PdfWriter del wiki, ma non ho trovato alcun riferimento  circa la sua esclusiva compatibilità con G2. Dovendo gestire un documento di stampa nell'ambiaente G2, mi pare di capire, che è indifferente utilizzare l'una o l'altra funzione, ma in ambiente G3, visto che PdfWriter è nato sotto G2, potrebbe non funzionare, perciò sembrerebbe più pratico l'uso di printer. Con esso infatti l'evoluzione verso G3 sarebbe meno dolorosa.
PdfWriter per G2 lo trovi in questa discussione http://www.gambas-it.org/smf/index.php?topic=1056.0
PdfWriter è una classe, avrebbe dovuto funzionare sia per G2 che per G3, ma evidentemente Bennoit ha cambiato qualcosa  :).
Per portare i report da G2 a G3 o viceversa non ci sono problemi, basta sostituire SOLO la classe PdfWriter, già collaudato  ;) con il mio programma, per la conversione ho sostituito solo quel file.
Citazione
con pdfwriter teoricamente il lavoro potrebbe essere più semplice (io ad esempio trovo più semplice usare printer perchè mi sono abituato così:) ) o più difficile.
E' giusto quello che dice fsurfing, vedi te quello che va più incontro alle tue esigenze o al tuo sistema di programmare, entrambi (almeno credo  :-[) possono soddisfare i report più esigenti.
Ciao

Offline Picavbg

  • Senatore Gambero
  • ******
  • Post: 1.620
    • Mostra profilo
Re: Nuovo Passo --->> La stampa
« Risposta #13 il: 12 Gennaio 2012, 18:52:50 »
Premesso che lo strumento scelto per ora è printer, In effetti, devo dire che non ho chiaro come avviare la stampa. Per comodità ho creato una sorta di anteprima costruendo una gridview dove ho valorizzato tutte le righe necessarie per la stampa finale. Ora dovrei prelevare ciascuna riga ed, al suo interno, ciascuna cella.
Ho seguito, per capire, il codice-esempio di fsurfing ed ho cercato di realizzare qualcosa che gli somigli; tuttavia, il primo approccio è sempre quello più difficile, per cui ho incontrato subito le inevitabili difficoltà. Per avviare la  stampa richiamo una la classe Report1 alla quale vorrei passare l'oggetto GridStamp, cioè la mia gridview piena di tutte le informazioni da stampare, però non ne sono stato capace:
Codice: [Seleziona]
PUBLIC SUB PulSTampaClk_Mio()
DIM DocuMovvGG AS Report1
'---------------------------------
  DocuMovvGG = NEW Report1(GridStamp.Object)
END
Ottengo il seguente errore:
Citazione
Unknown symbol 'Object' in class 'Gridview'
.
 ???
Posso passare tutta la gridview o devo valorizzare una tabella specifica coi dati presenti nella gridview?
 :(
:ciao:

Offline fsurfing

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.484
    • Mostra profilo
Re: Nuovo Passo --->> La stampa
« Risposta #14 il: 12 Gennaio 2012, 19:10:36 »
devi passare tutto l' oggetto, overo gridstamp,non gridstamp.object

poi inizi a scorrere con un ciclo la tabella cella per cella e la ricostruisci nel metodo draw
« Ultima modifica: 12 Gennaio 2012, 19:12:18 da fsurfing »