Autore Topic: Stampare con gambas3  (Letto 1699 volte)

Offline aulin

  • Gambero
  • **
  • Post: 83
    • Mostra profilo
Stampare con gambas3
« il: 19 Settembre 2014, 17:35:10 »
Rieccomi a riutilizzare il gambero3. Sono andato in panne con la stampa. Vorrei evitare report. C'è qualche anima pia che mi posterebbe un codice funzionante di una stampa di una tabella che stampi più di una pagina? Il problema è ovviamente la gestione del NewPage. Ho un db con 150 record. Come fare?

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.720
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Stampare con gambas3
« Risposta #1 il: 19 Settembre 2014, 18:30:42 »
...che stampi più di una pagina? Il problema è ovviamente la gestione del NewPage.
Per la questione della stampa - in via generale - di due o più pagine, ti segnalo questo paragrafo di una pagina della nostra WIKI:

http://www.gambas-it.org/wiki/index.php?title=Printer#Stampare_pi.C3.B9_pagine
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline aulin

  • Gambero
  • **
  • Post: 83
    • Mostra profilo
Re: Stampare con gambas3
« Risposta #2 il: 19 Settembre 2014, 22:24:58 »
Grazie vuott del consiglio ma avevo già letto. Il problema risiede nel fatto della conoscenza del numero di pagine. In realtà una mezza soluzione, peraltro poco convincente, l'ho trovata gestendo un contatore di righe da stampare per ogni pagina. Vale a dire. Supponendo di dover stampare 150 elementi trovate il numero di pagine da stampare con result.count/25 +1. Successivamente durante la stampa dei record gestire il numero di righe stampate per la pagina e un altro contatore che mi serve per tener conto dei record già stampati quando ricomincia una nuova pagina. Ottengo il salto pagina scrivendo oltre il margine inferiore. Ma questa gestione mi sembra così arzigogolata. Il NewPage del gambas2 era talmente semplice. Per questo chiedevo un esempio per vedere una soluzione migliore.

Offline aulin

  • Gambero
  • **
  • Post: 83
    • Mostra profilo
Re: Stampare con gambas3
« Risposta #3 il: 20 Settembre 2014, 15:44:10 »
Codice: [Seleziona]

Private hRecLetto As Result
Private NumPag As Integer

Public Sub btn_stampa_Click()
Dim sTabella, sSQL As String

    M1.ConnettiDB()
       
    sTabella = M1.sPrefix & "servizi"
   
    sSQL = "SELECT serv_id,serv_sigla,serv_descrizione FROM " & sTabella
    hRecLetto = M1.$hConn.Exec(sSQL)
    NumPag = Int(hRecLetto.Count / 25) + 1
 
 With Printer1
   .Configure          ' opzionale - apre la finestra di dialogo se si vogliono reimpostare tutte le proprietà della stampante
   .Orientation = 0    ' opzionale - (oppure: Printer1.Portrait) imposta la modalità di stampa "Verticale" (oppure "Orizzontale").
   .Paper = 2          ' opzionale - imposta il tipo di carta ( 2 = A4)
   .OutputFile = Application.Path & "/stampe/rep_servizi.pdf"
   .Resolution = 300   ' opzionale - imposta la risoluzione di stampa (in DPI), per ottenere il risultato simile a quello che si vede sul monitor
   .Print              ' effettua la stampa su foglio
 End With

'Print Application.Path & "/stampe/rep_servizi.pdf"


End


Public Sub Printer1_Begin()
Dim NumRec As Integer

 Printer1.Count = NumPag
 
End


Public Sub Printer1_Draw()   ' Questo evento è richiamato per ogni pagina da stampare.
Dim sRiga As String
Dim NumRiga, PosY As Integer

' In questa routine saranno presenti le informazioni di ciò che si andrà a stampare.
   
With Paint

' volendo si può impostare la dimensione del font:
 .Font.Size = 14

' il testo sarà allineato al quadrilatero "virtuale" posto alle coordinate X, Y e di dimensioni W, H:
  sRiga = "Comune di Prova"
 .DrawText(sRiga, 100, 50, 2000, 500)

' Ma si potrà anche eliminare il riferimento a quelle dimensioni:
  sRiga = " ELENCO SERVIZI DISPONIBILI"
 .DrawText(sRiga, 800, 200)

        PosY = 250
       .DrawText("Cod", 100, PosY)
       .DrawText("Sigla", 250, PosY)
       .DrawText("Descrizione servizio", 500, PosY)
   
  NumRiga = 0
 
  For Each hRecLetto
   
        NumRiga = NumRiga + 1
        PosY = 300 + NumRIga * 70
        sRiga = Format$(hRecLetto!serv_id, "##,##0")
        .DrawText(sRiga, 100, PosY)
        .DrawText(hRecLetto!serv_sigla, 250, PosY)
        .DrawText(hRecLetto!serv_descrizione, 500, PosY)
   
        If NumRiga = 26 Then
           .DrawText(". ", 100, 3000)
          '
           NumRiga = 0
        Endif
  Next

End With

End


Alla luce di quanto letto ho scritto questo che sembra funzionare salvo il fatto che scrive la 2 pagina uguale alla prima. Suggerimenti?

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.720
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Stampare con gambas3
« Risposta #4 il: 20 Settembre 2014, 18:39:43 »
....sembra funzionare salvo il fatto che scrive la 2 pagina uguale alla prima. Suggerimenti?
...prova a fare una verifica facendo scorrere il codice "passo-passo".
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline aulin

  • Gambero
  • **
  • Post: 83
    • Mostra profilo
Re: Stampare con gambas3
« Risposta #5 il: 20 Settembre 2014, 20:29:52 »
Codice: [Seleziona]

Private hRecLetto As Result
Private hRecStampa As Result
Private NumPag As Integer
Private PagineStampate As Integer

Public Sub Form_Open()
Dim sTabella, sSQL As String
Dim RecPag As Integer


    M1.ConnettiDB()
       
    sTabella = M1.sPrefix & "servizi"
   
    sSQL = "SELECT serv_id,serv_sigla,serv_descrizione FROM " & sTabella
    hRecLetto = M1.$hConn.Exec(sSQL)
    RecPag = 25
    NumPag = Int(hRecLetto.Count / RecPag) + 1
    PagineStampate = 0
 
 With Printer1
   .Configure          ' opzionale - apre la finestra di dialogo se si vogliono reimpostare tutte le proprietà della stampante
   .Orientation = 0    ' opzionale - (oppure: Printer1.Portrait) imposta la modalità di stampa "Verticale" (oppure "Orizzontale").
   .Paper = 2          ' opzionale - imposta il tipo di carta ( 2 = A4)
   .OutputFile = Application.Path & "/stampe/rep_servizi.pdf" ' se si vuole stampare un file pdf
   .Resolution = 300   ' opzionale - imposta la risoluzione di stampa (in DPI), per ottenere il risultato simile a quello che si vede sul monitor
   .Print              ' effettua la stampa su foglio
 End With

End

Public Sub Printer1_Begin()

 Printer1.Count = NumPag
 
End


Public Sub Printer1_Draw()   ' Questo evento è richiamato per ogni pagina da stampare.
Dim sRiga As String
Dim NumRiga, PosY, NumRecLetti As Integer
Dim vero As Boolean

With Paint

' volendo si può impostare la dimensione del font:
 .Font.Size = 12

' si può anche ruotare il contenuto, che sarà stampato, degli oggetti (in questo caso di 45°).
' (Se si intende usare i radianti, sarà: .Rotate(Pi(0.25)). )
 '.Rotate(45)
 
' Si può anche impostare il colore del testo: in questo caso a blu scuro.
' Se si intende usare il codice, sarà in esad. ad esempio: = Paint.Color(&H001F007F); ' in decimale: = Paint.Color(2031743) .
 .Brush = Paint.Color(Color.DarkBlue)

' il testo sarà allineato al quadrilatero "virtuale" posto alle coordinate X, Y e di dimensioni W, H:
  sRiga = "Comune di Prova"
  .DrawText(sRiga, 100, 50, 2000, 500)
   
' Ma si potrà anche eliminare il riferimento a quelle dimensioni:
  sRiga = " ELENCO SERVIZI DISPONIBILI"
 .DrawText(sRiga, 800, 200)

        PosY = 250
       .DrawText("Cod", 100, PosY)
       .DrawText("Sigla", 300, PosY)
       .DrawText("Descrizione servizio", 600, PosY)
   

  NumRiga = 0
  NumRecLetti = 0
 For Each hRecLetto
   
       
        NumRecLetti = NumRecLetti + 1
       
        If NumRecLetti > PagineStampate * 26 Then
           NumRiga = NumRiga + 1
           PosY = 300 + NumRIga * 70
           sRiga = Format$(hRecLetto!serv_id, "0000")
          .DrawText(sRiga, 100, PosY)
          .DrawText(hRecLetto!serv_sigla, 300, PosY)
          .DrawText(hRecLetto!serv_descrizione, 600, PosY)
       
        Endif
       
       
        If NumRiga = 26 Then
            PagineStampate = PagineStampate + 1
            Return
        Endif
     
  Next
End With

End


Cosi' funziona. Ma mi rifiuto di pensare che deve essere così complicato. Tanto valeva lasciare il printer.NewPage come in Gambas2. O mi sfugge qualcosa?

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.720
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Stampare con gambas3
« Risposta #6 il: 20 Settembre 2014, 21:35:24 »
Analizzare quello spezzone di codice, così complesso, per vedere dov'è l'eventuale problema, non è semplice.  :rolleyes:
Ti suggerisco di procedere dal semplice al complesso: fare una parte mooolto semplificata, con la quali effettui la stampa; e poi ci aggiungi le cose.
Insomma, una scrittura controllata per gradi.   :-\
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline aulin

  • Gambero
  • **
  • Post: 83
    • Mostra profilo
Re: Stampare con gambas3
« Risposta #7 il: 20 Settembre 2014, 23:33:47 »
Non vorrei tediare nessuno però il problema resta e a mio avviso(spero di sbagliare) è il seguente. Se l'evento _draw è quello che si occupa della stampa a questa routine passo il Result da stampare. Considerando che voglio stampare solo 25 elementi per pagina, quando ne ho stampati 25 esco da questo evento. Siccome ho detto al programma che voglio stampare 2 pagine il programma riprende la routine _draw. Come faccio a farlo ripartire dal record successivo all'ultimo stampato? Nel software che funziona infatti ho dovuto gestire quasi manualmente alcuni indici per controllare questo problema. In Gambas2 chiamavi .pagenew azzerava tutto, ristampavi l'intestazione e continuavi. In Gambas3 hai gli eventi _begin, _draw,_end e _paginate ( questo sconosciuto) che dovrebbero aiutarti nella gestione. Se per una stampa banalissima bisogna perdere delle giornate per capire sono dolori. Ho provato anche report ma l'ho abbandonato perchè pare che non si riesca a ridimensionare le label dell'intestazione. Help!!

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.720
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Stampare con gambas3
« Risposta #8 il: 21 Settembre 2014, 00:38:59 »
Io non ne so niente di Database e Record, ...mi viene in mente solo che - ovviamente  ;D - devi riuscire a far cambiare all'interno all'evento _Draw() i valori (suppongo contenuti nei due record) dei primi parametri dei metodi .DrawText() ivi presenti.
Cioè... suppongo che sia un problema legato a come passare i dati dei due Record, piuttosto che un problema legato alla Classe Paint:-\
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »