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
[-]
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"; L:=Chr(13)+chr(10);
cadena:= 'I8,A,001'+L; cadena:= cadena + 'Q360,024' +L; cadena:= cadena + 'q480' +L; cadena:= cadena + 'rN' +L; cadena:= cadena + 'S3' +L;
cadena:= cadena + 'D7' +L;
cadena:= cadena + 'ZT' +L; cadena:= cadena + 'OD' +L;
cadena:= cadena + 'f100' +L; cadena:= cadena + 'N' +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