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