PDA

Ver la Versión Completa : Despúes de la primera impresión salen 2 caracteres no deseados


José Luis Garcí
19-10-2013, 15:40:26
Hola compañeros, como siempre solicito vuestra ayuda para lo siguiente, estoy trabajando en el sistema de TPV y antes de implantarlo en el me surge el siguiente problema, resulta que el primer ticket me sale bien

http://nsae01.casimages.net/img/2013/10/19/131019025807269525.jpg (http://www.casimages.es/i/131019025807269525.jpg.html)

Pero a partir de este momento cada vez que mando a imprimir un ticket me sale con un ",P" al principio, os pongo una imagen

http://nsae01.casimages.net/img/2013/10/19/131019025955805995.jpg (http://www.casimages.es/i/131019025955805995.jpg.html)

Esto sucede cada vez después de la primera y hasta que apago y vuelvo a iniciar la impresora.

Esta hecho en Delphi 10, con una Epson TM-U210PB y con windows7,
La impresora esta conectada a un puerto USB y tiene un cajón monedero incorporado, además la impresora tinene cuchilla de corte

Aquí os pongo el código usado

procedure TForm1.Button6Click(Sender: TObject);
var i:Integer;
begin
if cmbPrinters.Text<>'' then
begin

if cmbPrinters.ItemIndex >= 0 then
begin
WriteRawDataToPrinter(cmbPrinters.Items[cmbPrinters.ItemIndex],'\027\033\000');
WriteRawDataToPrinter(cmbPrinters.Items[cmbPrinters.ItemIndex],'\027\033\017'+Relleno(MyTextReplace('XXXXXXXX XXXXXX, X.X.'),' ',42,2)+'\x0A\x0D');
WriteRawDataToPrinter(cmbPrinters.Items[cmbPrinters.ItemIndex],'\027\033\001'+(Espacios(MyTextReplace('Xxxxxxxxxx, 9'),22,0)+Espacios('',1,0)+Espacios('C.I.F.:X-99.999.999',18,1))+'\x0A\x0D');
WriteRawDataToPrinter(cmbPrinters.Items[cmbPrinters.ItemIndex],'\027\033\001'+(Espacios('C.P.:99.999',11,0)+Espacios('',1,0)+Espacios('Xxx Xxxxxx',30,0))+'\x0A\x0D');
WriteRawDataToPrinter(cmbPrinters.Items[cmbPrinters.ItemIndex],'\027\033\001'+(Espacios('Xxx Xxxxxx xx Xxxx Xxxxxxx',42,0))+'\x0A\x0D');
WriteRawDataToPrinter(cmbPrinters.Items[cmbPrinters.ItemIndex],'\027\033\001'+(Espacios('Tfo: 999 999 999',20,0)+Espacios('',2,0)+Espacios('Fax: 999 999 999',20,1))+'\x0A\x0D');
WriteRawDataToPrinter(cmbPrinters.Items[cmbPrinters.ItemIndex],'\027\033\001'+(Espacios('Email: xxxxxx@xxxxxxx.xxx',42,0))+'\x0A\x0D');
WriteRawDataToPrinter(cmbPrinters.Items[cmbPrinters.ItemIndex],'\027\033\001'+(Espacios('Web: Xxxxxxx.xxx',42,0))+'\x0A\x0A\x0D');
WriteRawDataToPrinter(cmbPrinters.Items[cmbPrinters.ItemIndex],'\027\033\001'+Espacios('Fecha: '+DateToStr(Now),20,0)+Espacios('',2,0)+Espacios('Hora: '+TimeToStr(Now),20,1)+'\x0A\x0A\x0D');
WriteRawDataToPrinter(cmbPrinters.Items[cmbPrinters.ItemIndex],'\027\033\001Cant. Concepto P.Ud Importe\x0A\x0D');
WriteRawDataToPrinter(cmbPrinters.Items[cmbPrinters.ItemIndex],'\027\033\001------------------------------------------\x0A\x0D');
For i := 0 To ListView1.Items.Count-1 do
begin
WriteRawDataToPrinter(cmbPrinters.Items[cmbPrinters.ItemIndex],DesCRlinea(StrToInt(ListView1.Items.Item[i].SubItems[0]),ListView1.Items.Item[i].SubItems[1],
Strtofloat(ListView1.Items.Item[i].SubItems[2])));
end;
WriteRawDataToPrinter(cmbPrinters.Items[cmbPrinters.ItemIndex],'\027\033\001------------------------------------------\x0A\x0D');
WriteRawDataToPrinter(cmbPrinters.Items[cmbPrinters.ItemIndex],'\027\033\009SUBTOTAL........................:'+Espacios(FormatFloat('#,##0.00',VarDSubtotal),9,1)+ '\x0A\x0D');
WriteRawDataToPrinter(cmbPrinters.Items[cmbPrinters.ItemIndex],'\027\033\009I.G.I.C.........................:'+Espacios(FormatFloat('#,##0.00',VardImpuestos),9,1) +'\x0A\x0D');
WriteRawDataToPrinter(cmbPrinters.Items[cmbPrinters.ItemIndex],'\027\033\009TOTAL...........................:'+Espacios(FormatFloat('#,##0.00',vardtotal),9,1)+'\x 0A\x0D');
WriteRawDataToPrinter(cmbPrinters.Items[cmbPrinters.ItemIndex],'\x1B@\x0A\x0A\x0A\x0A\x0A\x0A\x0A\x0A\x0A\x0A\x0D\x1Bi\x0A\x0D'); //Avanze y Corta el PApel
WriteRawDataToPrinter(cmbPrinters.Items[cmbPrinters.ItemIndex],'\027\112\000,\050,\080');
WriteRawDataToPrinter(cmbPrinters.Items[cmbPrinters.ItemIndex],'\027\033\000');
end;
End else ShowMessage('Elija primero una impresora');
end;

y aquí las funciones llamadas



function WriteRawDataToPrinter(PrinterName: String; Str: String): Boolean;
var
PrinterHandle: THandle;
DocInfo: TDocInfo1;
i: Integer;
B: Byte;
Escritos: DWORD;
begin
Result:= FALSE;
if OpenPrinter(PChar(PrinterName), PrinterHandle, nil) then
try
FillChar(DocInfo,Sizeof(DocInfo),#0);
with DocInfo do
begin
pDocName:= PChar('Printer Test');
pOutputFile:= nil;
pDataType:= 'RAW';
end;
if StartDocPrinter(PrinterHandle, 1, @DocInfo) <> 0 then
try
if StartPagePrinter(PrinterHandle) then
try
while Length(Str) > 0 do
begin
if Copy(Str, 1, 1) = '\' then
begin
if Uppercase(Copy(Str, 2, 1)) = 'X' then
Str[2]:= '$';
if not TryStrToInt(Copy(Str, 2, 3),i) then
Exit;
B:= Byte(i);
Delete(Str, 1, 3);
end else B:= Byte(Str[1]);
Delete(Str,1,1);
WritePrinter(PrinterHandle, @B, 1, Escritos);
end;
Result:= TRUE;
finally
EndPagePrinter(PrinterHandle);
end;
finally
EndDocPrinter(PrinterHandle);
end;
finally
ClosePrinter(PrinterHandle);
end;
end;

//------------------------------------------------------------------------------
//***********************************************************[ Relleno ]*******
//------------------------------------------------------------------------------
// [21/04/2012] J.L.G.T.//Modificada y adaptada por mi de una Bajada de internet
// Ideada para la impresora de tickets, pero muy util para otras
//-Ejemplo----------------------------------------------------------------------
// Delvuelve unacadena reyena de caracteres al fondo, al frente o centrada +-
// Ejemplo
// Relleno(texto,' ',30,1)= ' texto'
// Relleno(texto,' ',30,0)= 'texto '
// Relleno(texto,'*',30,2)= '*************Texto***********'
//------------------------------------------------------------------------------
function Relleno(text,Rell:string;Cant,posi:integer):string;
var
valor,x:integer;
dev,con:string;
begin
con:='';
valor:=length(text);
if valor < Cant then
begin
case posi of
0..1: begin
for x:=1 to (cant-valor) do
begin
con:=con+Rell;
end;
end;
2: begin
for x:=1 to ((cant-valor) div 2) do
begin
con:=con+Rell;
end;
end;
end;
case posi of
0: dev:=con+text;
1: dev:=text+con;
2: begin
if Cant=(Valor+length(Con)+length(Con)) then dev:=con+text+con
else
begin
if Cant>(Valor+length(Con)+length(Con)) then dev:=con+text+Con+Rell
else dev:=con+text+copy(con,0,(length(con)-(Cant-(Valor+length(Con)+length(Con)))));
end;
end;
end;
end
else
dev:=text;
result:=dev;
end;

//------------------------------------------------------------------------------
//***********************************************************[ ESPACIOS ]*******
// Delvuelve unacadena reyena de espacios al fondo o al frente
// Bajada de internet
// Ejemplo
// espacios(texto,30,1)= ' texto'
// espacios(texto,30,0)= 'texto '
//------------------------------------------------------------------------------
function espacios(text:string;Cant:integer;posi:integer):string;
var
valor,x:integer;
dev,con:string;
begin
con:='';
valor:=length(text);
if valor < Cant then
begin
for x:=1 to (cant-valor) do
begin
con:=con+' ';
end;
if posi=1 then dev:=con+text
else dev:=text+con;
end
else
dev:=text;
result:=dev;
//+'('+IntToStr(valor)+')('+IntToStr(Cant)+')('+IntToStr(Cant-valor)+')';
end;

function MyTextReplace(Texto:String):String;
begin
if Texto<>'' then begin
Texto:= AnsiReplaceStr(Texto,'Ñ', #165);
Texto:= AnsiReplaceStr(Texto,'ñ', #164);
Texto:= AnsiReplaceStr(Texto,'á', #160);
Texto:= AnsiReplaceStr(Texto,'é', #101);//#130);
Texto:= AnsiReplaceStr(Texto,'í', #161);
Texto:= AnsiReplaceStr(Texto,'ó', #162);
Texto:= AnsiReplaceStr(Texto,'ú', #163);
Texto:= AnsiReplaceStr(Texto,'Á', #65);
Texto:= AnsiReplaceStr(Texto,'É', #144);
Texto:= AnsiReplaceStr(Texto,'Í', #73);
Texto:= AnsiReplaceStr(Texto,'Ó', #79);
Texto:= AnsiReplaceStr(Texto,'Ú', #85);
Texto:= AnsiReplaceStr(Texto,'Ü', #85);
Texto:= AnsiReplaceStr(Texto,'Ü', #129);
Result:=Texto;
end;
end;



A ver si podéis ayudarme y decirme por que de este error

Casimiro Notevi
19-10-2013, 16:55:55
WriteRawDataToPrinter(cmbPrinters.Items[cmbPrinters.ItemIndex],'\027\112\000,\050,\080');
Creo que el error está ahí, sobran las comas, ¿puede ser?

José Luis Garcí
19-10-2013, 18:19:19
WriteRawDataToPrinter(cmbPrinters.Items[cmbPrinters.ItemIndex],'\027\112\000,\050,\080');
Creo que el error está ahí, sobran las comas, ¿puede ser?

MOUSTRUO, ojo clínico es lo tuyo (nada que ver con tu nick), yo durante horas estudiando el ESP de Epson y tu le echas un vistazo al código y a la primera. Muchas gracias compañero.


Por cierto en la función relleno hay un error al copiar el principio es donde pone if Valorthen debe ir if valor<Cant then

Casimiro Notevi
19-10-2013, 18:24:33
Nada, hombre, sólo me dije: la P en hexa es 80 y lleva una coma delante. Voy al final del código de impresión y ahí estaba, la coma y el 80, apenas 10 segundos :cool:
Realmente es solo experiencia, muchos años "debugeando" :p