Scopo
La procedura Print effettua la stampa del book. Il comportamento della procedura dipende dal valore del parametro PrintDestination: se PrintDestination vale PDF il book viene stampato su PDF. Se PrintDestination vale SCREEN il book viene mostrato in anteprima nella videata. Se PrintDestination vale PRINTER il book viene inviato alla stampante del server.
Sintassi
Book.Print(Da Pagina, A Pagina)
Argomenti
Da Pagina | Rappresenta il numero della prima pagina da stampare |
A Pagina | Rappresenta il numero dell'ultima pagina da stampare |
Funzionamento del motore di stampa
In questo paragrafo viene descritta la procedura seguita dal sistema per effettuare la stampa di un book. Quando viene chiamata la procedura Print il sistema stampa tutte le pagine comprese nell'intervallo dei numeri di pagina indicati alla procedura stessa. Il sistema effettua comunque la stampa partendo dalla prima pagina anche se il valore del primo parametro della procedura Print è maggiore di uno. Solo le pagine comprese nell'intervallo dei valori dei parametri della procedura verranno effettivamente mostrate all'utente o stampate su PDF o stampante. Per effettuare la stampa di un book il sistema segue i seguenti passaggi:
- Il primo passo consiste nel decidere su quale pagina effettuare la stampa. Il sistema analizza i reports contenuti nel book per decidere quale pagina utilizzare alla ricerca del primo report visibile la cui query restituisca dati. Una volta trovato ne analizza le sezioni alla ricerca della prima sezione visibile. Infine il sistema guarda in quale box tale sezione deve essere stampata. La pagina contenente tale box è la pagina da utilizzare per avviare la stampa.
- Il passo successivo consiste nella creazione di una copia della pagina Template trovata al passo precedente. Subito dopo la creazione della copia viene notificato l'evento OnFormatting della pagina da cui è stata generata la copia. Durante tale evento è possibile modificare la pagina e le box in essa contenute. Tutte le modifiche effettuate alla pagina o agli oggetti in essa contenuti (box e span) hanno effetto solo sulla copia creata.
-
Il sistema, poi, chiede ad ogni report visible di stamparsi sulla pagina corrente, creata al passo precedente. La stampa del report procede come segue:
- Il sistema esegue, innanzitutto, la query. Poi vengono stampate tutte le sezioni visibili del report in un ordine dipendente dal loro tipo. Solo le sezioni che sono collegate a box contenute nella pagina corrente verranno stampate. Quando il sistema deve stampare una sezione crea una copia della sezione e delle box e span in essa contenute e notifica l'evento di BeforeFormatting. Durante tale evento è possibile modificare sia la sezione che le box e gli span in essa contenuti.
- Qualora, al termine dell'evento, la sezione non sia stata resa invisibile il sistema ne esegue la formattazione. Tale operazione consiste nel calcolare il valore di ogni singolo span che non sia stato reso invisibile (e che non sia contenuto in una box che sia stata resa invisibile durante l'evento di BeforeFormatting). Qualora una box sia stata disegnata per adattare la propria altezza al proprio contenuto (proprietà VerticalResizeMode della box visibile nella videata delle proprietà della box) il sistema calcola la nuova altezza garantendo che il testo dello span non fuoriesca dalla box.
- Al termine della procedura di formattazione il sistema posiziona la copia della sezione sulla pagina corrente all'interno della box in cui è previsto che questa debba essere stampata. Quindi posiziona tutte le box e gli span che non siano stati resi invisibili durante l'evento di BeforeFormatting. Al termine della procedura di formattazione della sezione il sistema notifica l'evento di AfterFormatting della sezione. In tale evento è possibile conoscere l'esatta coordinata Y in cui è stata posizionata la sezione (funzione YPos della sezione) e modificare alcune delle proprietà della sezione e delle box e span in essa contenuti. Non è, però, possibile rendere invisibile la sezione poiché è già stata posizionata sulla pagina.
- Nella stampa delle sezioni, il report segue il seguente ordine: inizia dalle sezioni di tipo Report Header. Prosegue poi con le sezioni di tipo Page Header che vengono stampate su ogni pagina e quindi anche sulla pagina corrente. Successivamente per ogni riga della query vengono stampate tutte le sezioni di tipo Group Header, qualora la riga corrente identifichi l'inizio del corrispondente gruppo, e tutte le sezioni di tipo Detail. Si prosegue con tutte le sezioni di tipo Group Footer, qualora il report contenga sezioni di tale tipo e la riga corrente identifichi la fine del corrispondenteun gruppo. Infine vengono stampate tutte le sezioni di tipo Page Footer e, qualora la riga corrente sia l'ultima riga della query, vengono stampate tutte le sezioni di tipo Report Footer. Attenzione: vengono stampate solo le sezioni che devono essere stampate in box della pagina corrente.
- Il sistema analizza un report alla volta e passa al report successivo solo se il report esaurisce i dati da stampare o se lo spazio disponibile sulla pagina per le sezioni del report è esaurito. Quando un report ha terminato la stampa, il sistema passa al report successivo chiedendo di stampare sulla stessa pagina.
- Quando tutti i reports hanno terminato di stamparsi sulla pagina corrente (questo avviene sia perché tutti i reports hanno terminato i dati o, più probabilmente, perché lo spazio sulla pagina corrente per le loro sezioni è terminato) il sistema ricomincia dal passo 1 a meno chè il numero della pagina appena stampata non corrisponda al valore del secondo parametro della chiamata alla procedura Print. In questo caso l'esecuzione della procedura Print termina ed il sistema prosegue con le righe di codice successive.
Note
-
Se il valore della proprietà PrintDestination è SCREEN il book viene mostrato in anteprima nella videata. In questo caso è consigliato stampare solo la prima pagina poiché l'utente ha la possibilità, tramite gli opportuni comandi disponibili nella toolbar del book, di vedere le pagine successive. Per stampare solo la prima pagina è sufficiente chiamare la procedura Print con entrambi i parametri uguali ad uno:
Book.Print(1, 1)
-
Se il valore della proprietà PrintDestination è PDF il book viene stampato in un file con estensione .pdf. Normalmente, in questo caso, occorre stampare tutto il book. Per fare questo è sufficiente chiamare la procedura Print nel modo seguente:
Book.Print(1, -1)
dove il valore -1 indica che occorre stampare il book fino alla fine. Se occorre è anche possibile stampare un numero inferiore di pagine. Per esempio il comandoBook.Print(3, 7)
stampa solo le pagine dalla 3 alla 7 comprese. Dopo aver effettuato la stampa su PDF il nome del file prodotto è contenuto nella proprietà OutputFileName. E' anche possibile chiamare la funzione WebFileName per ottenere il percorso del file relativo alla directory in cui è contenuta l'applicazione. -
Se il valore della proprietà PrintDestination è PRINTER il book viene stampato su stampante. Normalmente, in questo caso, occorre stampare interamente il book e quindi, come già visto nel caso della stampa su PDF, è sufficiente chiamare la procedura Print nel modo seguente:
Book.Print(1, -1)
Qualora sia necessario stampare un numero inferiore di pagine è possibile indicare il numero della prima e dell'ultima pagina, come descritto nel caso di stampa su PDF. Il book viene stampato sulla stampante predefinita qualora il valore della proprietà PrinterName sia vuoto. In alternativa il sistema cerca la stampante il cui nome è indicato da tale parametro. - Dopo aver stampato una pagina il sistema rilascia tutta la memoria allocata per tale pagina e inizia la stampa della successiva. Questo non avviene se il book è contenuto in una porzione di videata. In questo caso, infatti, il sistema conserva in memoria alcune pagine. Questo per permettere di andare velocemente ad una determinata pagina senza dover ristampare tutto il book. Infatti, se l'utente sta vedendo la pagina 85 di un book e desidera tornare indietro di una pagina il sistema dovrebbe ripartire dalla pagina 1 e ristampare tutto il book fino alla pagina 84 per mostrarla all'utente. Il sistema, nel caso di book in anteprima, conserva una pagina ogni dieci. Quindi, nell'esempio appena descritto, il sistema riparte dalla pagina 80 e deve stampare solo quattro pagine per raggiungere la pagina richiesta dall'utente. Qualora sia necessario ristampare tutto il book ed il book sia contenuto in una videata occorre chiamare il metodo Refresh che elimina le copie conservate in memoria e chiede al book di ristampare tutte le pagine fino a quella desiderata.
- Qualora il book sia mostrato in una videata e l'utente desideri vedere una pagina in particolare è possibile chiamare la procedura Print con entrambi i parametri valorizzati a tale valore (come mostrato nell'esempio di codice). Il sistema partirà dall'ultima pagina conservata in memoria precedente alla pagina richiesta e stamperà solo le pagine mancanti. Al termine della stampa verrà mostrata all'utente la pagina richiesta.
Esempio di codice
// Vado alla pagina cliccata
// *************************
public void ProdottiCategorieBook.VaiAPagina(
int NumeroPagina // Pagina a cui andare
)
{
// Chiedo al book di stampare la pagina su cui ho cliccato
ProdottiBook.Print(NumeroPagina, NumeroPagina)
}
Ultima modifica: 24/08/2022 / Validità: da 6.5.2680