Newsgroup: it.comp.lang.visual-basic
Titolo: Quiz a oggetti

Il codice riportato qui sotto proviene dal sito-Forum 
VB.NET
.
E' ricco di esempi di ogni tipo.
Affascinato dal fatto di risolvere il mio problema con sole 27 righe di 
codice (di cui 10 commenti), l'ho copiaincollato e messo nel compilatore 
  Visual Basic 2008 Professional.
Il programma causa la scrittura di cinque righe, una per ogni pagina. In 
tutto si hanno cinque pagine perfette.
(Quindi, a rigor di logica, una istruzione 'new Page' deve intervenire 
inqualche modo cinque volte).
Ora, nella pia illusione di poter finalmente capirci qualcosa di piï¿œ
nelle classi usate nell'esempio, ho voluto fare dei test, cioï¿œ 
modificando qui e la, togliendo uno statement  e dopo rimetterlo, per 
vedere il comportamento del programma.
La mia indagine era rivolta a capire *che cosa* causa, in questo 
esempio, il salto di pagina.
(Se voi pensate che sia causato dagli HasMorePages  vi sbagliate di 
grosso. Provate a toglierli, interescambiarli, rimetterli, sarete 
sorpresi dalla varietï¿œ di comportamento illogico).
Ebbene, se qualcuno, modificando questo esempio, riesce a far stampare 3 
righe su una pagina e le restanti due righe sulla seguente, mi ha 
aiutato definitivamente a trovare quello che cercavo.
(E se passa da Genova ha vinto una cena in un ristorante eccellente in 
riva al mare).
Grazie per l'attenzione.
----------------------------------------------------------------------------
Private Sub btnPrint_Click(ByVal sender As System.Object, ByVal e As 
System.EventArgs) Handles btnPrint.Click
     Dim prn As New Printing.PrintDocument
     ' Select the PDF Printer
     prn.PrinterSettings.PrinterName = "pdf995"
     ' Handle the page events
     AddHandler prn.PrintPage, AddressOf Me.PrintPageHandler
     ' Do the print (Printing handled by the print page handler)
     prn.Print()
     ' Remove the page handler
     RemoveHandler prn.PrintPage, AddressOf Me.PrintPageHandler
End Sub
Private Sub PrintPageHandler(ByVal sender As Object, ByVal args As 
Printing.PrintPageEventArgs)
     Static i As Integer = 0
     i = i + 1
     ' Print a line on this page
     args.Graphics.DrawString("Printed a Line on page " & i.ToString, 
New Font(Me.Font, FontStyle.Regular), Brushes.Black, 50, 50)
     ' Have we printed enough pages?
     If i >= 5 Then
         ' Done all the pages
         i = 0
         args.HasMorePages = False
     Else
         ' Not finished, yet
         args.HasMorePages = True
    End If
End Sub
-------------------------------------------------------------------------------

 dalla varietá di comportamento illogico).

Il funzionamento è questo: quando invochi Print sull'oggetto PrintDocument, 
se hai impostato l'event handler (ossia la callback) PrintPageHandler, 
succede che alla prima pagina da stampare ti viene "automaticamente" 
richiamata la sub PrintPageHandler (penso che tu sappia cos'è una callback).
Se in questa specifichi args.HasMorePages = True, fai capire all'oggetto 
PrintDocument che la callback deve essere richiamata ancora perché c'è 
almeno un'altra pagina da stampare.
In pratica, la "new page" non è invocata esplicitamente dal codice in modo 
"imperativo" (come avresti fatto con Printer di VB6), ma è l'oggetto 
PrintDocument che ti mette a disposizione un evento con cui il tuo programma 
indica se e quando ci sono ancora pagine da stampare.
Secondo me a questo punto dovresti essere in grado di proseguire da solo.
Altrimenti posso comunque postarti il codice per rispondere al "quiz".
Bye
Raf 

In maniera molto grezza:
    Private Sub PrintPageHandler(ByVal sender As Object, ByVal args As 
Printing.PrintPageEventArgs)
        Static i As Integer = 0
        i = i + 1
        ' Print a line on this page
        Select Case i
            Case 1
                args.Graphics.DrawString("Pippo", New Font(Me.Font, 
FontStyle.Regular), Brushes.Black, 50, 50)
                args.Graphics.DrawString("Pluto", New Font(Me.Font, 
FontStyle.Regular), Brushes.Black, 50, 150)
                args.Graphics.DrawString("Topolino", New Font(Me.Font, 
FontStyle.Regular), Brushes.Black, 50, 250)
            Case 2
                args.Graphics.DrawString("Paperino", New Font(Me.Font, 
FontStyle.Regular), Brushes.Black, 50, 50)
                args.Graphics.DrawString("Paperoga", New Font(Me.Font, 
FontStyle.Regular), Brushes.Black, 50, 150)
        End Select
        ' Have we printed enough pages?
        If i >= 2 Then
            ' Done all the pages
            i = 0
            args.HasMorePages = False
        Else
            ' Not finished, yet
            args.HasMorePages = True
        End If
    End Sub
--------
    Alex
P.S. Quale sarehbe il ristorante eccellente in riva al mare? 


Forse non ho capito cosa vuoi fare.
Prova:
Prova:
    Private Sub PrintPageHandler(ByVal sender As Object, _
        ByVal args As Printing.PrintPageEventArgs)
        Static i As Integer = 0
        Dim y As Integer
        Dim s As String = ""
        i = i + 1
        If i <= 1 Then
            For y = 1 To 3
                s = s & "Printed a Line " & y & _
                    " on page " & i.ToString & Environment.NewLine
            Next
            args.Graphics.DrawString(s, _
                New Font(Me.Font, FontStyle.Regular), Brushes.Black, 50, 50)
            args.HasMorePages = True
        ElseIf i = 2 Then
            s = ""
            For y = 1 To 2
                s = s & "Printed a Line " & y & _
                    " on page " & i.ToString & Environment.NewLine
            Next
            args.Graphics.DrawString(s, _
                New Font(Me.Font, FontStyle.Regular), Brushes.Black, 50, 50)
        ElseIf i >= 2 Then
            i = 0
            args.HasMorePages = False
        End If
    End Sub
-- 
---------------------------
Mauro Gamberini
Microsoft MVP - Excel
http://www.riolab.org/
http://www.maurogsc.eu/
http://social.microsoft.com/Forums/it-IT/excelit/threads
 
__________ Informazioni da ESET NOD32 Antivirus, versione del database delle firme digitali 4956 (20100318) __________
Il messaggio è stato controllato da ESET NOD32 Antivirus.
www.nod32.it

 almeno un'altra pagina da stampare.
grazie della spiegazione. Anche tu puoi partecipare alla 'premiazione'
così come tutti quelli che hanno dato una risposta o postato gentilmente 
codici di esempio (come PaF su it.informatica) :-))

 
Uno di quelli tra la Foce e Nervi, a scelta :-)))


Do un'idea a chi ha vito il premio.
Ce n'è uno in cui sono stato l'estate scorsa, non ricordo il nome ma era
proprio in quella zona.
Si scende a mangiare giù, in delle grotte negli scogli.
Non eccessivamente costoso (per essere a Genova, ovviamente), non male
il cibo, molto particolare il posto.
Nicola


Ce ne sono una caterva ma proverò a chiedere in giro. La faccenda delle 
'grotte' non mi dice granchè perchè io non ci sono mai stato. Però sono 
stato in molti, in quella zona.
Tutti quelli che hanno mandato la soluzione giusta, mi contattino pure a 
questa email, in modo da fare un appuntamento che vada bene a tutti.
Sarò lieto di ottemperare al mio impegno :-)


Portali al 5 Maggio allora, fai bella figura con gli ospiti, loro
mangiano bene e, perchè no, costa pure il giusto.
Tra "prove" di matrimonio/matrimonio di mia sorella, e amici vari, ci
sono stato fin troppe volte ;-)

 sono stato fin troppe volte ;-)
Ci sono stato un mese fa con un amico. Ottimo. Al giovedì fanno la 
paella. Vicino al Monumento di Quarto.  E' quello ???
Beh, se qualcuno si fa sentire, organizziamo una data (sarà 'dopo' 
Pasqua perchè prima sono fuori Genova per una settimana)  :-))

 paella. Vicino al Monumento di Quarto.  E' quello ???
Proprio quello

 P.S. Quale sarehbe il ristorante eccellente in riva al mare?
Penso che sarà il '5 Maggio'. Preparati ad una cena subito dopo Pasqua, 
assieme a Mauro e Luca. :-))
John.



Anche qui ho cambiato solo il Font sostituendolo con RTB1.Font ed ï¿œ 
girato senza problemi.
Mi incuriosisce il metodo che usi : Environment.Newline, il quale ti 
permette di NON modificare le coordinate di stampa di Drawstring (50,50).
Non ho capito esattamente come funziona, ma funziona egregiamente.
Anche tu preparati alla cena. (vedi risposta ad Alex).
John.


Mica tanto. Perchè il solo dire almetodo 'Print' che 'esiste un'altra 
pagina da stampare' presuppone che lui sia arrivato a fine pagina.
Altrimenti cosa fa, se lo chiede linea per linea, cioè ogni chiamata di 
e.Drawstring ?
E se se lo chiede alla fine di ogni linea, come fa a sapere che é 
arrivato a fine del 'form' (e quindi necessita di un comando NewPage) e 
che ci son altre pagine da stampare ? (Hasmorepage = true)  ?
cioè in un loop :
for i = 1 to no_of_pages
    for j = 1 to no_of_lines
       e.Drawstring(...)
    next j
next i
dove glielo infili il 'has more Page' ??
Tra il next j  ed il next j ??
Ma un 'HasMorePage' da solo non mi provoca automaticamente
il salto di pagina.
Fine-pagina e Fine-documento sono due concetti molto diversi.
Per me questo è un design fault. Assolutamente.


Ho capito adesso il concetto : tu costruisci tutta una pagina prima di 
inviarlo al e.Drawstring.
Quindi l'e.drawstring è un 'Page-printer'.
Ecco perchè ha bisogno del flag 'has more pages'.
Lo svantaggio di ciò è che ci si deve costruire la pagina ogni volta, da 
un documento multipage, ed usarlo appunto come 'print-page'.
Un concetto molto insolito a dire il vero.
Solitamente i primitives stampano 'linee', leggono 'linee' e le possono 
leggere fino all'end-of-file'.
Costruirsi tutte le pagine una per una da un Documento prima di poterlo 
stampare è una gran menata.
Comunque, una volta chiaro il funzionamento delle cose, anche le più 
astruse, si puo' continuare a lavorare.

>
Come ho scritto nel mio post precedente, mi è ora chiaro che 
e.Drawstring...è un 'Page-Printer' che *richiede* di fargli sapere se ci 
sono altre pagine da stampare, quando ha eseguito il tutto.
Questo  presuppone 'conoscere esattamente' il numero di pagine nel 
documento.
Ora, normalmente in una RichTextBox che viene scitta da un end-user a 
runtime non si sa MAI a priori.
Quindi bisogna :
- andarsi a calcolare il numero di linee nel documento, tenendo conto 
del Font.Height
- andarsi a costruire pagina per pagina, raggruppando il numero di linee 
che stanno in quel documento
- stamparle con e.Drawstring.
Un metodo ottimo, soprattutto immediato, vedo.
IMHO in confronto, il Printer.Print del VB6 era un pezzo di cioccolata.
Per fortuna ci sono altri vantaggi....

 runtime
http://msdn.microsoft.com/en-us/library/ms996492.aspx
    Alex

 assieme a Mauro e Luca. :-))
Grazie per l'offerta. Non immaginavo che fosse una proposta seria... forse
perché son genovese anch'io. :-)))
Comunque devo declinare l'invito: fra lavoro, famiglia e altri impegni,
trovare una sera libera è un'impresa.
Ciao!
    Alex


OK. Vabbé fa niente. Grazie comunque del feedback.

 ha scritto nel messaggio 
news:ho7ssj$adp$1...@nnrp.linuxfan.it...

Stavo per risponderti... ma leggendo i tuoi ultimi post mi sono reso conto 
che alla fine hai capito.
È una filosofia diversa, non c'è niente da fare.
Io comunque quando posso ho sempre evitato sia il Printer.Print di VB6 che 
il PrintDocument, sfruttando abbondantemente gli oggetti di reporting.
Questi hanno l'enorme vantaggio di permettere la costruzione del layout 
della pagina da stampare in fase di design, oltre che quello di poter avere 
una preview.
Certo, usare un ReportViewer per stampare il contenuto di un RichTextBox 
forse non è il massimo dell'eleganza, ma penso che si riesca (anche se non 
mi sento di consigliarlo).
Ciao
Raf
 

 astruse, si puo' continuare a lavorare.
...e comunque...passi tutta sta fatica per un semplice doc rtf!
Per fatture report e quant'altro.....ci sono tools appositi....spesso
a pagamento....a caro prezzo (tutto è relativo comunque)
e poi ci sono chicchine che resistono agli anni
http://reportman.sourceforge.net/
lo usavo in vb6....continua ad avere il suo perchè anche in dotNet!!!

 lo usavo in vb6....continua ad avere il suo perchč anche in dotNet!!!
...ed č pure *gratis*...:-))