Ver Mensaje Individual
  #12  
Antiguo 04-08-2014
Avatar de hgiacobone
hgiacobone hgiacobone is offline
Miembro
 
Registrado: may 2003
Ubicación: La Plata, Bs. As., Argentina
Posts: 165
Reputación: 21
hgiacobone Va por buen camino
Thumbs up Finalizado / Solucionado

Bien amigos, al fin y al cabo lo hemos logrado solucionar entre todos, sobre todo con el "tip" final que indicó el amigo Juanelo respecto a que él lo hace mediante un TSringList...
De aquí que surgió entonces la pregunta: ¿Y que tiene de distinto enviar un TStringList que no tenga una linea obtenida de un archivo de texto?
En apariencia nada, pero sí tiene algo distinto... y al parecer es el "retorno de carro/fin de línea" que el comando ReadLn(fTextFile, s); parece quitar.

Tambien el hecho de que que de esa forma, Juanelo enviaba el script completo, en vez de enviarlo línea a línea. Asi que la primera aproximación fue cargar el archivo externo en un TMemo y enviarlo con el componente de Juanelo directamente al dispositivo, de la forma:
Código Delphi [-]
(...)
  try
    memo1.Lines.Clear;
    memo1.Lines.LoadFromFile(OpenDialog1.FileName);
    with RawPrint1 do
    begin
      DeviceName:= sPRN;
      JobName:= 'Desde componente Raw';
      Try
       if OpenDevice = False then
        raise exception.Create('Error en impresora.')
        else WriteString(memo1.Lines.Text);
      Finally
       CloseDevice;
      End;
    end;
  except
  on E:Exception do MessageDlg(E.Message, mtWarning, [mbOk],0);
  end; 
(...)
Esto funcionó a la perfección.
Después de algunas pruebas más, apareció la solución final que es un procedimiento/función que prescinde de la utilización del componente que tan gentilmente nos ofreció Juanelo, ya que básicamente hace lo mismo y es así:
Código Delphi [-]
{-------------------------------------------------------------------------------
  Nombre:  WriteRawStringToPrinter
  Creado el:  22/07/2014
  Obs:    Envia una instrucion RAW a una impresora
-------------------------------------------------------------------------------}
function Write_RAW_StringToPrinter(Comando, PrinterName :string): Boolean;
var
   PrinterHandle: THandle;
   N: DWORD;
   DocInfo1: TDocInfo1;
begin
  Result:= FALSE;
  if not OpenPrinter(PChar(PrinterName), PrinterHandle, nil) then
  begin
    ShowMessage('Error de impresora: ' + IntToStr(GetLastError));
    Exit;
  end
  else Try
      with DocInfo1 do
      begin
        pDocName := pChar('Imprimiendo etiqueta');
        pOutputFile:= pChar(#0);
        pDataType := pChar('RAW');
      end;

      if StartDocPrinter(PrinterHandle, 1, @DocInfo1) <> 0 then
      begin
          try
            if StartPagePrinter(PrinterHandle) then
            begin
              try
                Result:=( WritePrinter(PrinterHandle,pChar(comando),Length(comando), N)  );
                if not Result then ShowMessage('Error de impresora: ' + IntToStr(GetLastError));
              finally
                EndPagePrinter(PrinterHandle);
              end;
            end;
          finally
            EndDocPrinter(PrinterHandle);
          end;
      end;
  finally
    ClosePrinter(PrinterHandle);
  end;
end;

Como alternativa, para aquellos que como yo, gustan de llevar mayor control sobre cada instrucción, puede generarse la instrucción concatendado cadenas con los comandos EPL apropiados, de esta manera:
Código Delphi [-]
Function Imprimir_Etiqueta(A,B,C,D,E:string): boolean;
var
  sPRN, L, cadena, fin: string;
begin
    sPRN:= "IMPRESORA";  // nombre de la impresora que se obtiene de la variable Printer.-
    L:=Chr(13)+chr(10);
    cadena:= 'I8,A,001'+L;         //charset
    cadena:= cadena + 'Q360,024' +L;   //ancho en Dots (10mm=80Dots...1mm=8dots)
    cadena:= cadena + 'q480' +L;       //alto en Dots
    cadena:= cadena + 'rN' +L;      //disable double buffer
    cadena:= cadena + 'S3' +L;
    cadena:= cadena + 'D7' +L;
    cadena:= cadena + 'ZT' +L; //from Top
    cadena:= cadena + 'OD' +L; //Direct thermal //Od=Transfer ribbon
    {  cadena:= cadena + 'R191,0' +L;  //punto de referencia para datos centrados (si se utiliza, sobreescribe lo indicado por comando "q") }
    cadena:= cadena + 'f100' +L;   //cut position between labels
    cadena:= cadena + 'N' +L;     //clear image buffer

{Ejemplo donde se recibe datos como:
    A:='A52,49,0,4,1,1,N,"Impresión directa..."' +L;
    B:='B46,170,0,E30,4,8,70,B,"3836556465461"' +L;
    C:='A90,50,0,3,1,1,N,"Aquí hay una leyenda..."' +L;
    D:='A90,70,0,3,1,1,N,'+'"Precio: '+FormatFloat('0.00', 10.25)+'"' +L;
    E:='A50,20,1,1,1,1,N,'+'"Fecha: '+DateToStr(date)+'"' +L;
}
    
    fin:= 'P1'+L;
    cadena:= cadena +A+B+C+D+E + fin;

    Result:= Write_RAW_StringToPrinter(cadena, sPRN);
End;

Tip final: algo muy importante, es que la dimensión de la etiqueta debe estar muy bien configurada en el driver de la impresora y luego hay que lanzar un comando de auto-calibración para que ajuste bien la separación entre etiquetas (cut position), ya que estas impresoras realizan todo su trabajo en base a estos datos.
Esto es todo amigos...!
YAKO

Última edición por hgiacobone fecha: 04-08-2014 a las 04:19:59.
Responder Con Cita