sergio58 (Normal User)
Rookie
Messaggi: 38
Iscritto: 05/08/2008
|
Debbo inviare il numero di pagine elaborate in un'evento _printPage, ad un form2 in cui è presente un printpreviewcontrol.
Dalle ricerche fatte risulta che debbo effettuare una prima elaborazione dell'evento _printPage per accertare il numero di pagine elaborate.
Ed una seconda elaborazione , vera e propra, per stamparla.
Dovrei usare(sembra) la classe eventArgs,ma non sò da dove iniziare.
Potreste darmi un'aiuto ?
sergio
|
|
Il Totem (Admin)
Guru^2
Messaggi: 3635
Iscritto: 24/01/2006
|
La classe EventArgs è la classe base da cui derivano tutti gli altri event args (ossia "event arguments"), che sono sempre, per convenzione, contenuti nel parametro "e" di ogni evento.
L'evento PrintPage fornisce un "e" di tipo PrintPageEventArgs, se non ricordo male, e da questo non puoi sapere quante pagine da stampare ci sono. Il motivo è molto semplice. Se è il programmatore a decidere dove e come ogni cosa venga stampata, appunto definendo il codice di PrintPage, come farebbe il computer anche solo a stimare il numero di pagine occorrenti quando esso può cambiare ad ogni minimo dettaglio (ad esempio se ci sono degli If nel codice di stampa)?
Tu puoi solo impostare e.HasMorePages su True se, arrivato alla fine della pagina, vedi che c'è altro da stampare, e magari incrementare un contatore per sapere quante pagine hai processato, ma questo numero lo saprai solo alla fine del processo.
|
|
sergio58 (Normal User)
Rookie
Messaggi: 38
Iscritto: 05/08/2008
|
Mi sono documentato nel frattempo, dovrei usare il metodo OnPrintPage per generare l'evento PrintPage tramite una classe derivata.
Però oltre alla dichiarazione presente nella guida non sò andare.
Potresti passarmi un pò di codice di esempio ?
Sergio
|
|
Il Totem (Admin)
Guru^2
Messaggi: 3635
Iscritto: 24/01/2006
|
Non ho capito cosa vuoi fare. Perchè creare una classe derivata? e derivata da cosa?
|
|
safhkit (Normal User)
Newbie
Messaggi: 4
Iscritto: 18/02/2009
|
avrei un problema simile con il printPage: in pratica provo a stampare una pagina (in un print preview). Se devo stampare una pagina non ho problemi. Se devo stampare più pagine (supponiamo per semplicità anche solo 2) quello che succede (senza aver usato HasMorePages=true) è che gli altri dati mi vengono stampati sulla stessa pagina (la prima, per es.). Quindi penso che il problema sia far capire all'applicazione quando una pagina è terminata e spingerla a creare una nuova pagina vuota nella quale continuare la stampa degli altri dati.
Ho provato con HasMorePages=true, ma l'effetto è lo stesso: l'unica differenza è che non ho più la prima pagina contenente tanti dati sovrascritti, ma molte pagine IDENTICHE che sono una copia della prima pagina (sempre con le sovrascizioni come detto precedentemente).
Quindi, ricapitolando, mi servirebbe un comando che dica all'appplicazione quando può considerare la stampa della prima pagina OK e quindi farmi vedere (se serve) un'ulteriore pagina vuota nella quale poter stampare.
Aiuto!!!
|
|
sergio58 (Normal User)
Rookie
Messaggi: 38
Iscritto: 05/08/2008
|
Il tuo problema è diverso dal mio ,per organizzare la stampa in una seconda pagina devi dichiarare come static le variabili che portano avanti il processo di stampa.
Perchè ogni volta che stampa una nuova pagina l'evento si ripete, e vengono azzerat le variabili,invece se le dichiari come static ,vengono incrementate.
|
|
Il Totem (Admin)
Guru^2
Messaggi: 3635
Iscritto: 24/01/2006
|
In effetti è un po' OT, e in ritardo di un mese. Comunque, ricorda che HasMorePages = true dice soltanto che l'evento deve ripetersi poiché ci sono altre pagine da stampare. E' logico che, se l'evento si ripete e il codice al suo interno è lo stesso, la pagina verrà stampata uguale. Quello che devi fare, come dice giustamente sergio, è usare una variabile statica che inidichi lo stato di lettura a cui sei arrivato (ad esempio un Indice, che dica quanti dati hai stampato): la routine dovrà quindi prendere tale variabile static come inizio e procedere. Ricordati di azzerare questa variabile quando sei certo che non si siano ulteriori dati da stampare, o alla prossima stampa potrebbe generare un'eccezione di tipo IndexOutOfRangeException.
|
|
safhkit (Normal User)
Newbie
Messaggi: 4
Iscritto: 18/02/2009
|
Scusatemi per l'OT: pensavo fosse lo stesso problema. Ho bisogno di un chiarimento:
io devo definire una variabile statica che mi dice, ad es. dove sono arrivato con i dati da stampare, OK.
Ma questa variabile statica va inizializzata in una funzione diversa dalla printPage? (magari da una funzione che poi richiami la printPage?)
Se è così vuol dire che devo richiamare la printPage tante volte per quante sono le pagine da stampare. Ho capito bene?
E un ultima cosa: se devo richiamare la printPage per ogni pagina da stampare l'applicazione lo capisce da sola che nella print preview queste pagine da stampare sono sequenziali?
PS. Quindi non esiste un comando che permette di specificare "pagina corrente OK per la stampa" e l'applicazione passa alla successiva (se ho altri dati), mandando la precedente allo spooler?
Grazie
|
|
sergio58 (Normal User)
Rookie
Messaggi: 38
Iscritto: 05/08/2008
|
Le variabili static vanno definite nell'evento _PrintPage
Il richiamo dell'evento _PrintPage avviene automaticamente fino a quando HasMorePages = true .
Quando arrivi all'ultima pagina metti a false
HasMOrePages
|
|