Ver la Versión Completa : Problema con codigos de escape
Cecil
06-08-2007, 15:48:44
Hola a todos, tengo un problema, y es que mi impresora de tickets (SAMSUNG BIXOLON SRP-275) al imprimir, lo hace y termina con medio papel dentro, con lo que tengo que darle al botoncito para que vaya sacando el rollo y finalmente cortarlo. Pero me gustaría hacerlo a través de códigos de escape, que no son cosa sencilla porque directamente no me sale :p. Os pego el código que uso:
type
TDatos = Record
nLong : Integer;
bDatos : Array[0..255] of byte;
end;
procedure CodigoEscape(sImpresora: String; sCodigo: String);
var
PtImpresora: TPrinter;
DtCadena : TDatos;
Begin
PtImpresora := TPrinter.Create;
try
PtImpresora.PrinterIndex := PtImpresora.Printers.IndexOf( sImpresora );
PtImpresora.BeginDoc;
DtCadena.nLong := Length( sCodigo );
StrPCopy( @DtCadena.bDatos, sCodigo );
Escape( PtImpresora.Handle, PASSTHROUGH, 0, @DtCadena, nil );
PtImpresora.EndDoc;
finally
FreeAndNil( PtImpresora );
end;
end;
Simplemente no funciona, y me gustaría saber si hago algo mal, o no se. Un saludo y mil gracias.
jmb1963
06-08-2007, 23:50:32
Hola,
por que no lo haces mas simple..
yo lo utilizo mas menos asi:
AssignFile(MyFile, iPtoImpVal ); // (Para la LPT1)
reset( MyFile );
rewrite(MyFile);
write(MyFile,Chr(27) + chr(64)); // resetea impresora;
write(MyFile, Chr(29)+ Chr(104)+ Chr(100)); // Altura barras
write(MyFile, sP1, Chr(29)+ Chr(119)+ Chr(2)); // Ancho codigo
write(MyFile, Chr(29)+ Chr(72)+ Chr(2)); // Posision codigo barras
write(MyFile, Chr(29)+ Chr(107)+ Chr(4)+ sEstacion + sNVale + Chr(0)); // Codigo
write(MyFile, Chr(27)+ Chr(97)+ Chr(0));
write(MyFile, Chr(27)+ Chr(33)+ Chr(16)); // Doble alto - On
write(MyFile, 'Total........: ' + Justifica( Picture(SoloNumeros(FloatToStr(iTotal),0)), 'D', 10 )+'.-');
write(MyFile, Chr(27)+ Chr(33)+ Chr(8)); // Doble alto - Off
// Pre-Corta vale
if ( sCortaBarra = '1' ) then
Incl( 1, sP1, chr(29)+chr(86)+ chr(49)); // Corta Papel
// Abre la Gabetera conectada a la impresora de Boletas
Incl( 0, sP1, Chr(27)+Chr(112)+'0'+'0'+'0' );
la funcion Incl(, .. es una funcion propia en la cual envio un estado para validar si salta o no de linea, el puerto sobre el cual imprimira.. y el resto de los caracteres son historia.. (comandos de impresion).
Espero que estos ejemplos te sirvan.
Saludos
Jose Miguel B.
luisgutierrezb
07-08-2007, 00:27:13
en lo personal se me hace un desperdicio mandar saltos de linea para que suba el papel, porque no mejor imprimes una parte o todo el encabezado del que seria el nuevo ticket y asi no desperdicias tanto papel?
jmb1963
07-08-2007, 00:50:15
Hola.
Cuando hablo de salto de linea no me referia al papel. sino a la forma de imprimir.
si voy a imprimir uno o varios codigos de escape lo escrivo asi:
Incl( 0, sP1, Chr(27)+ Chr(33)+ Chr(8)); // Doble alto - Off
Incl( 0, sP1, Chr(27)+ Chr(69)+ Chr(0)); // Negrita - Off
Incl( 0, sP1, Chr(27)+ Chr(77)+ Chr(1)); // Comprimida On (Samsung)
... procesa los tres codigos y no mueve ni el cabezal, ni el papel. En cambio si deseo imprimir:
Incl( 1, sP1, 'Sub-Total....: ' + Justifica( Picture(SoloNumeros(FloatToStr (iTotal),nDecimal)), 'D', 10 )+'.-');
Incl( 1, sP1, 'Descuento....: ' +
Justifica( Picture(SoloNumeros(FloatToStr(itDescto),0)), 'D', 10 )+'.-');
Incl( 1, sP1, 'Total........: ' + Justifica( Picture(SoloNumeros(FloatToStr(iTotal),0)), 'D', 10 )+'.-');
Incl( 1, sP1, ' * * * ' );
Incl( 1, sP1, 'COMPROBANTE VALIDO SOLO PARA USO INTERNO' );
Incl( 1, sP1, 'NO VALIDO PARA RETIRO DE MERCADERIA.' );
Incl( 1, sP1, ' * ' );
imprime y salta, para imprimir la siguiente linea.
Saludos
Jose Miguel B.
martinzcr
08-08-2007, 15:33:38
Hola!
Lo que puedes hacer es agregar en la configuración una opción para que el usuario defina la cantidad de lineas libres al final del ticket. Esto te va a servir luego si cambias de impresora ya que algunas tienen el core más arriba o mas abajo. Yo lo manejo así y al final del ticket agrego algo así
for n:=1 to nLineasPie do
Writeln(prn, ' ');
Espero que te sirva. Saludos
vBulletin v3.6.8, Derechos ©2000-2024, Jelsoft Enterprises Ltd.