PDA

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