Buscar

Impressão direto pra porta (lpt, usb)

Código

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

 

Publicidade

Vote na dica




Quantidade de votos: 0 votos
Aceitação: 0%


Detalhes da dica

Categoria: Impressão
Adicionada dia: 12/08/03
Por: Uildenei Geverson Junior Uliana
Visualizada: 17670 vezes

Planeta Delphi - Tudo sobre programação Delphi Planeta Delphi - www.planetadelphi.com.br - Todos os direitos reservados | Copyright 2001-2009