terça-feira, 1 de outubro de 2013

Impressão com o método Canvas - Final

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