Hola Roberto
Aunque ya te pasaron unos buenos ejemplos, te alcanzo uno mas,,, que nunca esa demas
Esta es la cabecera de la clase:
ÚÄ Programa ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
³ Aplication: Class TDosPrint ³
³ File: TDOSPRN.PRG ³
³ Author: Ignacio Ortiz de Z£¤iga Echeverr¡a ³
³ CIS: Ignacio Ortiz (Ignacio_Ortiz) ³
³ Internet:
http://ourworld.compuserve.com/homepages/Ignacio_Ortiz ³
³ Date: 09/13/96 ³
³ Time: 20:20:07 ³
³ Copyright: 1997 by Ortiz de Zu¤iga, S.L. ³
ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
NOTES:
This peace of software is freeware and is not part of FiveWin.
The following code will let you print directly to the printer from inside
any Fivewin program, like OLD DOS days. Those users that need DOS printing
speed can use this class instead of the TPrinter class.
The use of the class is very easy and is very similar to the TPrinter class
of Fivewin, but we have not create any command to avoid the use of any
static vars.
This is a little sample of how to use the new class:
LOCAL oPrn
oPrn := TDosPrn():New("lpt1")
oPrn:Say(10,20, "This goes in line 10, column 20")
oPrn:EndPage() // optional
oPrn:End()
A little description of all the members of this class:
DATA:
cPort: Printing port, by default "LPT1"
cCompress: String for compressed mode, by default "15"
cNormal: String for normal mode, by default "18"
cFormFeed: String for EJECT, by default "12"
hDC: Printing file Handle (Internal use)
nRow: Current printing row
nCol: Current pringing column
nLeftMargin: Left margin, by default 0
nTopMargin: Top margin, by default 0
lAnsiToOem: If .T. a Ansi to Oem translation is done automatically
whe printing, by default is .T.
METHODS:
New(cPort) Constructor, no comment
End() Destructor, no comment
EndPage() End of page, this method is optional if there is only on page
Command(c) Let you send any command to the printer without changing the
current row and col. The string to pass as a parameter should
content the ascii values of the command separated with commas,
for example, the command to reset Epson printers should
be: "27,69"
SetCoors(r,c) Let you change the current row and col is the equivalent of
SetPrc() of Ca-Clipper
NewLine() Increments the current row
Write(cText) Prints the string cText in the current row and column
Say(nRow ,; Prints the string cText in nRow, nCol
nCol ,; lAtoO indicates if the string should be transformed to Oem,
cText ,; by default is ::lAnsiToOem
lAtoO )
SayCmp() The same as the method Say but prints in compressed mode and
the row is updated accordly.
NOTE:
If you try to print on a row before the current one a EJECT will be
done automatically.
In the same way if you try to print on the same row as the current, but
in a previous column from the current one a EJECT will be done automatically
At the end of this class is a little function call WorkSheet that will make
the job of DOS printing a lot easier.
Enjoy it!
********************************************************************************
********************************************************************************
La Clase desarrollada originalmente por Ignacio Ortiz me ha resultado útil por
su sencillez y efectividad.
El único punto debil de esta clase se encuentra cuando el usuario manda a imprimir
y la impresora no está lista (sea cual sea la causa). Esto hace que FiveWin capture
el error, saltando sobre cualquier manejador de error que el programador defina,
y mostrando esa horrorosa ventana blanca que ya todos conocemos.
Si el usuario resuelve el problema de la impresora (sigo hablando de cuando aparece
la horrorosa ventana blanca), la impresión se realiza, pero a la final el programa
termina explotando igual.
Ahora les presento algunas modificaciones que le realizado a esta clase con la idea
que la impresión se realice directamente en los puertos físicos de la impresora,
emulando (en cierta forma) la función que realiza el ROM BIOS, y buscando evitar que
el manejador de errores se adelante en situaciones como la que les comenté en el
parrafo enterior.
La idea es que hagan todas las pruebas posibles para pulirla, y dejarle abierta a Uds.
la posibilidad de manejar los eventuales errores de acuerdo a la necesidad particular
de cada quien.
Este trabajo ES GRATIS!. Lo único que les pido es que no borren este comentario, ni la
documentación anexa, ni los comentarios intercalados en los lugares donde se han realizado
las modificaciones.
En mi caso real, utilizo esta misma clase, pero la que ha sido modificada por el
compañero Jose E. Serrano E. (JESE), quien le añadió algunas características más,
pero manteniendo la misma estructura de la clase original de Ignacio.
Cuando estas modificaciones funcionen sin inconvenientes, las transferiré a la clase
modificada por JESE.
Un Abrazo a todos,
y que les sea útil
Giancarlo J. Sabattino S.
08 Julio 2001
gsabattino@cantv.net
Este trabajo se lo dedico a los compañeros Hernán D. Cecarrelli, José E. Serrano E. (JESE),
Juan José Machado, y a Willy Quintana.
NOTAS IMPORTANTES:
Esta clase está orientada totalmente a impresoras matriciales, o impresoras que se comporten
como impresores matriciales, por lo que su uso en cualquier otro tipo de impresora puede
causar resultados indeseados.
Esta clase trabaja directamente sobre los puertos PRN, LPT1 y LPT2 que existan físicamente en el
equipo, por lo que no funcionará en ningún otro tipo de dispositivo. Para mantener compatibilidad,
se puede pasar un nombre de archivo para grabar la impresión en disco tal como lo hace la clase
original.
En teoría, no debe ser activada si alguna aplicación Windows se encuentra haciendo uso de la
misma impresora que se desea utilizar. Yo no he intentado utilizarla de esta forma, pero la
lógica me dice que los resultados serán totalmente impredecibles.
y este es el ejemplo:
Code: Select all
oPrnCmp:=TDosPrn():New(cFilPrn) // oPrnCmp:=TDosPrn():New("luis.prn")
oPrnCmp:Command( { 27, 64 } )
oPrnCmp:Say( nRow, 00, PADC("CIERRE DE TURNO ",40), nCompress )
nRow++
oPrnCmp:Say( nRow, 00, Repl("-",40), nCompress )
nRow ++
oPrnCmp:Say( nRow, 00, "Rango: "+TRIM(cRango), nCompress )
nRow++
oPrnCmp:Say( nRow, 00, "Zona : "+TRIM(cNomIsla), nCompress )
nRow++
oPrnCmp:Say( nRow, 00, "Turno: "+TRIM(cNomTurno), nCompress )
nRow++
oPrnCmp:Say( nRow, 00, Repl("-",40), nCompress )
nRow ++
oPrnCmp:Say( nRow, 00, PADC("Vendedor: "+cVendedor+" "+cNomVen,40), nCompress )
nRow++
oPrnCmp:Say( nRow, 00, Repl("-",40), nCompress )
nRow ++
FOR G=1 TO LEN(aTitGrupo)
oPrnCmp:Say( nRow, 00, aTitGrupo[G][2] , { nCompress } )
nRow ++
NEXT
oPrnCmp:Say( nRow, 00, Repl("-",40), nCompress )
nRow ++
oPrnCmp:Say( nRow, 00, mmInicial+DTOC(DATE())+" - "+TIME(), { nCompress } )
oPrnCmp:Say( nRow, 28, TRANS(nTotalRep,MA72C), { nCompress } )
nRow ++
nRow+=7
oPrnCmp:Say( nRow, 00, chr(27) + chr(105) , nCompress ) // Corte Parcial
oPrnCmp:EndPage()
oPrnCmp:End()
PrintFileRaw( cLptDoc, cFilPrn ) // PrintFileRaw( "\\CAJA01\TICKET", "luis.prn" )
lo uso a partir de una clase modificada por Giancarlo J. Sabattino S. (08-07-2001), lo que me agrada es que el command() recibe un array, tambien genera un archivo.prn que puedes direccionar a cualquier impresora, local o en red