Newsgroup: it.comp.lang.visual-basic
Titolo: [?] Stampare con Aghi

Sto disperatamente tentando di stampare su di una IBM Lexmark 2391 plus in
formato testo e non quindi grafica. Ma puntualmente nonostante qualsiasi
carattere imposti da programma, la stampa viene effettuata in modalità
grafica. Avete idea dicome fare....sbaglio qualche cosa. Utilizzo il metodo
"printer.print" ed imposto il font correttamente....
grazie....

Configurala come "Generica / Solo testo" ed imposta il font "Roman 10cpi".
Se hai bisogno anche del carattere compresso, facci sapere.
Fabio Pagano
Remo ha scritto nel messaggio ...


Io avevo il tuo stesso problema che ho risolto mandando i dati direttamente
allo spooler scavalcando l'oggetto printer (il quale non mi sembra per
niente sensibile). E' una soluzione ottima se devi stampare testo anche se
ha il pregio/incoveniente che devi "gestire" tu i ritorni a capo, i fine
pagina, con i caratteri di controllo.
Segue la risposta di un po' di gg. fa (nel caso non l'avessi letta) che mi
ha dato Paperino che ringrazio ancora :
----------------------------------------------------------------------------
---------------
Nel tuo caso ti consiglio una soluzione un po' più avanzata: scavalca
ugualmente il driver di windows, ma mandando i tuoi dati direttamente
allo spooler di stampa. Ti servono un po' di API, ma non preoccuparti,
la Micro$oft una volta tanto ci ha dato la pappa fatta. C'è un articolo qui:
http://support.microsoft.com/support/kb/articles/Q175/0/83.ASP
ma puoi provare direttamente a ricreare il programmino, seguendo
queste istruzioni.
Crea un progetto nuovo, e aggiungi sul form un command button.
Copia e incolla queste righe nelle Dichiarazioni del Form:
' INIZIO _______________________
Option Explicit
      Private Type DOCINFO
          pDocName As String
          pOutputFile As String
          pDatatype As String
      End Type
      Private Declare Function ClosePrinter Lib "winspool.drv" (ByVal _
         hPrinter As Long) As Long
      Private Declare Function EndDocPrinter Lib "winspool.drv" (ByVal _
         hPrinter As Long) As Long
      Private Declare Function EndPagePrinter Lib "winspool.drv" (ByVal _
         hPrinter As Long) As Long
      Private Declare Function OpenPrinter Lib "winspool.drv" Alias _
         "OpenPrinterA" (ByVal pPrinterName As String, phPrinter As Long, _
          ByVal pDefault As Long) As Long
      Private Declare Function StartDocPrinter Lib "winspool.drv" Alias _
         "StartDocPrinterA" (ByVal hPrinter As Long, ByVal Level As Long, _
         pDocInfo As DOCINFO) As Long
      Private Declare Function StartPagePrinter Lib "winspool.drv" (ByVal _
         hPrinter As Long) As Long
      Private Declare Function WritePrinter Lib "winspool.drv" (ByVal _
         hPrinter As Long, pBuf As Any, ByVal cdBuf As Long, _
         pcWritten As Long) As Long
' questa è la routine che crea il blocco di dati e la invia alla stampante.
Private Sub InviaAllaStampante()
          Dim lhPrinter As Long
          Dim lReturn As Long
          Dim lpcWritten As Long
          Dim lDoc As Long
          Dim sWrittenData As String
          Dim MyDocInfo As DOCINFO
          Dim NomeStampante As String
NomeStampante = "Generico / solo testo" ' metti qui il nome _ESATTO_
' che il sistema dà alla tua stampante
          lReturn = OpenPrinter(NomeStampante, lhPrinter, 0)
          If lReturn = 0 Then
              MsgBox "Stampante inesistente o non connessa"
              Exit Sub
          End If
          MyDocInfo.pDocName = "Testo che appare sullo spooler"
          MyDocInfo.pOutputFile = vbNullString
          MyDocInfo.pDatatype = vbNullString
          lDoc = StartDocPrinter(lhPrinter, 1, MyDocInfo)
          Call StartPagePrinter(lhPrinter)
'  Questa parte serviva per scrivere un programma in postscript
' in una text box e inviarlo alla stampante. La puoi ignorare
'           sWrittenData = Text1.Text & Chr$(4) ' nel PostScript serve per
dire
'           che il programma è finito.
' questo è un programmino di prova in PostScript
'          sWrittenData = "100 100 moveto "
'          sWrittenData = vbCrLf & sWrittenData & "/Helvetica-Bold findfont
_
'           30 scalefont setfont "
'          sWrittenData = vbCrLf & sWrittenData & "(Arturo è grande !) show
"
'          sWrittenData = vbCrLf & sWrittenData & "showpage "
'          sWrittenData = vbCrLf & sWrittenData & vbCrLf & Chr$(4)
' Tu dovresti usare questo sistema.
sWrittenData = sWrittenData & "Prima riga" & vbCr
sWrittenData = sWrittenData & "Seconda riga" & vbCr
sWrittenData = sWrittenData & "Terza riga " & vbTab & "con tabulazione " &
vbCr
sWrittenData = sWrittenData & "Quarta  riga " & vbTab & "prima tab" _
& vbTab & "2a tab" & vbCr
sWrittenData = sWrittenData & "Quinta riga " & vbTab & "prima tab" _
& vbTab & "2a tab" & vbTab & "3a tab" & vbCr
sWrittenData = sWrittenData & vbFormFeed ' fa uscire il modulo o il foglio.
' del tipo ESC-quello_che_vuoi puoi fare così
' sWrittenData = sWrittenData & chr$(27) & chr$(???) '  per inviare i codici
' di controllo ma ti converrebbe fare una serie di stringhe per i codici
' (ad esempio) del neretto, corsivo, del sottolineato e del normale, e
salvarle
' come costanti, in modo da poter fare:
' sWrittenData = sWrittenData & "Testo normale" & ESCNeretto & _
"testo neretto" & ESCNormale & "testo normale" & vbCr  eccetera.
' Questa parte è quella che invia i dati allo spooler.
           lReturn = WritePrinter(lhPrinter, ByVal sWrittenData, _
             Len(sWrittenData), lpcWritten)
          lReturn = EndPagePrinter(lhPrinter)
          lReturn = EndDocPrinter(lhPrinter)
          lReturn = ClosePrinter(lhPrinter)
End Sub
' FINE _______________________
Metti il nome esatto della stampante nel punto indicato, poi
metti nel Command1_Click la chiamata alla sub
InviaAllaStampante
e prova il programma.
La routine è ovviamente da ottimizzare, ma dovrebbe funzionare
già così.
----------------------------------------------------------------------------
---------------

 "printer.print" ed imposto il font correttamente....
Ciao,
se non devi formattare la stampa in modo particolare, puoi aprire
direttamante la Lpt1:
Open "lpt1" For Output As #1
        Print #1, Tab(2); ....; Tab(20);(String(32, "X")
        Print #1, Tab(2); ......
ecc. ecc.
Funziona, anche se ti blocca quasi il Pc sino a che non ha finito la stampa.
Bepi