Recife Postado Outubro 10, 2008 Denunciar Share Postado Outubro 10, 2008 Boa Tarde,Estou precisando implementar uns relatórios com as seguintes caracteristicas: * No momento em que ele apresenta o mesmo na tela(preview), os dados da banda detail devem estar zebrados.* Na impressão deve apresentar os dados da banda detail sem estar zebrado.Esta implementação será para ser usada nas versões do delphi 5 e 7, estou utiizando firebird 2.0 Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Micheus Postado Outubro 10, 2008 Denunciar Share Postado Outubro 10, 2008 Estou precisando implementar uns relatórios com as seguintes caracteristicas: * No momento em que ele apresenta o mesmo na tela(preview), os dados da banda detail devem estar zebrados.* Na impressão deve apresentar os dados da banda detail sem estar zebrado.Recife, isto é relativamente fácil:- declare uma variável booleana para controlar quando zebrar (no preview) e quando não (na impressão); - inicialize ela com com false (antes de chamar o método Preview ou PreviewModal do quick);- no evento BeforePrint você inverte seu conteúdo, utilizando um not;- no evento AfterPrint você atribui a ela o valor True;- no evento BeforePrint da banda detalhe (ou a que desejar), você deve testar se está zebrando antes de executar o teste que irá trocar a cor de fundo para obter este efeito.O porque deste procedimento estranho: O evento BeforePrint ocorre antes da impressão na tela (Preview) e na impressora (Print). Então, quando você chama o Preview, a variável que está falsa é passada para true no evento BeforePrint e o relatório aparecerá zebrado na tela. Concluida a montagem do relatório pelo quick, o evento AfterPrint ocorre e a variável será marcada como true. Assim, quando é acionada a impressão, o evento BeforePrint ocorre e estando a variável com true, passará a ter o valor False, resultando que na impressão no papel não haja zebra. O fato de forçarmos a variável para True (e não not <variavel>) no AfterPrint deve-se ao fato de que o usuário pode resolver imprimir novamente o relatório, sem ter saido do preview e, assim, não term erro - a impressão continua não sendo zebrada.Sugestão, no relatório:type TForm1 = class(...) ... private Zebra :Boolean; ... public Zebrar :Boolean; ... end; .... procedure TForm1.QRBand1BeforePrint(Sender: TQRCustomBand; var PrintBand: Boolean); begin if Zebrar then begin if Zebra then Sender.Color := clRed else Sender.Color := clWhite; Zebra := not Zebra; end; end; procedure TForm1.QuickRep1BeforePrint(Sender: TCustomQuickRep; var PrintReport: Boolean); begin Zebrar := not Zebrar; end; procedure TForm1.QuickRep1AfterPrint(Sender: TObject); begin Zebrar := True; end; preparando para chamada do relatório: ... Form1 := TForm1.Create(Self); try ... Form1.Zebrar := False; Form1.QuickRep1.Preview; finally Form1.Release; end; ... end;Abraços Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Recife Postado Outubro 11, 2008 Autor Denunciar Share Postado Outubro 11, 2008 Micheus,Mais uma vez muito obrigado por mais uma aula, gosto muito das suas explicações, pois são bastante claras e tenho certeza que irá servir para outros companheiros de profissão. Segunda-feira irei testar na empresa pois minha impressora (residencial) esta quebrada. Porém, irei passar este final de semana mais tranquilo.Segunda dou resultado da implementação.Obrigado. :lol: Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Micheus Postado Outubro 11, 2008 Denunciar Share Postado Outubro 11, 2008 Segunda-feira irei testar na empresa pois minha impressora (residencial) esta quebrada.Recife, fica uma dica: instale um destes drivers de impressão PDF gratuitos (eu gosto muito do doPDF, mas existem vários outros) - eles quebram o maior galho - é o que uso para não gastar tinta e papel quando estou testando resultados deste tipo.Abraços Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Recife Postado Outubro 13, 2008 Autor Denunciar Share Postado Outubro 13, 2008 Oi micheus, Conforme havia dito, estou trazendo o resultado da implementação, ele executa o preview normal, porém na impressão esta saindo zebrado. É como se não tivesse respeitando o evento afterprint do quickreport.Este é o form de chamada do relatóriounit RelExemplo; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Buttons; type TFImpressao = class(TForm) Label1: TLabel; BitBtn1: TBitBtn; procedure BitBtn1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var FImpressao: TFImpressao; implementation uses RelExem; {$R *.DFM} procedure TFImpressao.BitBtn1Click(Sender: TObject); begin FRelExem := TFRelExem.Create(application); try FRelExem.zebrar := False; FRelExem.QuickRep1.Preview; finally FreeAndNil(FRelExem); end; end; end. Este é o codigo do relatório unit RelExem; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, QuickRpt, Db, IBCustomDataSet, IBQuery, IBDatabase, Qrctrls, QRExport; type TFRelExem = class(TForm) QuickRep1: TQuickRep; ColumnHeaderBand1: TQRBand; QRLabel1: TQRLabel; QRLabel2: TQRLabel; QRLabel3: TQRLabel; DetailBand1: TQRBand; QRDBText1: TQRDBText; QRDBText2: TQRDBText; QRDBText3: TQRDBText; IBDatabase1: TIBDatabase; IBTransaction1: TIBTransaction; IBQuery1: TIBQuery; TitleBand1: TQRBand; QRLabel4: TQRLabel; QRHTMLFilter1: TQRHTMLFilter; QRTextFilter1: TQRTextFilter; IBQuery1NOMEESTADO: TIBStringField; IBQuery1UF: TIBStringField; IBQuery1DATAULTATUALIZACAO: TDateTimeField; procedure DetailBand1BeforePrint(Sender: TQRCustomBand; var PrintBand: Boolean); procedure QuickRep1BeforePrint(Sender: TCustomQuickRep; var PrintReport: Boolean); procedure QuickRep1AfterPrint(Sender: TObject); private { Private declarations } zebra : boolean; public { Public declarations } zebrar : boolean; end; var FRelExem: TFRelExem; implementation {$R *.DFM} procedure TFRelExem.DetailBand1BeforePrint(Sender: TQRCustomBand; var PrintBand: Boolean); begin if zebrar then begin if zebra then begin Sender.Color := clMoneyGreen; QRDBText1.Color := clMoneyGreen; QRDBText2.Color := clMoneyGreen; QRDBText3.Color := clMoneyGreen; end else begin Sender.Color := clWhite; QRDBText1.Color := clWhite; QRDBText2.Color := clWhite; QRDBText3.Color := clWhite; end; //fim if zebra then zebra := not zebra; end;//fim if zebrar then end; procedure TFRelExem.QuickRep1BeforePrint(Sender: TCustomQuickRep; var PrintReport: Boolean); begin zebrar := not zebrar; end; procedure TFRelExem.QuickRep1AfterPrint(Sender: TObject); begin zebrar := True; end; end. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Micheus Postado Outubro 13, 2008 Denunciar Share Postado Outubro 13, 2008 (editado) Recife, bem estranho isso.Eu notei que você está utilizando um HTMLFiter. Por acaso você está testando este tipo saída ou impressora mesmo?Veja este exemplo que preparei, testado e aprovado ;)Rel Zebrado so no preview.zip (também usa IB - já vai com banco e gds32.dll para o teste - é só descompactar)Como você observará é muito similar ao seu, já que está de acordo com o exemplo que postei anteriormente. Assim, veja se você consegue identificar alguma diferença em relação ao seu (fora o questionamento que lhe fiz antes)Abraços Editado Outubro 13, 2008 por Micheus Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Recife Postado Outubro 13, 2008 Autor Denunciar Share Postado Outubro 13, 2008 Olá Micheus,Peguei seu exemplo e verifiquei algumas diferenças que já consertei, quanto a impressão aqui em minha casa estou sem impressora ai estou visualizando em html e .txt a saída, porém lá na empresa estou imprimido. Amanhã irei testar e posto aqui o resultado. Mais uma vez agradecido. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Recife Postado Outubro 14, 2008 Autor Denunciar Share Postado Outubro 14, 2008 Micheus,Mais uma vez obrigado, neste segundo exemplo funcionou conforme a especificação a qual me foi passada. Vou estuda-lo com mais detalhe devido agora terei que implantar esta rotina em projeto em nossa empresa.Com isto, tenho resolvido este problema e espero que serva para outros membros do forum.Abraços. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Micheus Postado Outubro 20, 2008 Denunciar Share Postado Outubro 20, 2008 Recife, achei uma maneira mais segura e simples de saber quando estamos "imprimindo" o relatório para a tela (preview) ou para a impressora (print): usar a propriedade Destination do objeto QRPrinter do QuickRep:qrdMetafile ==> gerando visualizaçãoqrdPrinter ==> imprimindoInfelizmente, não tenho referências de em qual unit encontramos a declaração destas constantes mas, como voce tem os código fonte, voce poderá encontrá-la facilmente.A variável Zebrar nem seria necessária, podendo ser retirada sua declaração/manipulação e o BeforePrint da banda rbDetail passaria a ser:procedure TForm1.QRBand1BeforePrint(Sender: TQRCustomBand; var PrintBand: Boolean); begin if Sender.ParentReport.QRPrinter.Destination = qrdMetafile then // gerando visualização begin if Zebra then Sender.Color := clRed else Sender.Color := clWhite; Zebra := not Zebra; end; end;Por gentileza teste e, funcionando, poste aqui o nome da unit onde as constantes estão declaradas.Abraços Citar Link para o comentário Compartilhar em outros sites More sharing options...
Pergunta
Recife
Boa Tarde,
Estou precisando implementar uns relatórios com as seguintes caracteristicas:
* No momento em que ele apresenta o mesmo na tela(preview), os dados da banda detail devem estar zebrados.
* Na impressão deve apresentar os dados da banda detail sem estar zebrado.
Esta implementação será para ser usada nas versões do delphi 5 e 7, estou utiizando firebird 2.0
Link para o comentário
Compartilhar em outros sites
8 respostass a esta questão
Posts Recomendados
Participe da discussão
Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.