Dicas de impressão no Delphi - parte 2
Veja mais dicas de impressão no Delphi.
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;
Artigos relacionados
-
Artigo
-
Artigo
-
Artigo
-
Artigo
-
Artigo