Newsgroup: it.comp.lang.visual-basic
Titolo: Mandare i caratteri di controllo (ESC 1....) alla stampante

Il Tormentone della stampante continua....
Come si fa a mandare i caratteri di controllo stile
ESC 1
LF
BEL
Alla  stampante ad aghi collegata alla parallela?
Mi dispiace inondare il ng dei mie msg, ma in questo caso non ho idea di
cosa fare...
Grazie

 Alla  stampante ad aghi collegata alla parallela?
Aspe', mi sono perso gli antefatti, come mandi i dati alla
stampante ? "Open lpt1...", con le Api, con il driver "Generico-solo testo"
o in che altro modo ?  Seconda domanda, che sistema operativo usi ?
Win 95/98 oppure NT ?
Se invece questa parte l'hai già risolta, e ciò che ti interessa sono
solo i codici, vado a memoria:
ESC 1 = Chr$(27) & Chr$(1)
LF = Chr$(13)
CR = Chr$(10)
BEL = Chr$(7)
....degli altri dovresti trovare la tabella su qualunque manuale
di una stampante ad aghi un po' vecchiotta, se ti serve te li
posso trovare.
Bye, G.
--
---------------------------------------------
    Le risposte alle tue domande le trovi
    sul Sito Comune di questo NewsGroup:
 
http://www.murialdo.it/it_lang_vb
       ... e nell'help in linea !
---------------------------------------------
Real E-address: 
gaet...@hotmail.com

Grazie Gaetano di avermi risposto,
L' O.S. e' Win 98 (ma il programma dovra' girare su 95), il linguaggio e'
VB5.
Per stampare utilizzo l'oggetto printer.
La stampante comunque e' collegata all'lpt1 e devo stampare solo testo, non
disdegnerei l'idea di accedere direttamehte all'lpt1 bypassando i driver di
windows.
Quindi ti ripasso la palla chiedendoti:
-come si puo' settare la stampante accedendo direttamente all' lpt
-come si mandano i caratteri di controllo?
Grazie
Andrea

 -come si mandano i caratteri di controllo?
PUOI, volendo, stampare direttamente su LPT1: aprendola come
fosse un file, ma questo ti potrebbe dare altri problemi.
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ì.
Se hai problemi, scrivimi anche in mail.



