PDA

Ver la Versión Completa : ¿Como se envian codigos de control a una impresora?


flystar
20-07-2006, 00:55:08
Buenos Dias:

Solicito amablemente a una alma caritativa me ayude a aclarar la siguiente duda:

Tengo una impresora de Matriz de puntos....

Es posible enviarle codigos o comandos de control para que haga tal cosa.. por ejemplo que recorra el rodillo para que el papel se regrese. O un comando para que coloque en posicion el papel o indicarle que deje un espacio entre las lineas de 3 mm etc etc etc.

No se como enviar estos codigos de control.
Se que debo enviar un caracter de escape para que entienda que le van a mandar un comando y luego enviarle el valor hexadecimal del comando
pero no se como.

Seria alguienta tan amable de ponerme un ejemplo que funcione sobre esto?

Gracias.

nemesio
20-07-2006, 01:31:30
Todas las impresoras vienen con un manual y en él se especifican los códigos que ésta maneja para realizar diferentes cosas como: Poner en Negrita, Subrayar, etc. etc. Revisa el manual y alli debes encontar los códigos que andas buscando. Estos varían de una marca a otra.

Saludos.

flystar
20-07-2006, 09:29:24
hola, Gracias por tu respuesta.
Tal vez no me di a entender bien.
NO busco los codigos.. esos ya los tengo porque tengo el manual.
Lo que no se, es como programar en Delphi para enviar esos codigos a la impresora desde mi programa...
hasta el momento se que tengo que enviar un caracter de escape para que la impresora sepa que le voy a enviar un comando.. pero eso es todo lo que se hasta el momento.
Alguien me podria dar un ejemplo de como se hace?

Gracias.

aledieb
20-07-2006, 18:40:15
Yo lo hacia abriendo la impresora como si fuera un archivo con fopen y escribia con write ó writeln con win98 y anteriores, pero esto tal ves no te sirva, fijate en la unidad printers del delphi.

Otra opción sería si usas reportes, en el evento beforeprint enviar los códigos desde alli.

AGAG4
21-07-2006, 01:53:33
Estoy es algo similar de lo que te dice Alejandro, puedes agregar los códigos de control por medio de 1 archivo de texto:

....
var
Txt :TextFile;
try
AssignFile(txt,'c:\Codigos.txt');
//Reset
Write(txt, #27'@');
finally
CloseFile(txt);
end;

if SpoolFile('c:\Codigos.txt','\\Servidor\Facturas') <> 0 then
ShowMessage('Impresora No esta Preparada');
......
function SpoolFile(const FileName, PrinterName: string): Integer;
var
Buffer: record
JobInfo: record // ADDJOB_INFO_1
Path: PChar;
JobID: DWORD;
end;
PathBuffer: array[0..255] of Char;
end;
SizeNeeded: DWORD;
Handle: THandle;
PrtName: string;
ok: Boolean;
begin
// Flush job to printer
PrtName := PrinterName;
if PrtName = '' then
PrtName := Printer.Printers[Printer.PrinterIndex]; // Default printer name
ok := False;
if OpenPrinter(PChar(PrtName), Handle, nil) then
if AddJob(Handle, 1, @Buffer, SizeOf(Buffer), SizeNeeded) then
if CopyFile(PChar(FileName), Buffer.JobInfo.Path, True) then
if ScheduleJob(Handle, Buffer.JobInfo.JobID) then
ok := True;
if not ok then
Result := GetLastError
else
Result := 0;
end;


Espero te sirva....Suerte.

neasoporte
05-08-2006, 01:10:07
Debe haber mejor manera,yo lo solucione de esta forma

procedure TFprimostrador.btnpresuClick(Sender: TObject);
var
aexport:tqrasciiexportfilter;
chkdos:bool;
begin
imprimeok:='S';
chkdos:=fcfgprinter.chkprndos.Checked;
case chkdos of
False:begin
pnlopcprn.Visible:=false;
if imprimeok='S' then
begin
fprnpresu.exptot.Expression:='sum(qprev.subtotal)';
fprnpresu.qrppresu.Print;
end else
MessageDlg('Problemas de Comunicacion Con Impresora..Verifique', mtInformation,[mbOk], 0);
gridprev.SetFocus;
end else
begin
pnlopcprn.Visible:=false;
if imprimeok='S' then
begin
try
fprnpresu2.exptot.Expression:='sum(qprev.subtotal)';
fprnpresu2.k1.Caption:=chr(14);
fprnpresu2.k2.Caption:=chr(20);
fprnpresu2.k3.Caption:=chr(15);
fprnpresu2.k4.Caption:=chr(14);
fprnpresu2.k5.Caption:=chr(20);
aexport:=tqrasciiexportfilter.create('c:\preventa\presu.txt');
fprnpresu2.qrppresu2.ExportToFilter(aexport);
ShellExecute(handle,'open','Command.com','Command.com /c type c:\preventa\presu.txt>lpt1','',sw_normal);
aexport.Finish;
finally
if not printer.Printing then
begin
saltos:=fcfgprinter.edtsaltos.IntValue;
paracorte;
end;
end;
end else
MessageDlg('Problemas de Comunicacion Con Impresora..Verifique', mtInformation,[mbOk], 0);
gridprev.SetFocus;
end;
end;
end;




procedure TFprimostrador.mandocode(s: string);
var
Handle, hDeviceMode: THandle;
N: DWORD;
DocInfo1: TDocInfo1;
Device, Driver, Port: array[0..255] of char;
PrinterName: string;
buf:array[0..255] of char;
lbuf:integer;
begin
Printer.GetPrinter(Device, Driver, Port, hDeviceMode);
PrinterName := Format('%s', [Device]);
if not OpenPrinter(PChar(PrinterName), Handle, nil) then
//RaiseLastWin32Error;
imprimeok:='N';
try
with DocInfo1 do
begin
pDocName := 'Control';
pOutputFile := nil;
pDataType := 'RAW';
end;
StartDocPrinter(Handle, 1, @DocInfo1);
try
lbuf:=length(s);
copymemory(@buf,Pchar(s),lbuf);
if not WritePrinter(Handle, @buf, lbuf, N) then
//RaiseLastWin32Error;
imprimeok:='N';
finally
EndDocPrinter(Handle);
end;
finally
ClosePrinter(Handle);
end;
end;

procedure TFprimostrador.paracorte;
var
inisalto:integer;
begin
for inisalto:=1 to saltos do
begin
s:=#27+#10;
mandocode(s);
end;
end;