quarta-feira, 30 de setembro de 2009

Impressão direto pra porta (lpt, usb)

//declare o tipo e a classe abaixo
//caso alguem tenha alguma duvida entre em contato
//ntw@wmail.com.br

type
DOC_INFO_1 = Packed Record
pDocName: PChar;
pOutputFile: PChar;
pDataType: PChar;
End;

TDirectPrinterStream = Class(TStream)
private
FPrinter: TPrinter;
FHandle: THandle;
FTitle: String;
procedure CreateHandle;
procedure FreeHandle;
public
constructor Create(aPrinter: TPrinter; aTitle: String);
destructor Destroy; Override;
function Write(const Buffer; Count: LongInt): Longint; Override;
function Read(var Buffer; Count: Longint): Longint; override;
property Handle: THandle Read FHandle;
End;


//a implementação e a seguinte:

{********************** STREAM DE DADOS PARA A IMPRESSAO DIRETO PRA IMPRESSORA}

Constructor TDirectPrinterStream.Create(aPrinter: TPrinter; aTitle: String);
Begin
Inherited Create;
FPrinter := aPrinter;
FTitle := aTitle;
CreateHandle;
End;

procedure TDirectPrinterStream.CreateHandle;
var
DocInfo: DOC_INFO_1;
aDevice, aDriver, aPort: Array[0..255] Of Char;
aMode: Cardinal;
Begin
FreeHandle;
if FHandle = 0 then
begin
FPrinter.GetPrinter(aDevice, aDriver, aPort, aMode);
if OpenPrinter(aDevice, FHandle, Nil) then
begin
DocInfo.pOutputFile:=nil;
DocInfo.pDataType:='RAW';
DocInfo.pDocName := PChar(FTitle);
if StartDocPrinter(FHandle, 1, @DocInfo) = 0 then
begin
ClosePrinter(FHandle);
FHandle := 0;
end
else if not StartPagePrinter(FHandle) then
begin
EndDocPrinter(FHandle);
ClosePrinter(FHandle);
FHandle := 0;
end;
end;
end;
End;

destructor TDirectPrinterStream.Destroy;
begin
FreeHandle;
inherited;
end;

procedure TDirectPrinterStream.FreeHandle;
begin
if FHandle <> 0 then
begin
EndPagePrinter(FHandle);
EndDocPrinter(FHandle);
ClosePrinter(FHandle);
FHandle := 0;
end;
End;

function TDirectPrinterStream.Read(var Buffer; Count: Integer): Longint;
begin
inherited;
Result:=0;
end;

function TDirectPrinterStream.Write(const Buffer; Count: LongInt): Longint;
var Bytes: Cardinal;
begin
WritePrinter(Handle, @Buffer, Count, Bytes);
Result := Bytes;
End;


//exemplo de uso:

procedure PrintDoc(sNomDoc: String = ''; sNomeArq: String = '');
var Impressora: TDirectPrinterStream;
MemTxt: TMemoryStream;
begin
Impressora := TDirectPrinterStream.Create(Printer, sNomDoc);
try
MemTxt:=TMemoryStream.Create();//criacao dos streams para a copia dos dados
FStrTXT.SaveToStream(MemTxt);//descarrega os dados gravados em memoria no stream
try
Impressora.CopyFrom(MemTxt, 0);//inicia o processo de copia dos dados para a instancia aberta da impressora
finally
MemTxt.Free;
end;
finally
Impressora.Free;
FStrTXT.Free;
end;
end;

Nenhum comentário:

Postar um comentário