Você está na página 1de 6

Dicas de impressão no Delphi - 

parte 2
Imprimindo um bitmap utilizando TPrinter

As vezes, quando utilizados os médoto Draw e StretchDraw da propriedade Canvas do


objeto TPrinter, a imagem não é impressa, para corrigir isto, utilize esta procedure,
que passando como parâmetros a instância Printer.Canvas, Margem Esquerda, Margem
Superior

procedure .DrawImage( Canvas : TCanvas; X, Y, Width, Height : Integer; ABitmap :


TBitmap);
var
  Header, Bits : Pointer;
  HeaderSize : Integer;
  BitsSize : Longint;
begin
  GetDibSizes( ABitmap.Handle, HeaderSize, BitsSize );
  Header := AllocMem( HeaderSize );
  Bits := AllocMem( BitsSize);
  try
    GetDib( ABitmap.Handle, ABitmap.Palette, Header^, Bits^);
   
StretchDIBits(Canvas.Handle,X,Y,Width,Height,0,0,ABitmap.Width,ABitmap.Height,Bits
,
    TBitmapInfo(Header^),DIB_RGB_COLORS,SRCCOPY);
  finally
    FreeMem( Header, HeaderSize);
    FreeMem( Bits, BitsSize );
  end;
end;

Imprimindo um campo memo via Canvas

Coloque na clásula Uses a unit printers

procedure TForm1.Button1Click(Sender: TObject);


var
  i, altura : Integer;
  sMemo : String;
begin
  With Printer do
  begin
    Title:= 'Imprimindo memo';
    BeginDoc;
  With Canvas do
  begin
    altura := TextHeight('A');
    for i := 1 to Memo1.Lines.Count do
    begin
    sMemo := Memo1.Lines[I];
    TextOut(1, (i - 1) * Altura, sMemo);
    end;
  end;
  EndDoc;
  end;
end;

Imprimir caracteres acentuados diretamente para a impressora

{ Usando comandos da impressora podemos fazer isto de uma forma bastante simples.
Quando enviamos o caractere ASCII número 8 (oito) para a impressora, a cabeça de
impressão retrocede uma posição, pois este caractere é o BackSpace. Então podemos
imprimir a letra sem acento e, sem seguida, voltar e imprimir o acento desejado.
Vejamos um exemplo:

  - Coloque um botão no form;

  - Altere o evento OnClick deste botão conforme abaixo: }

procedure TForm1.Button2Click(Sender: TObject);


var
  F: TextFile;
begin
  AssignFile(F, 'LPT1');
  Rewrite(F);
  try
  { Regra: caractere sem acento + chr(8) + acento }
  WriteLn(F, 'Este e' + #8 + '''' + ' um teste.');
  WriteLn(F, 'Acentuac' + #8 + ',a' + #8 + '~o.');
  WriteLn(F, 'Vovo' + #8 + '^');
  WriteLn(F, 'U' + #8 + '''' + 'ltimo.');
  WriteLn(F, #12); // Eject
  finally
  CloseFile(F);
  end;
end;
Observações

Usando este recurso, a acentuação não fica excelente, mas melhora bastante.

Imprimir com precisão milimétrica

O objeto Canvas que está na classe Printer é uma ferramenta que ajuda muito a
imprimir qualquer tipo de dados, sejam eles texto ou gráficos. O problema é que a
largura e a altura são determinadas em pixels, e esses valores variam de acordo com a
resolução da impressora. Para converter de milímetros para pixels, use as funções
abaixo, sendo que MMtoPixelX é para a resolução horizontal e MMtoPixelY é para a
resolução vertical (porque na impressora é possível uma resolução como 1440x720 dpi
- 1440 dpi para a horizontal e 720 dpi para a vertical, por exemplo):
function MMtoPixelX (MM : Integer) : Longint;
var
  mmPointX : Real;
  PageSize, OffSetUL : TPoint;
begin
  mmPointX := Printer.PageWidth / GetDeviceCaps(Printer.Handle,HORZSIZE);
  Escape (Printer.Handle,GETPRINTINGOFFSET,0,nil,@OffSetUL);
  Escape (Printer.Handle,GETPHYSPAGESIZE,0,nil,@PageSize);
  if MM > 0 then
    Result := round ((MM * mmPointX) - OffSetUL.X)
  else
    Result := round (MM * mmPointX);
end;

function MMtoPixelY (MM : Integer) : Longint;


var
  mmPointY : Real;
  PageSize, OffSetUL : TPoint;
begin
  mmPointY := Printer.PageHeight /
  GetDeviceCaps(Printer.Handle,VERTSIZE);
  Escape (Printer.Handle,GETPRINTINGOFFSET,0,nil,@OffSetUL);
  Escape (Printer.Handle,GETPHYSPAGESIZE,0,nil,@PageSize);
  if MM > 0 then
    Result := round ((MM * mmPointY) - OffSetUL.Y)
  else
    Result := round (MM * mmPointY);
end;

Imprimir Direto Para Impressora

procedure TForm1.Button1Click(Sender: TObject);


var
  F : TextFile;
  i : integer;
begin
  AssignFile(F,'LPT1');
  Rewrite(F);
  i := 0;
  Writeln(F,'Teste de impressao - Linha 0');
  Writeln(F,'Teste de impressao - Linha 1');
  Writeln(F,#27#15+'Teste de Impressão - Linha 2');
  Writeln(F,'Teste de impressao - Linha 3');
  Writeln(F,#27#18+'Teste de Impressão - Linha 4');
  Writeln(F,'Teste de impressao - Linha 5');
  Writeln(F,#12); // Ejeta a página
  CloseFile(F);
end;

 
Imprimir em impressora matricial em modo caracter

Procedure TForm1.Button1Click(Sender: TObject);


var Arquivo : TextFile;
begin
  AssignFile(Arquivo,'LPT1');
  Rewrite(Arquivo);
  Writeln(Arquivo,'Teste de impressao - Linha 0');
  Writeln(Arquivo,'Teste de impressao - Linha 1');
  Writeln(Arquivo,#27#15+'Teste de Impressão - Linha 2');
  Writeln(Arquivo,'Teste de impressao - Linha 3');
  Writeln(Arquivo,#27#18+'Teste de Impressão - Linha 4');
  Writeln(Arquivo,'Teste de impressao - Linha 5');
  Writeln(Arquivo,#12); // Ejeta a página
  CloseFile(Arquivo);
end;

Dicas de impressão no Delphi


Impressão Com o TPrinter ( Via gerenciador de impressão)

procedure TForm1.BitBtn1Click(Sender: TObject);


var
  Linha:integer;
  Tamanho:integer;
  Coluna:integer;
begin
  Printer.Orientation := poLandscape;
  Printer.BeginDoc;
  Printer.Canvas.Pen.Width := 5;
  Printer.Canvas.Font.Name := 'Times New Roman';
  Printer.Canvas.Font.Size := 10;
  Linha := 20;
  Coluna:= 20;
  Tamanho := Printer.Canvas.TextWidth('a');
  Table1.First;
    while not Table1.Eof do begin
      if Linha = 20 then  begin
        Coluna := 20;
        Printer.Canvas.TextOut(0,Linha,'Relação de Clientes');
        Linha := Linha - Printer.Canvas.Font.Height + 5 ;
        Printer.Canvas.TextOut(Coluna,Linha,'Cod');
        Coluna:= Coluna + (Tamanho * 5 );
        Printer.Canvas.TextOut(Coluna,Linha,'Nome');
        Coluna:= Coluna + (Tamanho * 30);
        Printer.Canvas.TextOut(Coluna,Linha,'Endereço');
        Coluna:= Coluna + (Tamanho * 30);
        Linha := Linha - Printer.Canvas.Font.Height + 5 ;
      end;
      Coluna := 20 ;
      Printer.Canvas.TextOut(Coluna,Linha,Table1.FieldByName('Codigo').AsString);
      Coluna:= Coluna + (Tamanho * 5 );
      Printer.Canvas.TextOut(Coluna,Linha,Table1.FieldByName('Nome').AsString);
      Coluna:= Coluna + (Tamanho * 30);
      Printer.Canvas.TextOut(Coluna,Linha,Table1.FieldByName('End').AsString);
      Coluna:= Coluna + (Tamanho * 30);
      Linha := Linha - Printer.Canvas.Font.Height + 5 ;
      Table1.Next;
          if Linha > Printer.PageHeight-20 then  Begin
             Printer.NewPage;
             Linha := 20;
          end;
    end;
  Printer.EndDoc;
end;

Imprimindo com o Bloco de Notas

WinExec('NotePad.exe /p c:\FileName.txt', 0)

Imprimindo Forms

O exemplo a seguir é um procedimento para imprimir um form. Para imprimir o form,


basta informar o nome do mesmo como parâmetro: PrintForm(Form1). Antes de
imprimir, a cor atual do form é salva em OldColor e alterada para clWhite
(frm.Color := clWhite), para evitar gasto excessivo de tinta da impressora (ou tonner).

PrintForm
uses
  Windows, SysUtils, Printers, Forms, Graphics, Controls, Classes;
 .
 .
 .
procedure PrintForm(frm: TForm);
var
  bmp: TBitMap;
  x, y, WDPI, HDPI: Integer;
  OldColor: TColor;
begin
  Screen.Cursor := crHourGlass;
  OldColor := frm.Color;
  frm.Color := clWhite;
  frm.Update;
  bmp := frm.GetFormImage;

  with Printer do
  begin
  Orientation := poLandscape;
  BeginDoc;
  HDPI := PageHeight div 8;
  WDPI := PageWidth div 8;
  x := PageWidth - Round(WDPI * 0.4); {0.4" margem direita}
  y := PageHeight - Round(HDPI * 0.5); {0.5" Altura do rodapé}
  Canvas.StretchDraw(Rect(0, 0, x, y), bmp);
  EndDoc;
  end;
  bmp.Free;
  frm.Color := OldColor;
  Screen.Cursor := crDefault;
end;

Você também pode gostar