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