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

Offline Picavbg

  • Senatore Gambero
  • ******
  • Post: 1.620
    • Mostra profilo
Re: Nuovo Passo --->> La stampa
« Risposta #15 il: 13 Gennaio 2012, 15:53:37 »
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

Ho capito, grazie.
Eseguita la correzione, ho proceduto col tentare la stampa della mia gridview. Il programma è andato avanti senza segnalazioni di errori; la classe richiamata per la stampa svolge apparentemente il suo compito, ma  ... :o... la stampa non viene prodotta.
Certamewnte il codice che ho buttato giù ha bisogno di essere rifinito, ma non pensavo che lo fosse fino al punto di non fare richiamare nemmeno il foglio di carta alla stampante.
Riporto qui di seguito il codice scritto che, come potrai constatare è monco di qualche istruzione che leggendo il tuo esempio, non ho capito:
Codice: gambas [Seleziona]

PUBLIC SUB _new(Docum AS Object)
DIM bSwfine AS Boolean

DIM i AS Integer
DIM x AS Integer
DIM y AS Integer
DIM iCol AS Integer
DIM iLarghStmp AS Integer = 5000
DIM iAltStmp AS Integer = 5000
DIM iIntLn AS Integer = 15      ' ampiezza interlinea
DIM iRg AS Integer
DIM iTotRgDocum AS Integer

DIM $Testata AS String

DIM ilarghCol AS NEW Integer[]
DIM iAltRiga AS NEW Integer[]

iTotRgDocum = 0
 WHILE bSwfine = FALSE
  IF Docum[iTotRgDocum, 1].Text = ""
    IF Docum[iTotRgDocum, 2].Text = ""
      IF Docum[iTotRgDocum, 3].Text = ""
        IF Docum[iTotRgDocum, 4].Text = "" THEN
            bSwfine = TRUE
        ENDIF
      ENDIF
    ENDIF
  ENDIF
  INC iTotRgDocum
 WEND
 iTotRgDocum -= 1
  IF Printer.Setup() THEN RETURN      '  permette l'apertura della finestra di dialogo per la scelta dei parametri di stampa
  Draw.Begin(PRINTER)   
  '----------------- Memorizzazione ampiezza celle -------------------------------------------------
  ilarghCol.add(Draw.TextWidth(Docum.Columns[0].title))
  ilarghCol.add(Draw.TextWidth(Docum.Columns[1].Text))
  ilarghCol.add(Draw.TextWidth(Docum.Columns[2].title))
  ilarghCol.add(Draw.TextWidth(Docum.Columns[3].title))
  ilarghCol.add(Draw.TextWidth(Docum.Columns[4].title))
'----------------------------------------------------------------------------------------------------
  FOR i = 0 TO iTotRgDocum
    iAltRiga.Add(Docum.rows[i].h * 6)
  NEXT
'----------------------- Intestazione ---------------------------------------------------------------------------------
  Draw.ForeColor = Color.Black
  Draw.Font.Size = 12
  x = 150
  y = 150
  Draw.Text($Testata, x, y, iLarghStmp, Draw.TextHeight($Testata), 3)
  y = y + Draw.TextHeight($Testata) + iIntLn * 2      'avanzamento carta di 2 interlinee
  x = 150
  FOR iCol = 0 TO 4
    Draw.Text((Docum.Columns[iCol].title), x, y, ilarghCol[iCol], iAltRiga[iRg])
    x = x + ilarghCol[iCol]
  NEXT
'-------------------------------------------------------------------------------------------------------------------------
'----------------------- Riga di dettaglio --------------------------------------------------------------------------------- 
  x = 150
  FOR iRg = 0 TO iTotRgDocum
    FOR iCol = 0 TO 4
      Draw.Text((Docum[iRg, iCol].Text), x, y, ilarghCol[iCol], iAltRiga[iRg])
      x = x + ilarghCol[iCol]
    NEXT
    x = 150
  NEXT
'-------------------------------------------------------------------------------------------------------------------------
END

Ho guardato anche i componenti del mio ambiente Gamas, ma non credo di doverne attivare altri. Chiedo scusa se approfitto della tua paziente disponibilità, ma perchè la stampa non si avvia?  ???
Ciao.
:ciao:

Offline fsurfing

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.484
    • Mostra profilo
Re: Nuovo Passo --->> La stampa
« Risposta #16 il: 13 Gennaio 2012, 16:10:38 »
la stampa non ti esce perchè hai dim enticato di mettere un draw.end alla fine della stampa.


probabilmente le linee ch enon hai capito sono quelle che si occupano prima di leggere tutta la tabella per capire se la stampa deve essere effettuata con il foglio in verticale o in orrizzontale .

il mio programma infatti analizza cella per cella il testo di conseguenza in base al numero di caratteri definisce la dimensione finale della tabella da stampare , se questa supera la dimensione di un a4 verticale si occupa di girare il foglio, se invece la dimensione verticale della stampa supera un foglio si occupa di suddividerla in + pagine

Offline Picavbg

  • Senatore Gambero
  • ******
  • Post: 1.620
    • Mostra profilo
Re: Nuovo Passo --->> La stampa
« Risposta #17 il: 14 Gennaio 2012, 16:31:03 »
Grazie per avermi acceso la lampadina. effettivamente non mi ero accorto dell'istruzione DRAW.END. Ora la stampante si muove e qualcosina la produce.
Per ora sto cercando di capire alcuni parametri contenuti nelle varie righe di stampa. Prima di occuparmi delle righe di dettaglio, sto cercando di fare funzionare la stampa della testata del documento:
Codice: gambas [Seleziona]

  Draw.ForeColor = Color.Black
  Draw.Font.Size = 8
  x = 100
  y = 100
  Draw.Text($Testata, x, y, iLarghStmp, Draw.TextHeight($Testata), 3)

Vorrei però impostare la risoluzione di tipo bozza, ma non sono riuscito a trovare il parametro da attribuire al comando Printer.Resolution.
Premesso poi che ho selezionato la stampa su fogli A5, vorrei stampare la testata del documento al centro, ho scoperto che l'ultimo parametro della "Draw.Text", impostato a '3' dovrebbe fare al caso mio, ma  non produce l'effetto desiderato. Dipende probabilmente dalla larghezza della riga da stampare?
Ciao.
:ciao:

Offline fsurfing

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.484
    • Mostra profilo
Re: Nuovo Passo --->> La stampa
« Risposta #18 il: 14 Gennaio 2012, 18:20:45 »
printer risolution serve per settare la risoluzione di stampa espressa in dpi , variando questo valore varierà anche la grandezza di ciò che stampi se stampi un rettangolo di 100 x 200 sulla stampa la sua dimensione reale dipenderà dalla risoluzione che usi. quindi ogni valorizzazione devi fare in modo che sia proporzionale alla risoluzione .

se stampi in a5 le dimensioni del foglio cambia riaspetto ai valori che avevo messo io , e naturalment evaria anche in base alla risoluzione.

ad esempio un a4 stampato a 300 dpi avrà circa 16000 punti di larghezza, a 90 dpi ne avrà solamente 4800

naturalmente credo sia corretto usare la risoluzione per definire la qualità di stampa , ma occhio che cambiandola cambia tutta la dimensione della stampa

la proprietà allineamento del testo funziona bene però devi tener presente che si alline in relazione al rettangolo formato dalla larghezza e altezza che inserisci nei due paremetri

Offline Picavbg

  • Senatore Gambero
  • ******
  • Post: 1.620
    • Mostra profilo
Re: Nuovo Passo --->> La stampa
« Risposta #19 il: 14 Gennaio 2012, 22:43:08 »
printer risolution serve per settare la risoluzione di stampa espressa in dpi , variando questo valore varierà anche la grandezza di ciò che stampi se stampi un rettangolo di 100 x 200 sulla stampa la sua dimensione reale dipenderà dalla risoluzione che usi. quindi ogni valorizzazione devi fare in modo che sia proporzionale alla risoluzione .
se stampi in a5 le dimensioni del foglio cambia riaspetto ai valori che avevo messo io , e naturalment evaria anche in base alla risoluzione.
ad esempio un a4 stampato a 300 dpi avrà circa 16000 punti di larghezza, a 90 dpi ne avrà solamente 4800
naturalmente credo sia corretto usare la risoluzione per definire la qualità di stampa , ma occhio che cambiandola cambia tutta la dimensione della stampa
la proprietà allineamento del testo funziona bene però devi tener presente che si alline in relazione al rettangolo formato dalla larghezza e altezza che inserisci nei due paremetri
Mi dispiace darti tanto da fare per spiegarmi la strutturazione di una stampa, ma ancora non riesco a capirne il meccanismo. Pensavo che non fosse assolutamente necessario creare per ciascuna riga di stampa un rettangolo dentro il quale inserire la stringa da stampare, invece, a quanto pare mi sono sbagliato.
 :-[
Pensavo pure che nella finestra di dialogo che si avvia, preliminarmente alla stampa, potessi predisporre la modalità bozza,normale, alta qualità, invece non ho trovato niente del genere. Allora, come posso richiedere la modalità bozza?
 :(
:ciao:

Offline fsurfing

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.484
    • Mostra profilo
Re: Nuovo Passo --->> La stampa
« Risposta #20 il: 15 Gennaio 2012, 11:25:58 »
non mi sono spiegato bene,

non è che devi creare un rettangolo per scriver eun testo, ma se usi l' allineamento devi tenere conto del fatto che la scritta sarà allineata al rettangolo "virtuale" che inizia in x ,y con larghetta w w altezza h.

draw.text(testo,x,y,w,h,align)

naturalmente poi puoi anche non utilizzare l' allineamento per cui sarà:

draw.text(testo,x,y)
il testo inizierà alle coordinate x,y


in g2 non puoi dal form di setup definire la qualità di stampa, mi sembra però superflua questa funzione nella stampa di report

se invece vuoi implementarla dai la possibilità di scegliere tre o più valori di risoluzione




Offline Picavbg

  • Senatore Gambero
  • ******
  • Post: 1.620
    • Mostra profilo
Re: Nuovo Passo --->> La stampa
« Risposta #21 il: 16 Gennaio 2012, 12:54:48 »
non mi sono spiegato bene,

non è che devi creare un rettangolo per scriver eun testo, ma se usi l' allineamento devi tenere conto del fatto che la scritta sarà allineata al rettangolo "virtuale" che inizia in x ,y con larghetta w w altezza h.
draw.text(testo,x,y,w,h,align)
naturalmente poi puoi anche non utilizzare l' allineamento per cui sarà:
draw.text(testo,x,y)
il testo inizierà alle coordinate x,y

in g2 non puoi dal form di setup definire la qualità di stampa, mi sembra però superflua questa funzione nella stampa di report
se invece vuoi implementarla dai la possibilità di scegliere tre o più valori di risoluzione
Quindi, se ho capito, non ho bisogno di utilizzare istruzioni come Draw.Rect.

Per la risoluzione, non so come potrei implementarne la funzione.
:ciao:

Offline fsurfing

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.484
    • Mostra profilo
Re: Nuovo Passo --->> La stampa
« Risposta #22 il: 17 Gennaio 2012, 18:52:30 »
nmo draw.rect non ti serve, a meno che naturalmente tu non voglia ottenere un testo circondato da un rettangolo :)

se stampi solo testo non vedo nessuna necessita di porsi il problema , imposta una risoluzione adeguata, che so tipo 150 e vai felice di conseguenza.

come nel mio esempio usa delle variabili per definire in pixel la larghezza del foglio , l' altezza, il bordo,la dimensione  del font, la spaziatura  ecc così potrai in caso di bisogno cambiare la risoluzione e cambiando i valori delle varie variabili in funzione della risoluzioone ottenere sempre una stampa ottimale

ps: si sta sempre parlando di g2, per g3 si possono fare in modo diverso (vedi esempi di stampa di g3)


Offline Picavbg

  • Senatore Gambero
  • ******
  • Post: 1.620
    • Mostra profilo
Re: Nuovo Passo --->> La stampa
« Risposta #23 il: 17 Gennaio 2012, 19:22:04 »
per capire meglio ho buttato giù un programmino che esegue solamente, per ora, una riga di stampa, l'intestazione di un documento:
Codice: [Seleziona]
PUBLIC SUB _new()
DIM iDimCrt AS Integer
DIM iDPI AS Integer     ' DPI(dots per inch) = punti per pollice
DIM x AS Integer
DIM y AS Integer

DIM $Testata AS String

IF Printer.Setup() THEN RETURN      '  permette l'apertura della finestra di dialogo per la scelta dei parametri di stampa
  Draw.Begin(PRINTER)   
  iDPI = Draw.W
  SELECT CASE iDPI
          CASE 4958     'Formato Pagina = A4
            iDimCrt = 12
          CASE 3500     'Formato Pagina = A5
            iDimCrt = 8
  END SELECT
  x = 80
  y = 80
  $Testata = "@****** Questo titolo è una testata di documento ******@"
  Draw.Font.Size = iDimCrt
  Draw.Text($Testata, x, y, iDPI, 80, 3)
  Draw.End
END   

La stampa si posiziona splendidamente al centro della riga, in testa al foglio, sia esso A4 che A5, la cui larghezza è data dalla DRAW.W. Finalmente comincio a capirci qualcosiana. Ho notato però, sia nel codice contenuto nel tuo esempio, sia in qualche altro che si fa usa del comando DRAW.Rect(...). Non ne ho ancora capito l'utilità. Potresti ilklumuinarmi in proposito. Grazie!
Ciao.
:ciao:

Offline fsurfing

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.484
    • Mostra profilo
Re: Nuovo Passo --->> La stampa
« Risposta #24 il: 17 Gennaio 2012, 19:38:12 »
secondo me è meglio così.


Codice: [Seleziona]
PUBLIC SUB _new()
DIM iDimCrt AS Integer
DIM iDPI AS Integer     ' DPI(dots per inch) = punti per pollice
dim Wt as integer
DIM x AS Integer
DIM y AS Integer

DIM $Testata AS String

IF Printer.Setup() THEN RETURN      '  permette l'apertura della finestra di dialogo per la scelta dei parametri di stampa
  Draw.Begin(PRINTER)  
  wt = Draw.W
  SELECT CASE printer.size
          CASE "A4"     'Formato Pagina = A4
            iDimCrt = 12
          CASE "A5"     'Formato Pagina = A5
            iDimCrt = 8
  END SELECT
  x = 80
  y = 80
  $Testata = "@****** Questo titolo è una testata di documento ******@"
  Draw.Font.Size = iDimCrt
  Draw.Text($Testata, x, y, wt, 80, 3)
  Draw.End
END  


draw.rec serve per disegnare un rettangolo, quindi si usa quando si vuole disegnare un rettangolo

Offline Picavbg

  • Senatore Gambero
  • ******
  • Post: 1.620
    • Mostra profilo
Re: Nuovo Passo --->> La stampa
« Risposta #25 il: 23 Gennaio 2012, 19:19:18 »
draw.rec serve per disegnare un rettangolo, quindi si usa quando si vuole disegnare un rettangolo

Ho capito!  :D Comunque, oggi ho potuto intensificare le prove e sono riuscito ad ottenere risultati positivi, segno che sto familiarizzando.  ;)
Non mi riesce però la stampa con allineamento justify, infatti
Codice: [Seleziona]
 Draw.Text($TabTesto[i], x, y, iLarghTst, ihCrt, 4)    ' 4 --> Allineamenmto "justify"
funziona tale e quale l'allineamento con codice "1"(a sx). Cosa mi consigli per raggiungere l'obiettivo?
 :ciao:
:ciao:

Offline fsurfing

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.484
    • Mostra profilo
Re: Nuovo Passo --->> La stampa
« Risposta #26 il: 23 Gennaio 2012, 21:28:04 »
non saprei proprio come aiutarti  :(

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.303
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Nuovo Passo --->> La stampa
« Risposta #27 il: 24 Gennaio 2012, 00:29:09 »
Non mi riesce però la stampa con allineamento justify, infatti
funziona tale e quale l'allineamento con codice "1"(a sx). Cosa mi consigli per raggiungere l'obiettivo?
 :ciao:

Hai provato con .RichText ?
« 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 Picavbg

  • Senatore Gambero
  • ******
  • Post: 1.620
    • Mostra profilo
Re: Nuovo Passo --->> La stampa
« Risposta #28 il: 24 Gennaio 2012, 12:03:07 »
Hai provato con .RichText ?
Cobn .RichText la stampa non è più leggibile; infatti una riga di stampa viene segmentata ed alla fine della stampa tali segmenti risultano sovrapposti, come se fossero stmapati sempre sulla stesasa colonna. Probabilmente ciò dipende dal fatto che il la funzione RichText si traduce in Gambas in una stringa che usa un sottoinsieme del formato HTML che ha una sua propria gestione di scrittura carattere, per mezzo di marcatori suoi propri, vedi qui e qui.
Può darsi che il problema si verifichi in G2 e non in G3. É così?
 :ciao:
:ciao:

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.303
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Nuovo Passo --->> La stampa
« Risposta #29 il: 24 Gennaio 2012, 13:25:34 »

Cobn .RichText la stampa non è più leggibile;
Può darsi che il problema si verifichi in G2 e non in G3. É così?
 :ciao:

 :ciao:
Allora... rettifico, dovresti provare ad utilizzare:  .DrawRichText

Io ho provato con Printer questa istruzione (con testo previsto abbastanza lungo):
Codice: [Seleziona]
Paint.DrawRichText("Si potrebbe andare tutti quanti allo zoo comunale. Vengo anch'io. No, tu no ! Per vedere come stanno le bestie feroci...", 200, 100, 300, 100, 4)

Al posto del valore numerico puoi utilizzare anche align.justify :
Codice: [Seleziona]
Paint.DrawRichText("Si potrebbe andare tutti quanti allo zoo comunale. Vengo anch'io. No, tu no ! Per vedere come stanno le bestie feroci...", 200, 100, 300, 100, align.justify)

(In entrambi i casi è necessario inserire la proprietà della risoluzione: Printer1.Resolution = ......; nonché dopo Paint.DrawRichText(".....") bisogna inserire l'istruzione: Paint.Stroke )

ed il risultato è stato coerente con formattazione giustificata del testo.

Preciso che ho Gambas- 3.
« Ultima modifica: 25 Gennaio 2012, 04:47:57 da vuott »
« 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. »