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