Pronti? Partenza, Stampa!
Enrico Granata  atgrana@tin.it
Terza parte

Avete comprato la cartuccia come vi avevo detto?

No? Male, molto male

Dopo tanta teoria...Print

Se ricordate la scorsa lezione fu prettamente teorica e di stampanti non si è parlato molto, adesso rimedierò velocemente e poi passeremo ad altri argomenti

Come prima cosa...iniziamo a chiedere all’utente cosa stampare

Dim CosaDevoStampare$

1 CosaDevoStampare$=InputBox("Cosa devo stampare? EXIT per terminare, QUIT per annullare, FORWARD per iniziare una nuova pagina")

Se avete notato abbiamo dato all’utente tre comandi EXIT, FORWARD e QUIT, che corrispondono a tre metodi di Printer che esamineremo oggi

Adesso iniziamo a dire Ciao alla stampante, anche se questo va prima della dichiarazione della nostra stringa

Printer.NewPage

Dopo la linea 1 inseriamo questo

Select Case CosaDevoStampare$

Case "EXIT"
Exit Sub

Case "QUIT"
Case "FORWARD"

Case Else

Printer.Print CosaDevoStampare$ & vbNlCr

Goto 1

End Select

Se avete notato abbiamo inserito solo la clausola di codice relativa ad Exit ed Else

Prima che vi chiediate perchè vi rispondo io, perchè gli altri sono metodi di Printer che ora ci accingiamo ad esaminare

Printer.KillDoc

Questo metodo annulla l’operazione corrente( a noi non servirà )

Osserviamo:

FILE SCRITTO CON EDIT

Gentilissima professoressa,

la prego di giustifiare il ritardo di mio figlio Enrico dovuto a cause di salute

Cordiali Saluti,

Attilio Granata

FINE FILE SCRITTO CON EDIT

Mando in stampa questo file, ma poi mi accorgo che ci manca una cosa: come fare?
Dopo 20 secondi la stampante ha scritto

Gentilissima professoressa,

la prego di giustifiare il ritardo di mio figlio Enrico dovuto a cause di salute

Cord

Adesso, se cancellasi correrei un rischio: che mentre il KillDoc arriva la stampante finisca il suo lavoro, ma...ci proviamo

iali Saluti,KILLDOC

Il nostro metodo è arrivato e la stampante ha cessato di funzionare, adesso possiamo aggiungere tutto ciò che volevamo e ristampare

Printer.EndDoc

Stavolta abbiamo questo testo

Gentilissima professoressa,

la prego di giustifiare il ritardo di mio figlio Enrico dovuto a cause di salute

Sono inoltre a conoscenza del fatto che oggi l’uscita sarà anticipata alle ore 12.00, invece che alle 13.00 come è normale

La prego pertanto di permettere a mio figlio Enrico di uscire a questa nuova ora dalla scuola

Cordiali Saluti,
Attilio Granata

Mandiamo in stampa e otteniamo

Gentilissima professoressa,

la prego di giustifiare il ritardo di mio figlio Enrico dovuto a cause di salute

Sono inoltre a conoscenza del fatto che oggi l’uscita sarà anticipata alle ore 12.00, invece che alle 13.00 come è normale

La prego pertanto di permettere a mio figlio Enrico di uscire a questa nuova ora dalla scuola

Cordiali Saluti,
Attilio Granata

Ma il foglio resta nella stampante e NON esce, almeno finchè non arriva

ENDDOC

Perchè il foglio non usciva?
Perchè la stampante credeva che il documento continuasse ancora, ENDDOC la ha invece avvisata della sua fine

Printer.NewPage

Se ricordate la nostra prima operazione fu Printer.NewPage, nel caso del comando Forward dobbiamo ancora usare questo metodo, che espelle la pagina corrente e ne prepara una nuova alla stampa


Ecco la nostra routine completa

Public Sub Stampa()

Printer.NewPage

Dim CosaDevoStampare$

1 CosaDevoStampare$=InputBox("Cosa devo stampare? EXIT per terminare, QUIT per annullare, FORWARD per iniziare una nuova pagina")

Select Case CosaDevoStampare$

Case "EXIT"
Exit Sub

Case "QUIT"

Printer.EndDoc

Exit Sub
Case "FORWARD"

Printer.NewPage

Case Else

Printer.Print CosaDevoStampare$ & vbNlCr

Goto 1

End Select

End Sub

Se avete qualcosa da stampare divertitevi con questa nostra routine che tra poco estenderemo con IMAGE ( se avete letto la serie sul Parsing saprete già come aggiungere IMAGE x alla nostra Select Case, altrimenti attendete)

Una immagine, tante immagini

Printer.PaintPicture immagine, x1, y1, larghezza1, altezza1, x2, y2, larghezza2, altezza2, codiceop

La sintassi di questo metodo, copiata dalla guida di VB è il metodo per stampare immagini

Immagine: è l’immagine da stampare, deve essere una proprietà Picture

X1-Y1: L’inizio della stampa sul foglio

Larghezza1, Altezza1, Larghezza2, Altezza2: valori facoltativi, altezza della sorgente e della destinazione del nostro lavoro di stampa ( ometteteli )

X2-Y2: ritaglio all’interno di immagine ( ometteteli )

CodiceOP: operazioni grafiche da eseguire su immagine, i valori sono presenti nell’SDK, ma non nella guida di VB ( di solito si può omettere )

Possiamo passare all’opera

Picture1.Picture=LoadPicture("ENRALE.BMP")

...

Printer.Print Picture1.Picture 0,0 ‘Dall’inizio del foglio

...

Printer.EndDoc

Questo è sufficiente, e se ENRALE.BMP fosse

noi sul nostro foglio avremmo ENRALE.BMP stampato esattamente così

Io ho usato (0,0), ma voi di solito userete

Printer.CurrentX+x, Printer.CurrentY+y

Dove CurrentX e CurrentY indicano la posizione corrente sull’asse delle X e su quello delle Y, mentre X e Y indicano delle costanti da sommare

Se vi ricavaste l’asse X e Y dopo la stampa dell’immagine ne potreste stampare un’altra subito sotto ( utile se il vostro programma gestisce una raccolta di immagini )

Quando uso il termine asse X e Y sembrerà ovvio il richiamo agli assi cartesiani, ed in fondo c’è una relazione, solo che valori negativi non sono ammessi, insomma solo il 2° quadrante è valido perchè esso è + +, mentre il primo è - +, il terzo è - -, il quarto è + -

Se non ricordate un piano cartesiano eccolo

 


In questo piano cartesiano l’area verde è il nostro foglio, mentre quella rossa è l’area non stampabile, poichè una o più sue coordinate sono negative, mentre nell’area verde abbiamo + +, e cioè un’area reale

Non esiste nessun punto (-4;+6) nella realtà, dov’è -4 sul nostro foglio se 0 è il alto a sinistra

Quell’ellise bianco è 0;0 che come vedete è il punto di base
Se su questo foglio abbiamo che l’ellisse giallo è 50, 50 siamo sicuri che un punto -1;0’ non esiste poichè sarebbe antecedente al primo punto valido dell’insieme

Torniamo all’informatica

Dopo questa discussione matematico-informatica possiamo ritornare alla nostra stampante

Poniamo il caso che ci serva sapere se nei 2 cm che ci restano sul foglio riusciamo a stampare in Courier New a 12 Pixel "SONO MOLTO FELICE CHE TU SIA POTUTO VENIRE A SALUTARMI, MARK"

Innanzitutto facciamoci dire da VB l’altezza nell’unità di misura della stampante

Dim Testo As Integer

‘Impostazione del font, la lascio a voi

Testo=Printer.TextHeight("SONO MOLTO FELICE CHE TU SIA POTUTO VENIRE A SALUTARMI, MARK")

Dim PrinterScale As Integer
PrinterScale=Printer.ScaleMode

Dim CentimsHeight As Integer

CentimsHeight=Printer.ScaleX(Testo, PrinterScale, vbCentimeters)

If CentimsHeight<2 Then

Printer.Print "SONO MOLTO FELICE CHE TU SIA POTUTO VENIRE A SALUTARMI, MARK"

Else

Printer.NewPage

Printer.Print "SONO MOLTO FELICE CHE TU SIA POTUTO VENIRE A SALUTARMI, MARK"

End If

Il mago del VB

Come rendere più compatto tutto questo?

Dim Testo As Integer

‘Impostazione del font, la lascio a voi

Testo=Printer.TextHeight("SONO MOLTO FELICE CHE TU SIA POTUTO VENIRE A SALUTARMI, MARK")

Dim PrinterScale As Integer
PrinterScale=Printer.ScaleMode

If Printer.ScaleX(Testo, PrinterScale, vbCentimeters)<2 Then

Printer.Print "SONO MOLTO FELICE CHE TU SIA POTUTO VENIRE A SALUTARMI, MARK"

Else

Printer.NewPage

Printer.Print "SONO MOLTO FELICE CHE TU SIA POTUTO VENIRE A SALUTARMI, MARK"

End If

Dim Testo As Integer

‘Impostazione del font, la lascio a voi

Testo=Printer.TextHeight("SONO MOLTO FELICE CHE TU SIA POTUTO VENIRE A SALUTARMI, MARK")

If Printer.ScaleX(Testo, Printer.ScaleMode, vbCentimeters)<2 Then

Printer.Print "SONO MOLTO FELICE CHE TU SIA POTUTO VENIRE A SALUTARMI, MARK"

Else

Printer.NewPage

Printer.Print "SONO MOLTO FELICE CHE TU SIA POTUTO VENIRE A SALUTARMI, MARK"

End If

If Printer.ScaleX(Printer.TextHeight("SONO MOLTO FELICE CHE TU SIA POTUTO VENIRE A SALUTARMI, MARK")

, Printer.ScaleMode, vbCentimeters)<2 Then

Printer.Print "SONO MOLTO FELICE CHE TU SIA POTUTO VENIRE A SALUTARMI, MARK"

Else

Printer.NewPage

Printer.Print "SONO MOLTO FELICE CHE TU SIA POTUTO VENIRE A SALUTARMI, MARK"

End If

Dopo varie modifiche una super-funzione che ha raccolto tutto è stata scritta e adesso possiamo anche farci qualcosa di costruttivo, osservate

Public Sub CanPrint(Text$, Cms%)

If Printer.ScaleX(Printer.TextHeight(Text$)

, Printer.ScaleMode, vbCentimeters)<Cms% Then

Printer.Print Text$

Else

Printer.NewPage

Printer.Print Text$

End If

Se invece volessimo una funzione booleana potremmo ritornare True se l’If è True, False altrimenti

Per questa volta abbiamo finito, la prossima volta ultima grafica e qualche proprietà più avanzata