Impressao - direto para porta lpt e usb

Top  Previous  Next

Impressão direto pra porta (lpt, usb)

Categoria: Impressão

 

//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..255Of 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;