Newsgroup: it.comp.lang.visual-basic
Titolo: [?] Selezionare le pagine da stampare

Ho un programma in cui stampo un report utilizzando l'oggetto Printer.
Lo schema della procedura di stampa è questa.
StampaFrontespizio
StampaIntestazione
For I = 1 To NRighe
   If Printer.CurrentY + AltezzaRiga(I) > PosizioneMax Then
      StampaPièPagina
      Printer.NewPage
      StampaIntestazione
   EndIf
   StampaRiga I
Next I
StampaPièPagina
Printer.EndDoc
Il cliente mi ha chiesto di poter stampare anziché tutto il documento
solo una pagina o una serie di pagine. Come fare?
Naturalmente le varie "righe" (in realtà ogni "riga" è una voce che può
anche occupare più righe) hanno altezze diverse, altrimenti potrei
sapere quante ce ne stanno in un foglio e con un semplice calcolo sapere
il numero della prima riga di un foglio. Inoltre la funzione AltezzaRiga
fornisce un valore approssimato, che per il controllo a fine pagina va
bene, ma non sarebbe adatto per determinare il punto di fine pagina con
una somma.
Avevo pensato di stampare le varie pagine normalmente, ma finita una
dare un Printer.AbortDoc anziché un Printer.NewPage prima di passare
alla successiva, memorizzando in una variabile il numero delle pagine
"stampate", per poter sapere in quale momento effettuare un vero
Printer.NewPage, ma non mi sembra una soluzione molto pulita.
Grazie a tutti in anticipo.
-- 
Samuele Battarra
prova il mio newsreader:
http://digilander.iol.it/battarsa/programmi/news/

dare un Printer.AbortDoc
Ma non è Printer.KillDoc ?
Poi...invece di usare una variaile per contare le pagine...usa la proprieta Printer.Page!
Cmq mi aggrego alla domanda..perchè anche io ho questo problema!
Caio SIMO
--
__________________
www.sasim.net
Vb è relativamente semplice perchè c'è MSDN!
Sito Comune Ng: 
http://www.it-lang-vb.net
Manifesto del Ng: 
http://www.it-lang-vb.net/docs/Manifesto.txt


 una somma.
Ciao...
non ho ben capito il problema della questione lunghezza di ogni pagina...
cioé tu la riempi fino a che c'è spazio no? (posizioneMax) ma tu questa la
consideri la n-esima pagina (fisicamente stampabile)
o la n-esima pagina termina quando hai stampato effettivamente tutto il
contenuto (che so, una scheda...che potrebbe risultare
più lunga di PosizioneMax) ???? e quindi una pagina da stampare può anche
contenere più pagine stampate...è un po' astruso lo so... :-))
Nel secondo caso, a parte il discorso VB, come può il cliente sapere quali
sono le pagine che gli interessa stampare realmente???
Adesso a parte questo discorso che ripeto non mi è chiaro.... 
in generale non potresti usare un array di boolean
in cui memorizzi true/false secondo che la pagina sia
da stampare o meno e prima della routine di stampa controlli il valore????
(questo discorso dovrebbe funzionare in entrambi i casi.... es. il cliente
vuole le pagine 1,3,6,7,8 o il cliente vuole le schede, contenenti magari
più pagine, 1,2,5,6,9....)
E' un'idea...spero sia valida... ;-)
Ciao
Andy
-- 
Posted from  [62.205.142.216] 
via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 
Nella versione originale faccio così.
Nella soluzione proposta non funziona perchè quando annulli la stampa
la proprietà riparte da 1.


 più pagine, 1,2,5,6,9....)
No, non hai capito.
Il problema non è sapere quali pagine devo stampare o meno.
Il problema è, ad esempio, devo stampare solo la pagina 3.
Stampo l'intestazione e poi? Quale riga devo stampare?


 ha scritto nel messaggio
news:AZYv7.42253$0Y2.3...@news.infostrada.it...

Ciao...
scusa non te la prendere se non riesco a capire bene...
tu hai da stampare N righe.... giusto?
Es.
nella prima pagina ci sono 3 righe...
nella seconda 7 righe...
nella terza 5 righe...
nella quarta 10 righe...
nella quinta 8 righe....
Ogni .NewPage è chiaro che incrementi il numero della pagina attuale...
tu vuoi stampare solo la pagina 4...
quindi iniziare la stampa dalla 16 riga giusto???
Con il tuo ciclo e l'array di boolean cosa c'è che non funziona?
Tu conti le prime 3 righe della pagina 1 (come se dovessi stamparle...ma non
le stampi realmente
essendo paginadastampare(1)=false...), le 7 della pagina 2 (e anche queste
non le stampi)
le 5 della pagina 3 (e non le stampi)....arrivi alla riga 16 e inizi
fisicamente a stampare, oltre che continuare il tuo
ciclo incrementale sulle righe...
Poi magari continuo a non capirci niente :-)))
Ma se tu dai al cliente la possibilità di scegliere quale pagina vuole
stampare...
con il tuo ciclo non calcoli automaticamente la prima riga della pagina da
stampare effettivamente???
Ti chiedo nuovamente scusa se non ho capito bene e se la mia soluzione
non è quella che possa effettivamente risolvere il tuo problema... :-)
Ciao
Andy
-- 
Posted from  [62.205.142.150] 


 quindi iniziare la stampa dalla 16 riga giusto???
Come ti ho appena detto, non so qual è la prima riga di una pagina.
Quello che forse non è chiaro è questo.
Quelle che ho infelicemente chiamato "righe", sono in realtà delle voci,
dei blocchi di testo.
Ognuno di questi blocchi può essere composto in stampa di più righe,
ognuna delle quali può avere font e dimensioni diverse.
Esempio, i | iniziali servono per distinguere meglio i vari blocchi
|Titolo (Arial grassetto 14pt)
|Descrizione (Times New Roman grassetto corsivo 12pt)
|
|Dettaglio (Times New Roman 12pt)
|Dettaglio (Times New Roman 12pt)
|Dettaglio (Times New Roman 12pt)
|Dettaglio (Times New Roman 12pt)
|Titolo (Arial grassetto 14pt)
|Descrizione (Times New Roman grassetto corsivo 12pt)
|Descrizione (Times New Roman grassetto corsivo 12pt)
|
|Nota (Times New Roman 10pt)
Come dicevo nel post originale, una soluzione l'ho trovata, solo che non
mi piace. Praticamente eseguo comunque la stampa della pagina, quando
arrivo alla fine controllo, la pagina appena generata era da stampare?
Se si Printer.NewPage altrimenti Printer.KillDoc.
Un'altra soluzione potrebbe essere quella di migliorare la funzione che
calcola l'altezza di una voce, ma al momento non sono in grado.


 ha scritto nel messaggio
news:j3Gw7.421$g42....@news.infostrada.it...

Ciao...
innanzitutto scusa se il mio intervento non è di molto aiuto...io dovrei essere
più tra quelli che fanno domande che tra quelli che danno risposte eh eh
essendo agli inizi...ma magari provare insieme a giungere ad una soluzione può
essere comunque un modo per imparare no?
Adesso il tuo problema è più chiaro (nonchè più complicato)... tu vuoi una
sorta di controllo delle "righe isolate" come in Word...non vuoi cioé spezzare
una "frase" tra una pagina e l'altra ma mantenere gli elementi di ogni blocco
insieme sulla stessa pagina...giusto?
Il problema principale penso sia il calcolo dell'altezza di un blocco...
immagino, anche se non lo dici, che per ogni riga di testo che stampi
incrementi il currentY di un tot differente tra righe stampate con un font di
14 e righe stampate con un font di 12....
Questo lo ipotizzo...io avrei fatto così per dare maggiore uniformità allo
stampato...non sarebbe bello avere la stessa interlinea per due corpi
differenti no? Poi magari supponiamo che aggiungi anche uno spazio ulteriore
tra ogni blocco....
Il fatto è vedere se l'attuale CurrentY esce dalla pagina...
Ti espongo la mia idea... se fa schifo mi dispiace (è un tentativo) :-)))
Evitiamo a priori di stampare....
Usa ad esempio l'oggetto picture (invisibile) invece dell'oggetto printer...
Potresti provare a fare una cosa del genere...
pagina=1
picture1.scalemode=7
for i=1 to Nblocchi (quelli che tu chiamavi Nrighe)
 
    picture.currentY=iniziopagina (es. 2 cm)
    bloccopagina(i)=pagina    
        'ciclo di stampa delle righe del blocco i
        picture.print rigajblocco(i)
        picture.currentY=picture.currentY+interlinea
            if currentY (della j riga del blocco i) > Limiteinferioredistampa
            'se cioè il blocco i esce dal foglio
                i=i-1  'rinizio a "stampare" il blocco
                pagina=pagina+1    'su una nuova pagina
                picture1.cls
               exit ciclo   'esco dal ciclo di stampa
            end if
    'loop ciclo
    next i
adesso a parte lo pseudo-codice incasinato che ho abbozzato...
(che diamo per scontato funzioni eh eh)
l'idea è di stampare tutto lo stampabile su una picturebox (delle stesse
dimensioni di un foglio, naturalmente)...
andando a memorizzare in quale pagina ogni blocco dovrebbe
essere stampato su stampante (nell'array bloccopagina)...
così quando vuoi realmente stampare su stampante è sufficiente
controllare l'array bloccopagina per sapere quali blocchi stampare
secondo la pagina desiderata.
La cosa bella è, se il tutto funziona, che non te importa se sulla n-esima
pagina hai "stampato" anche parti del blocco che andrebbe stampato
sulla successiva (n+1)...in quanto nell'array bloccopagina verrà memorizzato
effettivamente n+1 e non n... (e quindi risolvi il problema KillDoc)
A occhio il tutto non funziona se un singolo blocco è più lungo di una
pagina...
dovrebbe iniziare a loopare incrementando continuamente il numero di pagina...
ma questo è un problema che hai anche attualmente e che magari sai
che non può verificarsi a priori avendo limitato il numero di righe
per blocco (ad es.)... altrimenti ci andrebbe qualche controllo ulteriore...
L'idea mi è venuta in 5 minuti...quindi può darsi che sia tutto sballato,
l'uso della picturebox non ti aggradi, sia lentissimo, magari non funziona
niente... però se hai un po' di tempo e provi ad aggiustarla, forse
qualcosa di buono puoi tirarlo fuori... :-)))
Fammi sapere...
Ciao
Andy
-- 
Posted from  [62.205.149.128] 


 
Questo sistema l'avevo usato agli inizi della mia "carriera" per
stampare delle righe con il testo allineato a destra, quando ancora
non avevo scoperto la funzione TextWidth.
Devo dire che funzionava ma non benissimo.
Cioè le righe venivano si allineate, ma non perfettamente, tra una e
l'altra c'era uno scarto che arrivava a circa un millimetro.
Usando lo stesso sistema per l'altezza, dovendo lavorare su dimensioni
maggiori ho paura che gli scarti si accumulino portando ad errori non
più accettabili.


 più accettabili.
si, ma la mia idea era comunque di calcolare l'altezza di un blocco... 
pensavo che tu potessi controllare meglio il Currenty....ma
anche usando il textHeight è uguale il concetto...
se l'n-esimo blocco non sta più nella picture (e conseguentemente nel foglio)
e lo si stampa nuovamente nella picture (e nel foglio) seguente
non dovresti avere problemi di "accumulo" di scarti no?
potrebbe succedere con una stampante a rullo...ma, se hai visto, nella
mia "soluzione" resettavo ogni volta il margine superiore e quindi
automaticamente l'eventuale errore (di pochi mm comunque in una pagina, stando
anche a quello che dici tu...) si sarebbe riazzerato....
Però non mi hai detto cosa pensi (sinceramente) della soluzione
proposta (quella della picture...io la uso per l'anteprima di stampa)
mi farebbe piacere un giudizio, anche per adottarla io stesso
in futuro in attesa di qualcosa di meglio :-))))
Ti auguro di risolvere comunque durante il we :-)
Ciao
Andy 
-- 
Posted from 
h255-16-102.rm1.albacom.net
 [213.255.16.102] 


 
In un caso come il tuo dove serve per un'anteprima, che in fondo è solo
una visualizzazione, può andare bene perchè anche se ci sono delle
leggere differenze sul video... chi se ne frega! Nel momento in cui però
devi usare le misure che ne ricavi per decidere quando andare a capo,
non la vedo più come una soluzione adatta.
