Sandro Bizioli


Chi sogna di giorno conosce molte cose che sfuggono a chi sogna soltanto di notte. (E.A.Poe)
Mappa

Oggetto Printer e caratteri asiatici.

Su alcuni applicativi realizzati in VB6 SP5 (ma sembra anche con SP6) che dovevano stampare font asiatici, nel mio caso ideogrammi coreani, si sono riscontrati gravi errori di stampa su alcuni modelli di stampanti HP recenti. (Il test è stato fatto su una HP DeskJet D2300)
Più precisamente, la pagina stampata conteneva solo alcuni dei caratteri inviati all'oggetto Printer!
Anche l'installazione dei più recenti drivers non ha dato nessun esito.

Il sito ufficiale HP, newsgroup e Microsoft non ripotavano nulla.
Analizzando un problema vagamente simile BUG: Setting FontTransparent Has No Effect on Windows 95/98/Me  anche se il post si riferiva ad un bug su Windows 9x e Windows ME e riguardante la proprietà FontTransparent, mi sono accorto che, applicando l'esempio al mio caso e cioè facendo stampare un rettangolo (object.Line [Step] (x1, y1) [Step] - (x2, y2), [color], [B][F] ) contenete il testo in coreano, questo veniva correttamente stampato.

Ho notato, inoltre, che era sufficiente stampare esattamente prima del comando Printer.Print "TestoAsiatico" una semplice linea di colore bianco (&HFFFFFF quindi invisibile) con coordinate di partenza 0,0 e di arrivo pari a Printer.CurrentX e Printer.CurrentY (quelle usate poi per stampare il testo vero e proprio).

Conclusione
A questo punto la conclusione, non documentata, ma funzionante è quella di eseguire una Printer.Line prima della Printer.Print con il testo e che tale linea (o rettandolo) comprenda il testo stesso.

Facciamo un esempio: 
Private Sub cmdPrint_Click()
       Printer.CurrentX = 0
       Printer.CurrentY = 0       
       Printer.Print "testo in coreano"       
       Printer.EndDoc
End Sub

Questa semplice routine esegue una stampa di una stringa con caratteri coreani. Il relativo output su stampante HP risulta incompleto.

Inserendo un rettangolo prima dell'istruzione di print del testo il problema, però, non si verifica.
Private Sub cmdPrint_Click()
       Printer.CurrentX = 0
       Printer.CurrentY = 0       
       ' Disegno un rettangolo che comprenderà il successivo testo
       Printer.Line (0, 0)-(10000,2000), &HFFFFFF
       Printer.Print "testo in coreano"
       Printer.EndDoc
End Sub


Considerazioni
Se dobbiamo stampare una semplice pagina aggiungere il rettangolo (Printer.Line 0,0, DimensioniAreaStampabileX, DimensioniAreaStampabileY,) prima di ogni altra operazione sarà più che sufficiente.
La cosa potrebbe essere un pochino più complicata se la nostra stampa conterrà più pagine. In tal caso ad ogni Printer.NewPage dovrò ridisegnare il mio rettangolo.
Per supplire a tale operazione ed evitare di mettere mano a molteplici righe di codice ho preferito intervenire in questo modo: creare una routine PrinterNew che accetti come parametro il testo da stampare e che mi stampi, prima dello stesso, una riga bianca. In tal modo sarà sufficiente sostituire all'interno dell'intero progetto tutte le chiamate "Printer.Print" con la nuova "PrinterNew" con un costo di intervento pressochè nullo.

Public Sub PrinterNew(ByVal myString As String)
       'Stampo una linea prima del testo
       Printer.Line (0, 0)-(Printer.CurrentX, Printer.CurrentY), &HFFFFFF
       'Ora stampo il testo vero e proprio
       Printer.Print myString
End Sub
 
Private Sub cmdPrint_Click()
       Printer.CurrentX = 0
       Printer.CurrentY = 0       
       PrinterNew "testo in coreano"
       Printer.EndDoc
End Sub
Categoria: VB6
giovedì, 14 set 2006 Ore. 11.14
Statistiche
  • Views Home Page: 110.563
  • Views Posts: 563.512
  • Views Gallerie: 111.813
  • n° Posts: 227
  • n° Commenti: 222
Copyright © 2002-2007 - Blogs 2.0
dotNetHell.it | Home Page Blogs
ASP.NET 2.0 Windows 2003