Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Impresión (https://www.clubdelphi.com/foros/forumdisplay.php?f=4)
-   -   Problema con codigos de escape (https://www.clubdelphi.com/foros/showthread.php?t=46663)

Cecil 06-08-2007 15:48:44

Problema con codigos de escape
 
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:

Código:

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í

Código Delphi [-]
for n:=1 to nLineasPie do
     Writeln(prn, ' ');

Espero que te sirva. Saludos


La franja horaria es GMT +2. Ahora son las 23:46:45.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi