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

Offline md9327

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.840
    • Mostra profilo
Re: Nuovo Passo --->> La stampa
« Risposta #60 il: 01 Marzo 2012, 11:43:13 »
La classe PdfWriter è specializzata a scrivere documenti pdf, partendo da dati forniti dall'utente (o dal programmatore...).

I due metodi (che nelle ultime versioni ho implementato anche come eventi), vengono scatenati quando la libreria si accorge dei limiti del foglio. E' ovvio che l'utilizzo di questi metodi non è obbligatorio, ma sicuramente è utile per definire un header e un footer specifici e con le caratteristiche volute.

Il metodo Data serve invece per passare i dati per le pagine. Questi possono essere delle tabelle oppure a formattazione libera, ovviamente è necessario utilizzare i vari metodi e funzioni che la libreria mette a disposizione.

La creazione di un tabellare è indipendente dalla sorgente, per cui stà al programmatore fornire le giuste informazioni e i dati da rappresentare. Con questo dico che vi sono funzioni specializzate a estrarre i dati da, per esempio, un database.

Passando i dati al metodo Data(), questi vengono stampati sul pdf. Appena la libreria si accorge che è terminato il foglio, scatena l'evento (o chiama) Footer, che può essere utilizzato magari per stampare il numero di pagina corrente.
Identica cosa avviene con l'Header ovvero, appena si avvia un nuovo foglio, il metodo (o evento) viene chiamato, permettendo al programmatore di scrivere la testata del documento, ovviamente se è necessario... Questa cosa diviene utile appunto per i tabellari, permettendo di stampare per ogni pagina la stessa intestazione e/o piè di pagina.

Offline md9327

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.840
    • Mostra profilo
Re: Nuovo Passo --->> La stampa
« Risposta #61 il: 01 Marzo 2012, 11:47:51 »
Allora ....
Ho modificato le istruzioni dielle sottoclassi Header e Data di Pdfwriter, per ottenere il file pdf coi dati della gridview compilata in FMain.class ed inserita in Fmain.Form. Ho incontrato, fin ad ora, due difficoltà: non è riconosciuto il font"Bitstream Charter" e l'ho momentaneamente sostituito con "courier". La sottoclasse header non da problemi, mentre, nella sosstoclasse Data non riesco a puntare le righe di della gridview; infatti già nella prima riga di estrazione della testata di ciascuna colonna ricevo il messaggio di "sconosciuto". Il gruppo di istruzioni è:
'--------------------------- Prepara riga di testa della griglia -----------------------------------------         
Codice: gambas [Seleziona]
  ME.SetFont("courier", "B", 8)         
  ME.Cell(10, 5, FMain.Form.GridStmp.Columns[0].Text, TRUE, 1, "C", TRUE)
  ME.Cell(10, 35, FMain.GridStmp.Columns[1].text, TRUE, 1, "C", TRUE)
  ME.Cell(10, 370, FMain.GridStmp.Columns[2].text, TRUE, 1, "C", TRUE)
  ME.Cell(10, 500, FMain.GridStmp.Columns[3].text, TRUE, 1, "C", TRUE)
  ME.Cell(10, 580, FMain.GridStmp.Columns[4].text, TRUE, 1, "C", TRUE)
  ME.Ln()

Alla riga n.2 ricevo la segnalazione unknown sYmbol 'Form' in class 'Fmain'
mentre, se la riscrivo come la riga n.3, mi viene segnalato  unknown sYmbol 'GridStmp' in class 'Fmain'
Purtroppo non ho trovato nemmeno un riferimento simile nel link che mi hai suggerito nella tua ultima risposta e non ho capito come devo scrivere.  ???
 :(





Attualmente ci sono alcune limitazioni circa i tipi di carattere che è possibile utilizzare.

I riferimenti a oggetti di altre classi devono essere pubblici, ovvero GridStmp deve essere raggiungibile da altre classi, quindi occorre definirla pubblica (vedi impostazioni di progetto).

Offline Picavbg

  • Senatore Gambero
  • ******
  • Post: 1.620
    • Mostra profilo
Re: Nuovo Passo --->> La stampa
« Risposta #62 il: 01 Marzo 2012, 15:49:58 »
Ma è possibile definire una gridview pubblica?
Io ho aggirato l'ostacolo eseguendo una copia della gridview in un nuovo oggetto definito pubblico:
Codice: gambas [Seleziona]
PUBLIC GriStampMov AS Object
-------- bla  bla  bla  -----------------       
GriStampMov = GridStmp
 iTRgStampa = iRgGriStamp              'ultima riga di dettaglio
  RANDOMIZE
  pdf = NEW Reportpdf("Portrait", "mm", "A5")
  pdf.Open()
  pdf.AliasNbPages()
  pdf.Data
  pdf.Output(User.Home & "/ContFamStampe", FALSE)
-------- bla  bla  bla  -----------------

PUBLIC FUNCTION Data()    'corpo di una pagina
DIM i AS Integer
DIM iTotRg AS Integer
'---------------------------------------------------------
  ME.AddPage()
  ME.SetFillColor(192, 192, 192)
  ME.SetLineWidth(0.2)     
  ME.Line(10, 10, 200, 10)
  ME.SetLineWidth(0.1)
  ME.SetX(0)
  ME.SetY(50)
  ME.Ln()
'--------------------------- Prepara riga di testa della griglia -----------------------------------------         
  ME.SetFont("courier", "B", 8)         
  ME.Cell(10, 35, FMain.GriStampMov.Columns[1].text, TRUE, 1, "C", TRUE)
  ME.Cell(10, 370, FMain.GriStampMov.Columns[2].text, TRUE, 1, "C", TRUE)
  ME.Cell(10, 500, FMain.GriStampMov.Columns[3].text, TRUE, 1, "C", TRUE)
  ME.Cell(10, 580, FMain.GriStampMov.Columns[4].text, TRUE, 1, "C", TRUE)
  ME.Ln()
'-----------------
'--------------------------- Prepara righe di dettaglio della griglia -----------------------------------------           
  ME.SetFont("courier", "", 8)
  iTotRg = FMain.iTRgStampa
  FOR i = 1 TO iTotRg
    ME.Cell(10, 5, FMain.GriStampMov[i, 0].text, TRUE, 1, "R", TRUE)
    ME.Cell(10, 35, FMain.GriStampMov[i, 1].text, TRUE, 1, "L", TRUE)
    ME.Cell(10, 370, FMain.GriStampMov[i, 1].text, TRUE, 1, "L", TRUE)
    ME.Cell(10, 500, FMain.GriStampMov[i, 2].text, TRUE, 1, "R", TRUE)
    ME.Cell(10, 580, FMain.GriStampMov[i, 3].text, TRUE, 1, "R", TRUE)
    ME.Ln()
  NEXT
END


L'ampiezza (param.w) è puramente indicativa, in quanto non mi sono ancora reso conto come regolarmi, quindi ti prego di non tenerne conto. Così facendo il file pdf è stato creato, ma, alla sua prima vita, presenta 128 pagine tutte uguali cioè con solo rettanglo della riga di testata della gridview. Ci devo lavorare un pò su.
Ciao.

:ciao:

Offline Picavbg

  • Senatore Gambero
  • ******
  • Post: 1.620
    • Mostra profilo
Re: Nuovo Passo --->> La stampa
« Risposta #63 il: 01 Marzo 2012, 17:03:04 »
Diciamo che ho capito.  ;)
Sono riuscito a stampare l'intera griglia, rispettando le colonne ed il loro contenuto. Non ho potuto però evitare che il contenuto di una cella, essendo più lungo della sua area di stampa nella riga, andasse ad invadere lo spazio riservato alla cella immediatamente successiva, per cui alla fine la stampa risulta confusa ed, in parte, illeggibile. Non volendo usare il formato multiriga e multirect, potrei ottenere il troncamento dei caratteri eccedenti il parametro w?
É possibile poi spostare più a sinistra il margine Sx di ciascuna riga da stampare? Infatti non capisco come mai il comando
Codice: [Seleziona]
ME.Line(0, 7, 150, 7)
occupi tutto lo spazio fisico del foglio, mentre , pur avendo posto ME.SetX(-5) il margine Sx di ciascuna riga di dettaglio cominci sempre a circa mm.14 dall'estrema sinistra del foglio di carta.
 :ciao:
:ciao:

Offline Golia

  • Senatore Gambero
  • ******
  • Post: 1.298
  • no xe mai massa tardi
    • Mostra profilo
Re: Nuovo Passo --->> La stampa
« Risposta #64 il: 01 Marzo 2012, 20:17:27 »
Ciao
Prova con
Citazione
Me.SetLeftMargin(0)
sinceramente non l'ho mai provato :-[
Una buona guida, che mi aveva consigliato MD a suo tempo è questa:
http://www.fpdf.org/
MD ha fatto il porting da questa classe, la puoi trovare molte risposte.
Naturalmente non hai che da chiedere  :ciao:
Ciao :2birre:

Offline md9327

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.840
    • Mostra profilo
Re: Nuovo Passo --->> La stampa
« Risposta #65 il: 02 Marzo 2012, 13:39:09 »
Per poter gestire una multiriga devi impostare il codice nel metodo Data.
In realtà, ma funzione MultiLine utilizza le proprietà e i metodi della classe stessa, suddividendo il testo in modo da farlo entrare in un'area ben definita.
Ovviamente la stessa cosa la puoi fare tu, ma ti consiglierei di farla fare alla specifica funzione, che è studiata proprio a tal fine.
Eventualmente, puoi dare un'occhiata al codice, così da capire come funziona la logica di divisione...

Offline Picavbg

  • Senatore Gambero
  • ******
  • Post: 1.620
    • Mostra profilo
Re: Nuovo Passo --->> La stampa
« Risposta #66 il: 02 Marzo 2012, 16:11:47 »
@ Golia:
Si, avevo già letto FPDF, però in maniera assai sommaria, e di conseguenza non mi ero accorto della possibilità di gestitre i margini di stampa. Ora Ho guardato meglio ed ho provato. La funzione è veramente efficace. Ho ottenuto quello che volevo.

@ md9327:
Come ho  già detto precedentemente, al momento non mi interessa la funzione multiriga, interessa invece il troncamento dei caratteri eccedenti la cella di stampa. Leggendo il manuale FPDF ho scoperto la funzione GetStringWidth e l'ho provata. La lunghezza che restituisce, naturalmente, non corrisponde col valore restituito da Len(stringa) che fornisce il n° di caratteri. Perciò dovendo limitare il troncamento della stringa da inviare in stampa alla larghezza della cella di destinazione, ho risolto con l'applicazione del seguente codice:
Codice: [Seleziona]
$StriMia = FMain.GriStampMov[i, 1].text
ilun = ME.GetStringWidth($StriMia)
WHILE iLun > 71
      ill = Len($StriMia)
      $Strimia = Left($StriMia, ill - 1)
      ilun = ME.GetStringWidth($StriMia)
WEND
ME.Cell(72, 4, $StriMia, TRUE, 0, "L", FALSE)
Purtroppo non ho potutto ottenere un unico troncamento, ma un troncamento progressivo fino ad arrivare alla lunghezza prevista per la cella da impegnare in stampa.
Il risultato finale è perfetto.
Se doveste conoscere un procedimento di calcolo più rapido, sono ben pronto a recepirlo.
A questo punto credo proprio di continuare la prova finio a produrre la stampa del file PDF creato.  ;)  ;D
 :ciao:  :ciao:


PS: potreste indicarmi una tabella di  colori e valori  per usare bene il comando "SetTextColor"?
« Ultima modifica: 02 Marzo 2012, 17:01:48 da Picavbg »
:ciao:

Offline Golia

  • Senatore Gambero
  • ******
  • Post: 1.298
  • no xe mai massa tardi
    • Mostra profilo
Re: Nuovo Passo --->> La stampa
« Risposta #67 il: 02 Marzo 2012, 18:25:13 »
Citazione
PS: potreste indicarmi una tabella di  colori e valori  per usare bene il comando "SetTextColor"?
Tipo questa? http://it.wikipedia.org/wiki/Lista_dei_colori


Offline alcresio

  • Grande Gambero
  • ***
  • Post: 100
    • Mostra profilo
Re: Nuovo Passo --->> La stampa
« Risposta #69 il: 02 Marzo 2012, 19:14:56 »
Citazione
PS: potreste indicarmi una tabella di  colori e valori  per usare bene il comando "SetTextColor"?
Tipo questa? http://it.wikipedia.org/wiki/Lista_dei_colori

Se hai bene in mente il triangolo dei colori in RGB potresti fare una cosa del genere:

Function RGB(R As Byte, G As Byte, B As Byte) As Integer
 Dim sHex As String
 sHEX = Hex$(R, 2) & Hex$(G, 2) & Hex$(B, 2)
 sHEX = "&H" & sHEX & "&"
 Return Val(sHEX)
End


Così passi il colore in rgb e lo ripeschi in hex

Oppure
puoi usare il programmino in allegato che scrisse la mia compagna per mostrare ai miei allievi fotografi lo spettro dei colori
non è un gran ché ma riporta il valore esadecimale e decimale di tutti i colori dello spettro rgb standard

Offline Picavbg

  • Senatore Gambero
  • ******
  • Post: 1.620
    • Mostra profilo
Re: Nuovo Passo --->> La stampa
« Risposta #70 il: 02 Marzo 2012, 22:33:43 »
@ Alcresio:
Citazione
Oppure
puoi usare il programmino in allegato che scrisse la mia compagna per mostrare ai miei allievi fotografi lo spettro dei colori
non è un gran ché ma riporta il valore esadecimale e decimale di tutti i colori dello spettro rgb standard
Ho provato ad eseguirlo, ma ho ricevuto la segnalazione di errore "Non è un programma scritto in Gambas2. É forse scritto in G3?

@: Golia e vuott:
Si esattamente. Naturalmente mi interessa una scala di colori cge riporti i tre valori di r,g,b.  ;D
Grazie a tutti.

Proprio ora ho finito l'ultima prova di scrittura del file PDF e sono veramente  ;D perchè sono riuscito con pochissimo impegno ad ottenere quello che volevo, compresa la selezione automatica del formato A5. Perciò, alla fine, mi sono deciso di adottare la funzione PDFWriter. Ora mi resta solo di capire come stampare il file appena salvato.  ;)  ;D
 :ciao:



:ciao:

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.724
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Nuovo Passo --->> La stampa
« Risposta #71 il: 02 Marzo 2012, 23:38:08 »
@ Alcresio:
Citazione
Oppure
puoi usare il programmino in allegato che scrisse la mia compagna per mostrare ai miei allievi fotografi lo spettro dei colori
non è un gran ché ma riporta il valore esadecimale e decimale di tutti i colori dello spettro rgb standard
Ho provato ad eseguirlo, ma ho ricevuto la segnalazione di errore "Non è un programma scritto in Gambas2. É forse scritto in G3?

A me quel programma funziona regolarmente.  :coder: Uso Gambas-3.
« 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 Golia

  • Senatore Gambero
  • ******
  • Post: 1.298
  • no xe mai massa tardi
    • Mostra profilo
Re: Nuovo Passo --->> La stampa
« Risposta #72 il: 03 Marzo 2012, 00:31:23 »
Citazione
Ora mi resta solo di capire come stampare il file appena salvato

Codice: gambas [Seleziona]
Dim hStampa As Process
hStampa = Shell ("lpr " & Myfilepdf)


Ho fatto un form che fa da anteprima invio stampa scelta stampante etcc, però è con G3.
Ma che aspetti a passare a g3? ;)

Offline alcresio

  • Grande Gambero
  • ***
  • Post: 100
    • Mostra profilo
Re: Nuovo Passo --->> La stampa
« Risposta #73 il: 03 Marzo 2012, 00:37:44 »
Ho provato ad eseguirlo, ma ho ricevuto la segnalazione di errore "Non è un programma scritto in Gambas2. É forse scritto in G3?
Si, è stato convertito in GB3... non credo di avere la versione in gb2, ho deciso di migrare al 3 senza rimpianti (spero)!
Ma puoi aprire il sorgente con kwrite o gedit e vedere cosa fa. è davvero molto semplice




Offline Picavbg

  • Senatore Gambero
  • ******
  • Post: 1.620
    • Mostra profilo
Re: Nuovo Passo --->> La stampa
« Risposta #74 il: 03 Marzo 2012, 22:20:23 »
Ma che aspetti a passare a g3? ;)

La tua domanda mi ha messo un pò di curiosità ed ho cercato G3 nei repository di fedora. Non è ancora disponibile, infatti trovo ancora G2, per cui, anche volendolo, sono costretto ad aspettare che fedora lo attivi.
La cosa mi dispiace perchè mi ero deciso proprio ieri ad installare anche G3 in modo da portarvi il mio programma e prepararmi così ad  una riorganizzazione del mio pc.  :-\
Ora mi direte: ma perchè non parti dal sorgente? Perchè, per quello che ho capito, è una procedura assai laboriosa che richiede anche una buona conoscenza sul da farsi ed io non sono assolutamante all'altezza. Quindi devo aspettare.
Comunque, grazie a tutti.
 :ciao:
:ciao: