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..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;
|