Hoje vamos terminar a série de artigos sobre Impressão com o Método Canvas.
Para fazer isto, podemos montar uma procedure que monte o relatório desejado, desta forma, será possível chamar esta procedure sempre que quisermos um botão imprimir na tela!
Bom, faça o seguinte: Na área de declaração de Procedures, digte:
procedure MontaRelatorio;
Depois, pressione as teclas CTRL + SHIFT + C, para que o Delphi crie automaticamente o código:
procedure TForm1.MontaRelatorio;
Begin
End;
Antes do comando begin, crie às variáveis:
coluna, linha : Single;
I, J, cont, espaco : Integer;
ilogo : TBitmap;
Data : String;
Logo, nosso código ficará assim
procedure TForm1.MontaRelatorio;
var
coluna, linha : Single;
I, J, cont, espaco : Integer;
ilogo : TBitmap;
Data : String;
Begin
End;
Pronto, já podemos começar programar. Atente-se para o seguinte: Os próximos comandos que vierem agora estarão sempre entre os comandos de Begin e End.
Application.ProcessMessages; //Permite que a aplicação processe as mensagens que estão na fila de mensagens.
coluna := Printer.PageWidth / 200; //Aqui estamos pegando a largura da página (Printer) e dividindo por 200, ou seja, 200% para termos o valor inserido dividido por 200% lembra da segunda parte do artigo?
linha := Printer.PageHeight / 200; //Aqui estamos pegando a altura da página e dividindo por 200, da mesma forma que na coluna, isto são coisas opcionais, só faço isto para ficar mais fácil de pensar;
Printer.BeginDoc; //Começamos a desenhar o relatório aqui.
With Printer.Canvas do
Begin
Agora, vamos desenhar retângulos para começar o nosso formulário.
Aqui, desenhamos um retângulo na linha 002, até a linha 020 todas as vezes que usarmos o coluna * alguma coisa, temos que utilizar a função Round, porque coluna é número dividido por 200, e o resultado desta divisão pode ser quebrado, o que implica em confusão no código;
Rectangle(Round(coluna * 005), Round(linha * 002),Round(coluna * 195), Round(linha * 020));
Aqui, desenhamos outro retângulo um pouco mais abaixo do primeiro, no entanto, note que e este retângulo ficará dentro do primeiro que foi desenhado e é bem menor que o primeiro;
Rectangle(Round(coluna * 045), Round(linha * 003),Round(coluna * 095), Round(linha * 018));
Pen.Width := 1; (Vide artigo 2)
Com estas duas linhas, desenhamos uma linha na mesma posição em X que no segundo retângulo, e como a linha é menor que o tamanho do retângulo, sabemos que esta linha estará dentro deste;
Lembre-se, MoveTo começa a linha, e LineTo termina a linha com coordenadas iniciais e finais;
MoveTo(Round(Coluna * 045), Round(linha * 012));
LineTo(Round(Coluna * 094.6), Round(linha * 012));
Podemos inserir uma imagem na página, assim:
ilogo := TBitmap.Create; //Iniciamos a variável do tipo TBitmap;
ilogo.Assign(imgLogo.Picture.Bitmap); //No caso, imgLogo é um componente TImage que está instanciado no Form;
StretchDraw(Rect(Round(coluna * 010), Round(linha * 004), Round(coluna * 031),Round(linha * 018)), ilogo); //StretchDraw, desenha um retângulo na tela, no entanto, a imagem que está na variavel ilogo, ficará encaixada certinho dentro do retângulo que está desenhado, entenderam?
Como já disse, o restante é opcional, particularmente, gosto de separar coisas diferentes dentro de retângulos, assim, o relatório fica mais organizado, depois o conteúdo vai dentro da área que compreende a extensão do retângulo, e o que é mais legal, você não precisa seguir uma ordem do tipo:
Desenha retângulo, insere conteúdo, desenha retângulo, insere conteúdo.
Como o você indica o número da coluna e da linha, podemos desenhar o relatório sem seguir necessariamente uma ordem:
Rectangle(Round(coluna * 005), Round(linha * 021.5),Round(coluna * 195), Round(linha * 52.5));
Rectangle(Round(coluna * 005), Round(linha * 52.3),Round(coluna * 195), Round(linha * 086.5));
Rectangle(Round(coluna * 005), Round(linha * 086.5),Round(coluna * 195), Round(linha * 105));
Rectangle(Round(coluna * 005), Round(linha * 105),Round(coluna * 195), Round(linha * 115));
Rectangle(Round(coluna * 005), Round(linha * 115),Round(coluna * 195), Round(linha * 195));
E depois vem o conteúdo, observe que até agora a gente só inseriu retângulos…
Font.Style := [fsBold];
Font.Name := ‘Tahoma’;
Font.Size := 010;
TextOut(Round(coluna*050), Round(linha*04.5), ‘Nº Relatório’);
Font.Size := 007; //Até aqui, formatamos o texto, daqui pra frente, com a função TextOut, estamos escrevendo na linha e na coluna indicada;
TextOut(Round(Coluna*050),Round(linha*014), ‘Teste:’);
Font.Name :=’Tahoma’;
Font.Size := 008;
TextOut(Round(coluna*100), Round(linha*005), ‘Status:’); //Note que como não reformatamos o texto e escrevemos 2 vezes em locais diferentes, o próximo texto assume a formatação anterior.
TextOut(Round(coluna*100), Round(linha*16.7), ‘Data Abertura:’);
End; //Este end é referente ao Begin da senteça With.
Quando formos finalizar o relatório, temos que utilizar o comando:
Printer.EndDoc;
E assim vai.
Não faz sentido montar um relatório todinho aqui, porque isto fica a gosto de cada um!
O importante é saber que indicamos a coluna e a linha que queremos e depois o que queremos desenhar no canvas do formulário.
Até a próxima!
Nenhum comentário:
Postar um comentário