Impressão sem Preview

Como limitar as páginas para imprimir sem preview, neste artigo de Bruno Sonnino. Acesso exclusivo para Assinantes.

Impressão sem Preview

Como limitar as páginas para imprimir sem preview

 

Para iniciar esta coluna, irei dar umas dicas sobre o QuickReport. Embora ele não esteja presente no Delphi 8 e, no Delphi 7 não seja instalado junto com a instalação padrão, acredito que muitos usuários ainda façam uso dele.

"Como limitar as páginas para imprimir diretamente, sem usar PREVIEW ? Os métodos QRPRINTER.FIRSTPAGE e QRPRINTER.LASTPAGE não surtiram efeitos, pois, estranhamente, os resultados dos ambos são 0 (zero)"

A resposta para esta pergunta é bastante simples: ao invés de se usar estas propriedades de QRPrinter, deve-se usar as propriedades de PrinterSettings. Esta propriedade é do tipo TQRPrinterSettings e indica as características do relatório, como páginas a serem impressas ou título. Por exemplo, este código imprime as páginas 2 e 3 do relatório:

 

with frmRelato.QuickRep1 do begin

  PrinterSettings.FirstPage := 2;

  PrinterSettings.LastPage := 3;

  Print;

end;

 

 

"Coloquei o componente TPrintDialog para facilitar a opção de imprimir (botão OK) ou não (botão CANCELAR). Não adiantou. Até porque TQuickRep parece não saber nada sobre o limite de páginas. Existe solução, colocando dois botões (um para PRINTSETUP e outro para PRINT) e escrevendo QuickRep1.QRPrinter.PrintSetup e QuickRep1.QRPrinter.Print, respectivamente. Prefiro concentrar um só botão para unificar os dois métodos juntos."

Para mostrar a caixa de diálogo de configuração e imprimir logo em seguida, como o Word ou o Internet Explorer, deve-se usar o método PrinterSetup e, em seguida, o método Print. O único problema é que PrinterSetup é uma procedure: como saber se o usuário clicou Ok ou Cancelar ? A resposta está na propriedade Tag do componente QuickRep. Se ela for 0, então o usuário clicou Ok, se for 1, o usuário clicou Cancelar:

 

with frmRelato.QuickRep1 do begin

  PrinterSetup;

  if Tag = 0 then

Print;

end;

 

"Como imprimir um relatório com número de página inicial diferente de 1 ?"

Ao colocar um componente QRSysData no relatório, o QuickReport imprime o número de página conforme a página do relatório. Porém, em alguns casos, deseja-se que a primeira página de um relatório não seja impressa como página 1, mas com a numeração iniciada a partir de outro número. Para isto, basta colocar um QRExpr na página e, no código do programa, antes de chamar o método Print, colocar algo como:

 

frmRelato.QRExpr4.Expression :=

  '''Pág.''+STR(PAGENUMBER+'+ IntToStr(StrToInt(Edit3.Text)-1)+')';

 

A variável PAGENUMBER dá o número da página atual e permite obter o número da página. Assim como esta variável, pode-se também usar as variáveis COLUMNUMBER (número da coluna), REPORTTITLE (nome do relatório), APPSTARTDATE e APPSTARTTIME (data e hora de início de execução) e APPNAME (nome da aplicação).

 

"Como imprimir o total de páginas de um relatório, como em Pág. 1 de 10 ?"

Para obter o total de páginas a serem impressas, deve-se usar a propriedade PageCount do objeto QRPrinter. O único problema é que, antes de imprimir o relatório, PageCount é 0. Para configurar corretamente o valor de PageCount deve-se usar o método Prepare. Então pode-se usar um label e configurar para o total de páginas, como em:

 

with frmRelato.QuickRep1 do begin

  Prepare;

  frmRelato.QRLabel8.Caption := 'de '+IntToStr(QRPrinter.PageCount);

  Print;

end;

 

 

"Como salvar páginas individuais de um relatório ?"

O objeto QRPrinter tem uma propriedade chamada Page que é um metafile. Com este metafile, pode-se salvar uma página individual em disco, como um metafile do Windows. Adicionalmente, usando rotinas de conversão, pode-se transformá-la num bitmap, jpeg ou outro formato gráfico. Esta rotina salva as páginas do relatório em disco:

 

with frmRelato.QuickRep1 do begin

  for i := 1 to QRPrinter.PageCount do begin

QRPrinter.PageNumber := i;

QRPrinter.Page.SaveToFile('Pagina'+IntToStr(i)+'.emf');

  end;

end;

 

"Como imprimir um número pré-definido de linhas na página ?"

Para imprimir um número pré definido de linhas na página, basta criar, na Form do relatório, uma variável privada:

 

private

  { Private declarations }

  FNumLinhas : Integer;

 

Esta variável é inicializada no evento OnBeforePrint do componente QuickReport:

 

procedure TfrmRelato.QuickRep1BeforePrint(Sender: TCustomQuickRep; var PrintReport: Boolean);

begin

  FNumLinhas := 0;

end;

 

Uma vez inicializada, a variável é incrementada no evento OnAfterPrint da band detalhe. Caso o número de linhas ultrapasse o selecionado, usa-se o método NewPage para mudar de página:

 

procedure TfrmRelato.QRBand2AfterPrint(Sender: TQRCustomBand; BandPrinted: Boolean);

begin

  Inc(FNumLinhas);

  if FNumLinhas >= 30 then begin

QuickRep1.NewPage;

FNumLinhas := 0;

  end;

end;

 

Por hoje é só, até a próxima vez. Mandem suas dúvidas para sonnino@clubedelphi.net. Apenas uma observação aqui: mandem dúvidas genéricas que possam interessar a todos. Não mandem dúvidas do tipo "meu projeto não está funcionando", que não responderei neste espaço.

Um projeto de exemplo pode ser baixado aqui

Ebook exclusivo
Dê um upgrade no início da sua jornada. Crie sua conta grátis e baixe o e-book

Artigos relacionados