Zurdo Soft es:
Jorge E. Ferreyra
Periodistas Argentinos 234 - (5900)Villa María
Tel.: 0353 453 8034 - 0353 155 66 7350
Córdoba - Argentina

Impresión Delphi

Es común encontrar en los foros sobre Delphi consultas sobre como imprimir directamente al puerto de una impresora serie. Generalmente son para imprimir tickets.
En este caso me llegó una EPSON TM U220 no fiscal para hacer funcionar con una aplicación.
Hice varias rutinas que funcionaron pero esta me gustó y quiero compartirla, la corrección de caracteres españoles la hizo mi amigo Luis Loudet.

const
  ESC=CHR($1B);
  GS=Chr($1D);
  Inicializa=ESC+'@';
  Alin=ESC+'a';
  Izquierda=Alin+CHR(0);
  Centrado =Alin+CHR(1);
  Derecha  =Alin+CHR(2);
  FTE=ESC+'!';
  Fte10pp                =FTE+CHR(0);
  Fte12pp                =FTE+CHR(1);
  Fte10ppProp         =FTE+CHR(2);
  Fte12ppProp         =FTE+CHR(3);
  Fte10ppComp       =FTE+CHR(4);
  Fte12ppComp       =FTE+CHR(5);
  Fte10ppPropComp=FTE+CHR(6);
  Fte12ppPropComp=FTE+CHR(7);
  Fte10ppNegr         =FTE+CHR(8);
  Fte12ppNegr         =FTE+CHR(9);
  LF           =CHR(10);
  Colores    =ESC+'r';
  FteNegro  =Colores+CHR(0);
  FteRojo   =Colores+ CHR(1);
  LineaAtras=ESC+'K'+CHR(30);
  Corte      =GS+'V'+CHR(66)+CHR(4);

function Imprimir(Puerto:Integer;Texto:string):byte;
const
    Status=#16#4#1;
    Causa= #16#4#2;
var Num:Byte;
    cont:Word;   
    Mode:DCB;   
    Tiempos:COMMTIMEOUTS;   
    // MODO DEL PUERTO SERIE
    procedure PoneModo;
    begin
      GetCommState(Puerto, Mode);
      Mode.BaudRate := 9600;
      Mode.ByteSize := 8;
      Mode.Parity := NOPARITY;  
      Mode.StopBits := ONESTOPBIT;  
      SetCommState(Puerto, Mode);    
      GetCommTimeouts(Puerto, Tiempos);  
      Tiempos.ReadIntervalTimeout := 300;
      Tiempos.ReadTotalTimeoutMultiplier:= 300;
      Tiempos.ReadTotalTimeoutConstant:= 300;   
      SetCommTimeouts(Puerto, Tiempos);  
      GetCommTimeouts(Puerto, Tiempos);  
    end;
    // ESCRIBE CADENA Y DEVUELVE CARACTERES ENVIADOS
    function Escribe(Cad:string):Integer;
    begin
      cont:=0;
      repeat
        inc(cont);
        FileWrite(puerto,Cad[cont],1);
      until cont=Length(cad);
      Result:=cont;
    end;
    // CONTROLA SI HUBO ERROR Y DEVUELVE EL NUMERO DE ERROR
    function Controla:Integer;
    begin
      Escribe(Status);
      Num:=0;
      cont := FileRead(Puerto,Num,1);    
      Result:=Num and 8;  
      if cont = 0 then Result:=99;    
      if Result=8 then begin
        Escribe(Causa);
        Num:=0;
        FileRead(Puerto,Num,1);
        Result:=Num and 44;
      end;
    end;
begin
  case Puerto of
    1:Puerto:=FileOpen('COM1',fmOpenReadWrite);
    2:Puerto:=FileOpen('COM2',fmOpenReadWrite);
    3:Puerto:=FileOpen('COM3',fmOpenReadWrite);
    4:Puerto:=FileOpen('COM4',fmOpenReadWrite);
  end;
  PoneModo;
  Escribe(Inicializa);
  if Texto<>'' then begin
    Texto:= AnsiReplaceStr(Texto,'Ñ', #165);
    Texto:= AnsiReplaceStr(Texto,'ñ', #164);
    Texto:= AnsiReplaceStr(Texto,'á', #160);
    Texto:= AnsiReplaceStr(Texto,'é', #130);
    Texto:= AnsiReplaceStr(Texto,'í', #161);
    Texto:= AnsiReplaceStr(Texto,'ó', #162);
    Texto:= AnsiReplaceStr(Texto,'ú', #163);
    Escribe(Texto);
  end;
  Result:=Controla;
  FileClose(Puerto);
end;

// Ejemplo de uso
var Cad:string;
begin
  Cad:='Prueba de impresión'+slinebreak+'Probando TM-U220'+LF;
  Cad:=LineaAtras+LineaAtras+LineaAtras+LineaAtras+Cad+Corte;
  Imprimir(1,Cad);
end;

Inicio [Internet] [Electrónica] [Programacion]

www.000webhost.com