Programmo Subito n. 16 - 2 Livello - Corso di Visual Basic

Il corso dedicato a Visual Basic darà spazio alla gestione della stampante. Sarà illustrato come sia possibile, agendo su alcune semplici proprietà, produrre stampe anche di alto livello

Corso di Visual Basic
La gestione della stampante

(Parte 16)

di Maurizio Crespi

Ogni sistema, di qualunque tipo o dimensione, se usato per uso professionale, è corredato da una stampante. Questa periferica, infatti, è ormai diventata una componente imprescindibile di ogni ufficio. Per questo motivo, tutti i programmatori, almeno una volta nella vita, si trovano a dover scrivere del software in grado di gestirla. In particolare, coloro che sviluppano applicazioni gestionali non possono in genere esimersi dal prevedere la rappresentazione su carta delle informazioni elaborate o archiviate. Visual Basic nel tempo si è conquistato una posizione da leader nel campo degli strumenti di sviluppo per applicazioni gestionali. Ciò è dovuto anche alla semplicità e alla flessibilità con cui permette di produrre dei tabulati.

L’oggetto Printer

In Visual Basic la stampante è rappresentata da un oggetto, denominato Printer. Tutte le operazioni devono pertanto essere eseguite su di esso. Lo scopo della lezione è di consentire al lettore di prendere confidenza con le proprietà e i metodi fondamentali che l’oggetto prevede.

Il metodo Print

Le stampanti sono nate con lo scopo di permettere la trasposizione su carta dei testi prodotti dal calcolatore. L’operazione elementare per questo tipo di periferiche è quindi rappresentata dalla scrittura di testo. L’oggetto Printer a tal fine mette a disposizione il metodo denominato Print. Il suo utilizzo ricorda quello della parola chiave omonima del linguaggio Basic. Per scrivere una frase è quindi sufficiente invocare il metodo passandogli la stringa da stampare. Ad esempio, la riga

Printer.Print "Io leggo Dev"

provoca la scrittura della frase "Io leggo Dev" sulla stampante. Analogamente, le righe

Printer.Print "Io leggo Dev"
Printer.Print "perché mi insegna a programmare"

provocano la scrittura delle frasi "Io leggo Dev" e "perché mi insegna a programmare". Esse sono poste su due righe differenti. Infatti, analogamente a ciò che avviene nel linguaggio Basic per il comando Print, alla fine della frase è generata automaticamente una sequenza costituita dai caratteri CR (Carriage Return, ovvero ritorno del carrello di stampa nella posizione di inizio riga) e LF (Line Feed, ovvero avanzamento di una riga). Ciò, tuttavia, a volte può risultare fastidioso, soprattutto quando si desidera comporre delle frasi a partire da informazioni calcolate dal programma in punti diversi.

Per evitare che sia richiesto alla stampante di andare a capo, è necessario far seguire l’invocazione del metodo Print dal punto e virgola. Le righe

Printer.Print "Io leggo Dev";
Printer.Print "perché mi insegna a programmare"

provocano pertanto la scrittura della frase

Io leggo Devperché mi insegna a programmare

Si noti che in questo caso non sono stati inseriti automaticamente degli spazi fra le parole "Dev" e "perché". È infatti cura del programmatore l’introduzione al termine di una stringa degli spazi tali da impedire che sia unita alla successiva quando ciò non è desiderato. Quindi, per scrivere la frase correttamente, è necessario aggiungere uno spazio al termine della prima stringa, come nelle righe che seguono:

Printer.Print "Io leggo Dev ";
Printer.Print "perché mi insegna a programmare"

In alcuni casi, invece, può verificarsi la necessità di inserire delle righe vuote. Per fare ciò, è sufficiente richiamare il metodo Print senza parametri. Ad esempio, la riga

Printer.Print

fa sì che la testina della stampante si posizioni sulla riga successiva a quella corrente.

L’incolonnamento dei dati

Spesso, quando si stampano dei dati, si rivela necessario il loro incolonnamento. È il caso, ad esempio, dei documenti per uso fiscale. In questi casi, l’uso delle tabulazioni può rivelarsi molto utile. Esse permettono di suddividere il foglio in colonne, ognuna larga 14 caratteri. Visual Basic permette di gestire le tabulazioni per mezzo dell’opzione Tab del comando Print. Ad esempio, le righe

Printer.Print Tab(2);
Printer.Print "Dev"

provocano la stampa della stringa "Dev" nella seconda colonna del foglio. Si noti che il parametro numerico descrive sempre una posizione assoluta. Quindi, il numero della colonna in cui la stampa avviene è indipendente dalla posizione assunta dalla testina di stampa prima dell’esecuzione dell’istruzione.
Per mezzo dell’opzione Tab non è possibile definire uno spostamento relativo, bensì solo uno assoluto. L’unica eccezione è costituita dal caso in cui il parametro numerico è omesso. La scrittura avviene allora nella colonna successiva a quella corrente o, se la testina si trova alla fine del foglio, nella riga seguente.

Pertanto, le righe
Printer.Print Tab;
Printer.Print "Dev"

fanno sì che nella colonna successiva a quella corrente sia scritta la parola "Dev".
Si noti che le colonne iniziano ogni 14 caratteri. La loro lunghezza risulta allora dipendente dal tipo di carattere utilizzato e non dalle dimensioni del foglio.

L’inserimento di spazi

Spesso, soprattutto quando si devono indicare degli importi in valuta, è opportuno allineare i testi a destra. L’incolonnamento per mezzo delle tabulazioni può in questi casi non rivelarsi una scelta corretta, dal momento che permette di allineare i testi a sinistra ma non agevola un granché l’allineamento a destra. Può allora rivelarsi utile l’uso dell’opzione Spc del metodo Print, che permette di stampare una sequenza di spazi in quantità pari al valore indicato come parametro. Calcolando opportunamente tale dato, è quindi possibile ottenere il corretto allineamento a destra del testo. Si osservi la procedura AllineaDestra di cui è riportato di seguito il codice sorgente:

Private Sub AllineaDestra(ByVal Stringa As String, ByVal LarghCol As Integer)
Dim Lungh As Integer
Dim Spazi As Integer
Stringa = Trim(Stringa)
Lungh = Len(Stringa)
Spazi = LarghCol - Lungh
Printer.Print Spc(Spazi);
Printer.Print Stringa;
End Sub

Essa provvede a stampare la stringa fornitale come parametro dopo averla fatta seguire da spazi la cui quantità è espressa dalla variabile Spazi. Il suo valore è calcolato come differenza fra il numero della colonna in cui deve avvenire l’allineamento, fornito come parametro (LarghCol) e la lunghezza della stringa da stampare. Si noti che tale procedura funziona correttamente solo se il carattere utilizzato è di tipo a spaziatura non proporzionale. In caso contrario, infatti, le larghezze dei caratteri, compresi gli spazi, risultano diverse fra loro e rendono molto più complesso l’allineamento. Al fine di ridurre il rischio di errore derivante da un cattivo allineamento delle informazioni e di rendere più semplice e veloce lo sviluppo delle applicazioni, è pertanto consigliabile l’uso di un carattere a larghezza non proporzionale (ad esempio il "Courier New") nei programmi che prevedono la stampa di tabelle o altri dati su modulistica di tipo fiscale.

L’impostazione del carattere da utilizzare

Per selezionare un carattere diverso da quello predefinito, occorre intervenire sulla proprietà FontName dell’oggetto Printer. Ad esempio, la riga

Printer.FontName = "Courier New"

fa sì che la stampa sia eseguita con il carattere "Courier New".

È inoltre possibile impostare la dimensione del font da utilizzare agendo sul valore della proprietà FontSize. L’insieme dei valori che essa può assumere è rappresentato dalle misure in punti che sono accettate dal sistema per il carattere selezionato. Per i font di tipo raster, i valori possibili sono pochi, mentre per i caratteri true type, che costituiscono la quasi totalità della dotazione di Windows, le dimensioni possono variare in un intervallo estremamente vasto. Pertanto, per impostare quello che i tipografi chiamano corpo del carattere, ovvero la sua dimensione, al valore corrispondente a 10 punti, occorre scrivere

Printer.FontSize = 10

Anche lo stile del carattere può essere variato. Ciò avviene agendo su alcune proprietà in grado di assumere dei valori booleani. Ad esempio, la riga

Printer.FontBold = True

fa sì che il testo sia scritto in grassetto.

La riga

Printer.FontItalic = True

seleziona invece lo stile corsivo.

La sottolineatura è invece legata alla proprietà FontUnderline. Pertanto, può essere attivata mediante la riga

Printer.FontUnderline = True

Un’altra proprietà, in genere poco usata, è quella che permette di generare delle stampe in cui il carattere risulta barrato. Essa è denominata FontStrikethru.
Le proprietà sopra elencate sono combinabili fra loro. Si osservi il seguente codice:

Printer.FontName = "Arial"
Printer.FontSize = 20
Printer.FontBold = True
Printer.FontItalic = True
Printer.FontStrikethru = False
Printer.Print = "Io leggo Dev"

provocano la stampa della frase "Io leggo Dev" in Arial grassetto corsivo di corpo 20.

L’utilizzo di più tipi di caratteri in un documento

Le impostazioni relative al carattere sono attive per tutti i testi stampati dopo l’assegnazione dei valori alle proprietà, fino a quando esse non subiscono variazioni. In altre parole, le impostazioni riguardanti il font non interessano l’intero documento, a meno che non siano state definite prima della sua stampa. Inoltre, possono essere variate a piacere al suo interno. È quindi possibile usare un numero teoricamente infinito di caratteri diversi in un’unica stampa.

Si osservi l’esempio che segue:

Printer.FontName = "Arial"
Printer.FontSize = 20
Printer.FontBold = True
Printer.FontItalic = False
Printer.FontStrikethru = False
Printer.Print = "Io leggo Dev"
Printer.FontSize = 15
Printer.Print = "perché mi insegna"
Printer.FontSize = 10
Printer.FontItalic = True
Printer.Print = "a programmare!"

Il testo prodotto è composto da 3 righe aventi dimensioni diverse. L’ultima, inoltre, si differenza per lo stile, essendo scritta in corsivo.

Il passaggio a una nuova pagina

Molto spesso, le stampe che un programma deve produrre superano la capienza di una pagina. In questi casi, occorre inserire uno o più salti di pagina. Ciò è possibile invocando il metodo NewPage, senza argomenti, come illustrato di seguito:

Printer.NewPage

L’utilizzo di tale metodo provoca inoltre l’incremento di un’unità del valore della proprietà Page che, come è facile intuire, contiene il numero della pagina corrente. Si osservi la seguente procedura

Private Sub PaginaSucc
Printer.NewPage
Printer.Print "Pagina ";
Printer.Print Printer.Page
End Sub

Essa ha lo scopo di provocare l’avanzamento alla pagina successiva e di inserire nella parte superiore del nuovo foglio il numero di pagina.

L’avvio della stampa

Coloro che leggendo questo articolo hanno già provato a scrivere del codice volto a produrre una stampa, potrebbero aver subìto una delusione. Infatti, con molta probabilità, la stampante non ha prodotto alcun risultato. Ciò è dovuto al fatto che i documenti sono prima composti in memoria e solo in seguito inviati alla stampante. Ciò permette la massima flessibilità, nonché la possibilità di annullare una stampa già iniziata. L’invio di un documento alla stampante avviene quindi solo dopo la sua completa definizione, ovvero quando si provvede a dichiararne il completamento per mezzo del metodo EndDoc, da richiamare senza l’ausilio di parametri, come indicato di seguito:

Printer.EndDoc

L’annullamento di una stampa

Come si è già accennato, è possibile annullare una stampa in corso di definizione. Per fare ciò, basta ricorrere al metodo KillDoc.

Ad esempio, la riga

Printer.KillDoc
provvede alla cancellazione della stampa in corso.

Un semplice esempio…

La lezione termina con un piccolo esempio. Si tratta di un semplice programma in grado di stampare una tavola pitagorica. Il suo codice, riportato nel listato 1, è tutto contenuto nella procedura Main, in quanto non necessita di un’interfaccia grafica. Esso si compone di due cicli nidificati. Uno è utilizzato per gestire le righe, mentre l’altro mantiene traccia delle colonne. Il prodotto dei valori assunti dalle variabili di controllo dei cicli costituisce il dato da visualizzare nella tabella. Si noti che è calcolata la lunghezza del valore da scrivere, per consentire l’anteposizione di un numero di spazi tale da ottenere l’allineamento a destra dei dati.

Bibliografia

"Visual Basic 5", McGrawHill, ISBN 88-386-0436-3

Maurizio Crespi si occupa di grafica, multimedialità, amministrazione di reti locali e geografiche, nonché della progettazione e dello sviluppo di applicazioni in C++, Visual Basic, Delphi e Director. Può essere contattato tramite Internet all’indirizzo mcrespi@infomedia.it.

VB-IT: per tutti gli sviluppatori VB o aspiranti tali

VB-IT è la mailing list italiana interamente dedicata a Visual Basic, VBA (Visual Basic for Application) e VBScript. Se sei uno sviluppatore esperto oppure ti interessa il mondo Visual Basic anche solo per diletto, troverai VB-IT utilissima!

Consigli, suggerimenti, trucchi, soluzioni a problemi comuni e molto altro. Per iscriversi, gratuitamente, a VB-IT è sufficiente inviare un messaggio a majordomo@infomedia.it
e nel body inserire la stringa:
subscribe vb-it
Una volta iscritto, esponi i tuoi problemi a vb-it@infomedia.it e aiuta gli altri a risolvere i propri. Sarà anche un modo per instaurare nuovi rapporti di lavoro, collaborazione ed amicizia!