Programmo Subito n. 17 - Giugno 1999 -  2 Livello - Corso di Visual Basic

Il corso dedicato a Visual Basic da nuovamente spazio alla gestione della stampante. Questa volta saranno descritti i metodi che permettono di creare dei tabulati di alta qualità

Corso di Visual Basic
La produzione di stampe di elevata qualità

(parte XVII)

di Maurizio Crespi

Nel corso degli anni, gli strumenti che permettono di stampare le informazioni su carta hanno subìto una notevole evoluzione. Dalle prime stampanti a margherita si è passati a quelle ad aghi, in grado di produrre anche della grafica e di operare con diversi tipi di carattere, fino poi ad arrivare alle moderne stampanti a tecnologia laser o a getto di inchiostro, che permettono di ottenere dei risultati di qualità un tempo di esclusiva competenza dei migliori tipografi. L’evolversi delle periferiche ha portato ad un aumento delle esigenze dei programmatori. Dalla semplice rappresentazione di testi si è passati a un uso sempre più massiccio delle grafica, anche per le applicazioni di tutti i giorni. Per questo motivo, lo sviluppatore moderno necessita di uno strumento che gli permetta di gestire le stampanti anche per effettuare le operazioni più complesse. Ancora una volta Visual Basic non delude le aspettative, in quanto mette a disposizione una nutrita serie di metodi tali da rendere l’oggetto Printer, di cui si è già ampiamente parlato nella scorsa lezione, in grado di accontentare anche l’utenza più esigente senza richiedere uno sforzo elevato al programmatore.

La proprietà ScaleMode

Per effettuare stampe di alta qualità, occorre dapprima essere in grado di posizionare i testi con estrema precisione in qualsiasi punto del foglio. Il concetto di "colonna", visto nella precedente lezione a proposito dell’opzione Tab del metodo Print, non consente un controllo preciso della posizione in cui avviene la stampa, in quanto risulta legata alla dimensione del carattere. Per un posizionamento preciso all’interno del foglio è pertanto necessario disporre di uno strumento che permetta di esprimere delle coordinate in unità di misura semplici da usare e indipendenti dal carattere selezionato, quali sono ad esempio i millimetri. È ciò che la proprietà ScaleMode permette di fare. I valori più utilizzati per questa proprietà sono elencati nel riquadro 1. Per poter definire le coordinate degli elementi da posizionare sul foglio in centimetri, è quindi sufficiente inserire nel codice la riga

Printer.ScaleMode = 7

Nella trattazione che segue si supporrà di aver selezionato come unità di misura i centimetri.

La verifica delle dimensioni del foglio

Per ottenere le dimensioni dell’area di stampa espresse nella scala impostata, è possibile ricorrere alle proprietà ScaleWidth e ScaleHeight. La prima restituisce la larghezza del foglio, mentre la seconda, ovviamente, l’altezza. Esse si basano sulle impostazioni inserite nella finestra di configurazione della stampante nel Pannello di Controllo di Windows.Le righe che seguono stampano un messaggio indicante le dimensioni del foglio in uso.

Printer.ScaleMode = 7
Altezza=Printer.ScaleHeight
Larghezza=Printer.ScaleWidth
Printer.Print "Il foglio è largo cm";
Printer.Print Larghezza;
Printer.Print "e alto cm";
Printer.Print Altezza
Printer.EndDoc

Le proprietà CurrentX e CurrentY

Dopo aver definito una scala, è possibile stabilire la posizione in cui deve essere visualizzata la successiva riga di testo sul foglio. A tal fine, si fa uso delle proprietà CurrentX e CurrentY, che permettono di intervenire rispettivamente sulla coordinata orizzontale e su quella verticale. Ad esempio, si supponga di voler scrivere sul foglio a 4 centimetri dal bordo superiore e a 2,5 centimetri da quello laterale sinistro, la frase "Io leggo Dev". Il codice necessario per fare ciò è il seguente

Printer.ScaleMode = 7
Printer.CurrentX = 2.5
Printer.CurrentY = 4
Printer.Print "Io leggo Dev"
Printer.EndDoc

Le proprietà CurrentX e CurrentY si incrementano automaticamente. I loro valori riflettono pertanto sempre la posizione che è occupata dalla testina di stampa.Per mezzo delle suddette proprietà è anche possibile definire degli spostamenti relativi. Ad esempio, le righe seguenti spostano la testina di stampa a destra di 3 centimetri e in basso di 2 millimetri rispetto alla posizione corrente.

Printer.CurrentX = Printer.CurrentX + 3
Printer.CurrentY = Printer.CurrentY + .2

L’allineamento di un testo a destra

Si supponga di voler scrivere la frase "Io leggo Dev" a 2 centimetri dal bordo destro del foglio. Per fare ciò occorre calcolare la posizione iniziale in cui deve essere effettuata la scrittura. Essa è pari alla differenza fra la larghezza del foglio, a cui sono sottratti i 2 centimetri di margine, meno la lunghezza del testo. È quindi necessario disporre di uno strumento in grado di calcolare l’ingombro di una frase in base al carattere e allo stile selezionati ed esprimerlo nell’unità di misura in uso. Il metodo TextWidth ha questo scopo. La sua sintassi è:

<lunghezza> = Printer.TextWidth (<stringa>)

Per scrivere la frase nella posizione desiderata occorre quindi digitare il seguente codice

Testo = "Io leggo Dev"
LarghFoglio = Printer.ScaleWidth
LarghTesto = Printer.TextWidth(Testo)
Printer.CurrentX = LarghFoglio – LarghTesto - 2
Printer.Print Testo

La centratura di un testo

Analogamente, è possibile centrare un testo nella pagina. A tal fine si fa ancora uso del metodo TextWidth, nonché delle proprietà ScaleWidth e CurrentX. Questa volta è necessario calcolare lo spazio che rimane libero nella riga, ovvero la differenza fra la larghezza del foglio e quella del testo da scrivere. Il valore ottenuto deve essere diviso per 2. È ciò che fa la procedura CentraTesto.

Private Sub CentraTesto(ByVal Testo As String)
LarghFoglio = Printer.ScaleWidth
LarghTesto = Printer.TextWidth(Testo)
Printer.CurrentX = (LarghFoglio – LarghTesto) / 2
Printer.Print Testo
End Sub

La scrittura di note a fine pagina

In modo perfettamente analogo è possibile stabile l’allineamento di un testo rispetto ai margini superiore e inferiore del foglio. In questo caso, è necessario tenere conto dell’altezza della stringa da stampare. Essa è calcolata dal metodo TextHeight, la cui sintassi è la seguente

<altezza> = Printer.TextHeight (<stringa>)

Si supponga di voler scrivere una procedura in grado di visualizzare delle note di fondo pagina in un carattere di corpo 8 a 2 centimetri dal margine inferiore del foglio. Il codice che la descrive è il seguente

Private Sub NoteFondo(ByVal Testo As String)
Printer.FontSize = 8
AltFoglio = Printer.ScaleHeight
AltTesto = Printer.TextHeight(Testo)
Printer.CurrentY = AltFoglio – AltTesto – 2
Printer.Print Testo
End Sub

La stampa in orizzontale o verticale

Ormai tutte le stampanti moderne permettono di impostare l’orientamento della stampa, ovvero di scegliere se utilizzare il foglio in modalità portrait (in verticale) o landscape (in orizzontale). Visual Basic offre il supporto per sfruttare questa caratteristica per mezzo della proprietà Orientation dell’oggetto Printer. I valori che essa può assumere sono due: il primo corrisponde alla costante vbPRORPortrait, che ha valore 1 e imposta la stampa in verticale, mentre il secondo, corrispondente alla costante vbPRORLandscape, permette di attivare la stampa in orizzontale.

Il tracciamento di linee

Sovente, al fine di delimitare delle tabelle o di dare un look più professionale ai propri documenti, si tracciano delle linee sul foglio. Visual Basic offre questa possibilità per mezzo del metodo Line, la cui sintassi è la seguente:

Printer.Line <coord_inizio> - <coord_fine>

dove le coordinate sono espresse da coppie di tipo (x,y), in cui x rappresenta la posizione orizzontale espressa nella scala in uso (indicata dalla proprietà ScaleMode) e y si riferisce alla posizione verticale.

Pertanto, considerando sempre il valore della proprietà ScaleMode pari a 7, la riga

Printer.Line (2,3) – (19,3)

provoca il tracciamento di una linea a 3 centimetri dal bordo superiore del documento che, in un comune foglio in formato A4 largo 21 centimetri, occupa l’intera larghezza dell’area stampabile mantenendo un margine di 2 centimetri dai bordi. La prima delle coppie indicanti le coordinate può essere omessa. In questo caso è assunta come punto di partenza la posizione corrente della testina di stampa, ovvero la coppia (Printer.CurrentX, Printer.CurrentY)

Ad esempio, la riga

Printer.Line – (19,3)

provoca il tracciamento di una linea a partire dalla posizione corrente del cursore fino alla posizione distante 19 unità (centimetri, se la proprietà ScaleMode è impostata al valore 7) dal bordo sinistro del foglio e 3 unità da quello superiore.

Lo spessore della linea dipende dal valore assegnato alla proprietà DrawWidth. Essa può assumere un valore interno fra 1 e 32767, che esprime il numero di pixel (punti) corrispondente allo spessore desiderato.

Ad esempio, le righe

 

 

Printer.DrawWidth = 4

Printer.Line (2,3) – (19,3)

 

fanno sì che sia disegnata una linea di spessore pari a 4 pixel.

Un’altra proprietà, denominata DrawStyle, descrive il tipo di tratto della linea. I valori che essa può assumere sono elencati nel riquadro 2. Quelli compresi fra 1 e 4 hanno effetto solo se la proprietà DrawWidth è impostata a 1. Altrimenti, producono una linea continua, esattamente come quella determinata dall’uso dell’impostazione predefinita, ovvero quella corrispondente alla costante vbSolid, che ha valore nullo.

Si osservi il seguente codice:

 

 

Printer.ScaleMode = 7

Printer.DrawWidth = 1

Printer.Drawstyle = 1

Printer.Line (2,3) – (19,3)

 

 

Esso provoca il tracciamento di una linea orizzontale tratteggiata a partire dalla posizione posta a 2 centimetri dal bordo sinistro del foglio fino alla posizione distante da esso 19 centimetri.

 

 

La stampa di immagini

Tutte le stampanti presenti sul mercato sono ormai in grado di stampare anche delle immagini, spesso con una risoluzione grafica elevata. Naturalmente, Visual Basic mette a disposizione dei programmatori uno strumento che permette di sfruttare questa capacità. Si tratta del metodo PaintPicture, la cui sintassi è la seguente:

 

 

Printer.PaintPicture <immagine>,

<x1>, <y1>,

[<larghezza>],

[<altezza>],

 

dove <immagine> rappresenta la sorgente dei dati da visualizzare, ovvero è la proprietà Picture di una PictureBox (oggetto atto a contenere immagini). I valori x1 e y1 rappresentano invece le coordinate del punto in cui deve essere posizionato l’angolo superiore sinistro dell’immagine.

Ad esempio, si supponga di disporre di una PictureBox, denominata pbImg, in cui è contenuta un’immagine. Per riportare quest’ultima su carta a partire dal punto di coordinate (2,3) è necessario scrivere la riga

 

 

Printer.PaintPicture pbImg.Picture, 2, 3

 

L’immagine è così disegnata in modo che la sua dimensione non sia alterata. Molto spesso, tuttavia, si desidera effettuare un ridimensionamento in fase di stampa. Ciò ha in genere il fine di sfruttare l’intera area disponibile sul foglio, indipendentemente dalle dimensioni di quest’ultimo. Ad esempio, si potrebbe voler stampare l’immagine in modo da occupare tutto il foglio mantenendo un margine di 2 centimetri dai bordi. Ciò è possibile digitando il seguente codice:

Printer.ScaleMode = 7
Larghezza = Printer.ScaleWidth - 4
Altezza = Printer.ScaleHeight – 4
Printer.PaintPicture pbImg.Picture, 2, 2, Larghezza, Altezza

Si noti che sono stati utilizzati due ulteriori parametri che descrivono, rispettivamente, la larghezza e l’altezza dell’immagine da stampare. Si osservi altresì che ad essi sono stati assegnati dei valori pari alle dimensioni del foglio diminuite di 4 centimetri, al fine di generare i margini.

La scelta fra la stampa a colori o in bianco e nero

Le stampanti a colori, dato il continuo ridursi dei prezzi, si stanno sempre più diffondendo. La stampa a colori comporta tuttavia un costo per pagina più elevato rispetto a quella monocromatica a toni di grigio. Per questo motivo, spesso si rivela utile fare in modo che le applicazioni siano in grado di operare una scelta fra le due modalità di stampa. Ciò è possibile per mezzo della proprietà ColorMode, che può assumere i valori 1 (corrispondente alla costante predefinita vbPRCMMonochrome) e 2. L’assegnamento di quest’ultimo valore, a cui si può far riferimento anche attraverso la costante vbPRCMColor, fa sì che la stampa avvenga a colori. In caso contrario è monocromatica. Tale proprietà è ignorata nel caso in cui la stampante in uso sia in grado di produrre solo dei tabulati monocromatici.

 

 

Conclusioni

La capacità di produrre un risultato di qualità non solo sul video ma anche sulla stampante è sempre più richiesta dall’utenza moderna, che sembra accettare sempre di meno i tabulati grezzi e spesso poco leggibili che un tempo costituivano lo standard per le applicazioni gestionali. Oggi le esigenze sono cambiate e con esse le periferiche in grado di stampare le immagini. Oggi un programmatore deve essere in grado di creare delle applicazioni che visualizzino nel migliore dei modi i risultati delle proprie elaborazioni, ricorrendo a quanto di meglio la tecnologia mette a disposizione. Un moderno strumento di sviluppo deve quindi tenere conto di queste esigenze. Visual Basic fin dalla nascita si è affermato come uno dei prodotti più innovativi. Anche per quanto riguarda la gestione delle stampe è all’altezza della propria fama, rivelandosi in grado di soddisfare le richieste dell’utenza più esigente, pur mantenendo la consueta semplicità d’uso che rappresenta il suo fiore all’occhiello.

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 e' 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!