Siguiendo la idea de Edgar, en Visual Fox Pro se pueden utilizar aún SET DEVICE TO PRINTER con @ nFila,nCol Say "Cadena", con lo cual no es necesario recurrir al DOS. Puedes imprimir directamente. No se utiliza el driver de la impresora, sino que se envían secuencias de Escape.
Para no lidiar con las secuencias de escape, escribí una rutina basada en variables públicas.
Esto se podría mejorar bastante. Pero como hablamos de una especie en extinción, en mi caso, volví a escribir (adaptado) un código que utilizaba en Clipper 5.01.
Las secuencias de escape son básicamente iguales para las Fx 870, 880, 890 y LX-300
Luego, para imprimir, transcribo una idea básica sobre el manejo.
3) Procedure (s) de impresión. (Con una matriz de datos, se puede escribir una sola función que imprima lo que sea)
Las variantes de impresión son básicamente dos: avance por línea y avance proporcional.
En la mayoría de los casos, utilizamos avance por línea, pero en el caso de formulas de cheques, es necesario recurrir al avance proporcional, ya que no se ajustan a ningún conteo de líneas. Recordemos que la impresora trabaja en pulgadas, mientras que los cheques están definidos en milímetros.
* Supuestos
lcValor="Cadena de Texto a imprimir"
ncolumna=1
lnValor=128236.42 && número cualquiera
lnMaxLin=72
* Avance por Línea
if ! Zimpre(72,INDOCE,,.F.)
return
endif
lin=0
do while .t.
if Lin=0
Ejec
Lin=lin+1
&& Imprime Encabezado
endif
lin=lin+1
@ lin,ncolumna SAY CPCONVERT(1252,437,Lcvalor)
@ lin,nColumna+60 say transform(lnValor,"999,999,999.99")
lin=lin+1
if lin>lnMaxLin
lin=0
endif
&& Condición de Exit
skip
if eof()
exit
endif
enddo
PANTALLA(.T.)
*********************************************
* Avance Proporcional
* Utilizado para imprimir cheques, por ejemplo
***********************************************
if !Zimpre(0,OFCOMP)
RETURN
ENDIF
nAvan=9
cAvan=Chr(27)+chr(Ava180)+Chr(Int(nAvan*Relavan/216))
* para epson puede ser directamente
* cAvan=Chr(27)+chr(Ava180)+Chr(nAvan)
??? cAvan
@ Prow(),nColumna SAY CPCONVERT(1252,437,Lcvalor)
PANTALLA(.F.)
ENDPROC
**************************************
Function Zimpre(nLarPage,CHA,lcImpresor,Supcomp)
**********************************************
* Convocatoria de impresoras de matriz de puntos
* cha es el valor de INDOCE,INCOMP etc.
* Formatos de SEcuencia de escape Impresoras de texto Only.
********************************
IF Vartype(nLarPage)#"N"
LLP=PAGNN+CHR(72)
ENDIF
LLP=iif(nLarPage=0,"",PAGNN+CHR(nLarPage)
if Empty(lcImpresor)
lcImpresor=GetPrinter()
endif
if empty(lcImpresor)
return
endif
IF !SUPCOMP
??? DPMODE+LLP+DRAF+OFCOMP+CHA
ELSE
??? DPMODE+LLP+DRAF+OFCOMP+CHA+INCOMP
ENDIF
SET CONSOLE OFF
SET PRINTER TO NAME (lcImpresor)
SET DEVICE TO PRINTER
@ PROW(),0 SAY " "
ENDPROC
*************************
PROCEDURE PANTALLA(lEjec)
*************************
* Cierra la impresora de TExto
@ prow(),1 say " "
??? OFCOMP+OFDOCE+draf+comun
SET PRINTER OFF
if lEjec
EJECT
ENDIF
SET DEVICE TO SCREEN
SET PRINTER TO
SET CONSOLE ON
ENDPROC
**********************
Procedure DefinirTxt()
**********************
* Método de control de impresión de texto formateado
* en impresoras de agujas.
PUBLIC limpre,DPMODE,INCOMP,OFCOMP,INDOCE,OFDOCE,;
CHICO,GRANDE,;
PAG24,PAG36,PAG48,PAG72,PAGNN,;
DRAF,QUALY,DOBLE_WID,ENFASIS,COMUN,DOCECPI,;
ON_DSTRIK,OF_DSTRIK,AVA180,RELAVAN
PUBLIC ryal,rymc,rymm,rydc,ryml
dimension gaprint[14,2]
gaPrint[1,1]=[Número de secuencia de Escape]
gaPrint[2,1]=[Carácter de modo (DP/WP/etc.)]
gaPrint[3,1]=[En caracteres comprimidos]
gaPrint[4,1]=[Quita caracteres comprimidos]
gaPrint[5,1]=[En caracteres 12/15 cpi]
gaPrint[6,1]=[Quita caracteres 12/15 cpi]
gaPrint[7,1]=[En espaciado normal]
gaPrint[8,1]=[En medio espacio]
gaPrint[9,1]=[Carácter de control de líneas]
gaPrint[10,1]=[Control de estilo]
gaPrint[11,1]=[En doble golpe]
gaPrint[12,1]=[Golpe single]
gaPrint[13,1]=[Avance n/180]
gaPrint[14,1]=[Relación Avance Estándar (216)]
gaPrint[1,2]=27
gaPrint[2,2]=64
gaPrint[3,2]=15
gaPrint[4,2]=18
gaPrint[5,2]=77
gaPrint[6,2]=80
gaPrint[7,2]=50
gaPrint[8,2]=48
gaPrint[9,2]=67
gaPrint[10,2]=120
gaPrint[11,2]=71
gaPrint[12,2]=72
gaPrint[13,2]=74
gaPrint[14,2]=216
ryal=Chr(175) && raya alta
rymc=Chr(150) && raya media Central
ryml=Chr(151) && raya media larga
rymm=Chr(173) && raya media media
rydc=Chr(61) && raya doble
dimension gaprin[14,2]
gaPrint[1,1]=[Número de secuencia de Escape]
gaPrint[2,1]=[Carácter de modo (DP/WP/etc.)]
gaPrint[3,1]=[En caracteres comprimidos]
gaPrint[4,1]=[Quita caracteres comprimidos]
gaPrint[5,1]=[En caracteres 12/15 cpi]
gaPrint[6,1]=[Quita caracteres 12/15 cpi]
gaPrint[7,1]=[En espaciado normal]
gaPrint[8,1]=[En medio espacio]
gaPrint[9,1]=[Carácter de control de líneas]
gaPrint[10,1]=[Control de estilo]
gaPrint[11,1]=[En doble golpe]
gaPrint[12,1]=[Golpe single]
gaPrint[13,1]=[Avance n/180]
gaPrint[14,1]=[Relación Avance Estándar (216)]
gaPrint[1,2]=27
gaPrint[2,2]=64
gaPrint[3,2]=15
gaPrint[4,2]=18
gaPrint[5,2]=77
gaPrint[6,2]=80
gaPrint[7,2]=50
gaPrint[8,2]=48
gaPrint[9,2]=67
gaPrint[10,2]=120
gaPrint[11,2]=71
gaPrint[12,2]=72
gaPrint[13,2]=74
gaPrint[14,2]=216
DPMODE=CHR(gaPrint[1,2])+CHR(gaPrint[2,2]) && Data Processing Mode
INCOMP=CHR(gaPrint[1,2])+CHR(gaPrint[3,2]) && Comprimidos
OFCOMP=CHR(gaPrint[4,2]) && Estándar
INDOCE=CHR(gaPrint[1,2])+CHR(gaPrint[5,2]) && 12 cpi
OFDOCE=CHR(gaPrint[1,2])+CHR(gaPrint[6,2]) && 10 cpi
CHICO=CHR(gaPrint[1,2])+CHR(gaPrint[8,2]) && 15 cpi
GRANDE=CHR(gaPrint[1,2])+CHR(gaPrint[7,2]) && expandido
PAG24=CHR(gaPrint[1,2])+CHR(gaPrint[9,2])+CHR(24) && 24 lines per page
PAG36=CHR(gaPrint[1,2])+CHR(gaPrint[9,2])+CHR(36) && 36 lines per page
PAG48=CHR(gaPrint[1,2])+CHR(gaPrint[9,2])+CHR(48) && 48 lines per page
PAG72=CHR(gaPrint[1,2])+CHR(gaPrint[9,2])+CHR(72) && 72 lines per page
PAGNN=CHR(gaPrint[1,2])+CHR(gaPrint[9,2]) && uso pagnn+chr(72) = 72 lines per page
draf =CHR(gaPrint[1,2])+CHR(gaPrint[10,2])+CHR(0) && Modo Draf
QUALY =CHR(gaPrint[1,2])+CHR(gaPrint[10,2])+CHR(1) && Modo Quality
DOBLE_WID =CHR(gaPrint[1,2])+CHR(33)+CHR(32) && Expandido
ENFASIS =CHR(gaPrint[1,2])+CHR(33)+CHR(8) && REmarcado
COMUN =CHR(gaPrint[1,2])+CHR(33)+CHR(0) && Estándar
DOCECPI =CHR(gaPrint[1,2])+CHR(33)+CHR(1)
On_Dstrik =CHR(gaPrint[1,2])+CHR(gaPrint[11,2]) && Doble golpe
oF_Dstrik =chr(gaPrint[1,2])+chr(gaPrint[12,2]) && golpe Simple
Ava180 =gaPrint[13,2] && Avance Proporcional
Relavan =gaPrint[14,2] && Relación de Avance