Universidade Federal do Rio de Janeiro Núcleo de Computação Eletrônica Divisão de Assistência ao Usuário Capítulo 10 IMPRESSÃO O processo de impressão no ambiente Windows não é tão simples quanto no DOS. O Delphi simplificou esta tarefa, disponibilizando uma grande quantidade de rotinas de impressão. TPRINTER O objeto TPrinter encapsula a interface de impressão do Windows, tornando-a quase imperceptível para o usuário. Os métodos e propriedades de TPrinter permitem que se imprima um canvas da mesma forma que se desenha sobre a superfície de um form. A inicialização de uma impressora é feita na seção Initialization da Unit Printers. Observe que a variável global Printer é do tipo TPrinter e também está definida na Unit Printers. As tabelas abaixo listam as principais propriedades e métodos de TPrinter. PROPRIEDADES DE TPRINTER. Propriedade Aborted Canvas Fonts Orientation PageHeight PageWidth PrinterIndex Printers Printing Title Propósito Variável booleana que determina se o print job foi abortado ou não pelo usuário Área de impressão da página Contém a lista de fontes suportados pela impressora Determina se a impressão será horizontal (poLandscape) ou vertical (poPortrait) Altura em pixels da página Largura em pixels da página Indica qual a impressora está selecionada, a lista eé obtida a partir da lista de impressoras do sistema Lista das impressora disponíveis no sistema Determina se o print job está sendo impresso Texto exibido no gerenciador de impressão MÉTODOS DE TPRINTER. Método Abort BeginDoc EndDoc Delphi 4 Propósito Finaliza um Print Job Inicia um Print Job Termina um print job(termina o print job após a finalização da impressão, o método Abort finaliza o print job antes do término) Pag. 154 Universidade Federal do Rio de Janeiro Núcleo de Computação Eletrônica Divisão de Assistência ao Usuário GetPrinter NewPage SetPrinter impressão, o método Abort finaliza o print job antes do término) Recupera a impressão corrente Força a impressora a iniciar a impressão numa nova página, também incrementa a propriedade PageCount. Indica qual a impressora será ativada TPRINTER.CANVAS TPrinter.Canvas funciona como o canvas de um formulário, representa a superfície onde o texto ou gráfico será construído no dispositivo de saída, neste caso, uma impressora. A maioria das rotinas para construir um texto, formas e imagens em tela são usadas de maneira análoga para a impressão. As diferenças estão listas abaixo: • • • • Desenho na tela é um processo dinâmico, pode-se apagar elementos da tela sem que haja nenhum problema, porém desenhar na impressora não é tão flexível. O que for desenhado em TPrinter.Canvas será impresso. Desenhar texto ou gráfico na tela é instantâneo, enquanto que desenhar na impressora é lento, mesmo em impressoras de alto desempenho. Deve0-se sempre permitir que o usuário aborte a operação de impressão usando-se uma janela do tipo Abort box, ou qualquer outro método que permita a finalização do Print Job. Pode-se assumir que os monitores possuem alta capacidade gráfico, o que não é verdade com relação a impressoras, deve-se levar em consideração as diferentes resoluções. É necessário prover tratamento de erros as rotinas de impressão. IMPRESSÃO A impressão em aplicativos Delphi podem ser feitas de várias formas, em muito casos, simplesmente deseja-se apenas imprimir um arquivo texto, sem maiores preocupações com formatações ou posicionamento do texto no papel. O Delphi facilita tremendamente esta tarefa, veja: IMPRIMINDO UM TMEMO Imprimir linha de texto é extremamente simples quando se usa a procedure AssignPrn( ). Esta procedure permite que se atribua uma variável texto a impressora. Esta procedure é usada em conjunto com as procedures Rewrite( ) e CloseFile( ). Vela o exemplo abaixo: Var F : TextFile; Begin AssignPrn(F); Rewrite(F); // Aqui você monta a rotina de impressão Delphi 4 Pag. 155 Universidade Federal do Rio de Janeiro Núcleo de Computação Eletrônica Divisão de Assistência ao Usuário CloseFile(F); End; Imprimir uma linha de texto é idêntico a escrever uma linha num arquivo texto. Veja: Writeln(F,'Aqui imprimo uma linha!'); O código necessário para imprimir o conteúdo de um TMemo é: Procedure TEditForm.Print1Click(Sender: TObject); Var I : Integer; PText : TextFile; Begin If PrintDialog1.Execute then Begin AssignPrn(PText); Rewrite(PText); Try Printer.Canvas.ont := Memo1.Font; For I := 0 to Memo1.Lines.Count –1 do Writeln(Ptext, Memo1.Lines[I]); Finally CloseFile(PText); End; End; End; Observe que a fonte do TMemo foi atribuída a Printer, ocasionando que a fonte de saída seja a mesma apresentado no TMemo. IMPRIMINDO UM FORM Conceitualmente, imprimir um formulário pode ser uma das tarefas mais difíceis de ser executada, todavia, esta tarefa foi facilitada graças a existência do método Print( ) de TForm. O trecho de código abaixo, imprime componentes nele residentes. a Client Area do form, bem como todos os Procedure TForm1.PrintMyorm(Sender: TObject); Begin Print; End; QUICKREPORT QuickReport é um conjunto de componentes de impressão desenvolvido por Allan Lochert e inicialmente foi incorporado ao Delphi na versão 2.0. Estes componentes executam tarefas de confecção, impressão e visualização de relatórios. Delphi 4 Pag. 156 Universidade Federal do Rio de Janeiro Núcleo de Computação Eletrônica Divisão de Assistência ao Usuário O QuickReport é uma ferramenta de construção de relatórios totalmente integrada ao Delphi, suas principais características são: • • • • • • • Usar o ambiente de construção de formulários para criar relatórios Compatibilidade com todas a s versões do Delphi Multithread Preview instantâneo Criar relatórios sobre tabelas, queries ou stores procedures Criar relatórios de etiquetas e malas diretas Usar todo os recursos de fontes e cores do Windows CONCEITOS BÁSICOS Os componentes do QuickReport estão localizados na guia QReport. Quando se usa o QuickReport, todos os relatórios são desenhados exatamente como um formulário do Delphi, permitindo ao desenvolvedor criar os relatórios interativamente. QUICKREPORT E SUAS BANDAS O QuickReport gera relatórios usando bandas, onde cada banda do relatório possui um objetivo. Um relatório poder ser constituído de inúmeras bandas. Para constituir um relatório utiliza-se o componente TQuickRep, que é o relatório propriamente dito e QRBand, que é um tipo especial de painel. O QRBand possui a propriedade BandType , onde se define o tipo da banda. As bandas do TQuickRep são: Title PageHeader ColumnHeader Detail PageFooter Delphi 4 Representa o título do relatório, é impresso uma única vez no início do relatório. É possível ter diversas bandas deste tipo, elas serão impressas umas após as outras somente na primeira página. Representa o cabeçalho de uma página, ela será impressa a cada nova página do relatório, incluindo a primeira página do relatório. Representa o cabeçalho de uma coluna, é muito parecida com PageHeader, diferindo apenas no fato de ser impressa no topo de cada coluna em um relatório multicolunado. Representa o corpo do relatório, repete-se automaticamente para cada registro. Geralmente só existe uma banda Detail por relatório. Representa o rodapé de uma página , sempre é impressa a cada nova página, incluindo a primeira. Pag. 157 Universidade Federal do Rio de Janeiro Núcleo de Computação Eletrônica Divisão de Assistência ao Usuário Summary SubDetail GroupHeader GroupFooter Child Representa o rodapé de um relatório , é impressa somente na última página. Banda especial usada pelo componente TQRSubDetail, é usada na confecção de relatórios Master/Detail. Usada para agregar valores (relatórios Master/Detail) usada para efetuar somatórios de pequenos grupos de valores. Finaliza a banda GroupHeader Banda especial usada pelo componente TQRChilBand A ilustração abaixo mostra um relatório construído com QuickReport ORDENAÇÃO DAS BANDAS DE IMPRESSÃO A ordem de aparecimento das bandas de impressão em design -time não tem nenhuma importância, pois elas serão automaticamente ordenadas no momento da impressão. A ordem seguida pelo QuickReport é: PageHeader ⇓ Title ⇓ ColunmHeader ⇓ Detail ⇓ SubDetail(caso haja) ⇓ Summary ⇓ PageFooter Delphi 4 Pag. 158 Universidade Federal do Rio de Janeiro Núcleo de Computação Eletrônica Divisão de Assistência ao Usuário CONECTANDO DADOS O QuickReport pode receber dados de componentes do tipo Dataset, isto é, T Table ou TQuery. O dataset poder estar no mesmo formulário, ou em outro formulário do projeto ou mesmo em um DataModule. A propriedade DataSet de TQuickRep permite a conexão ao dataset. NOTA O Dataset deve estar ativo para que o relatório seja impresso. ORDENANDO E FILTRANDO DADOS O QuickReport NÃO possui nenhum mecanismo de ordenação de dados. Os dados sempre são impressos na ordem que a BDE os apresenta. Para alterar esta ordem, a tabela deve possuir um único índice de ordenação. Ao imprimir a partir de um TQuery, é possível definir a ordem de impressão através da ordenação indicada na declaração SQL. A filtragem de dados pode ser feita de diversas formas. Caso esteja obtendo os dados de TTable, usa-se a propriedade Filter para definir o filtro, lembre-se que a propriedade Filtered de TTable dever ser True. Outra forma de filtrar é através do uso do componente TQuery e especificar na cláusula Where do SQL a condição de filtragem adequada. CAMPOS DE BANCO DE DADOS E ETIQUETAS Para imprimir um texto em um relatório, é necessário adicionar componentes imprimíveis no relatório. Os dois componentes básicos são: TQRLabel e TQRDBText. O componente TQRLabel é usado para imprimir texto estáticos (Etiquetas) ou texto e números que podem ser calculados pela aplicação durante a geração do relatório. Para imprimir um texto estático basta adicionar o componente no Form a alterar a propriedade Caption. O componente TQRDBText é usado para imprimir campos de um DataSet. Para imprimí-los, basta adicionar o component ao form e associar a propriedade Dataset de TQRDBText para a tabela ou query que armazena os dados. O componente TQRExpr é usado para imprimir textos estáticos, dinâmicos e campos de um dataset. Delphi 4 Pag. 159 Universidade Federal do Rio de Janeiro Núcleo de Computação Eletrônica Divisão de Assistência ao Usuário RELATÓRIOS COM QUICKREPORT A etapa inicial na construção de um relatório é adicionar o componente TQuickRep ao formulário, as próximas etapas são: configurar margens, grids, tamanho de papel, fontes, campos, etc.. MARGENS, PAPEL E FONTES Para configurar a página, basta expandir a propriedade Page do componente TQuickRep no Object Inspector, veja: As propriedades de Page permitem que se escolha o tipo de papel, layout de página, número de colunas, espaço entre colunas, margens. A propriedade de Fonts permitem que se escolha uma fonte e suas principais características tais como: cor, tamanho, estilo e espaçamento. TEXTO ESTÁTICO Para imprimir textos estáticos em um relatório tais como títulos, nomes de colunas, usase o componente TQRLabel(já mencionado) Este componente permite a impressão de Delphi 4 Pag. 160 Universidade Federal do Rio de Janeiro Núcleo de Computação Eletrônica Divisão de Assistência ao Usuário várias linhas (propriedade WordWrap) no mesmo automaticamente seu tamanho (propriedade AutoSize). componente e calcula Caso se queira imprimir textos estáticos muito grandes, usa-se o componente TQRMemo. Este componente possui a propriedade Lines, onde se armazena o texto a ser impresso. O texto é carregado de uma stream através do método LoadFromStream ou a partir de um arquivo pelo método LoadFromFile. IMPRESSÃO DE CAMPOS DE BANCOS DE DADOS A maneira mais fácil de imprimir campos de uma tabela ou query é usar o componente T QRBDText, seu funcionamento é parecido com o TQRLabel, a diferença consiste no texto a ser exibido é oriundo de um bando de dados. A propriedade DataSet e DataField devem ser usadas para fazer a ligação entre o componente e o campo da tabela ou query. Ao selecionar o campo, o componente exibirá FIELD<Nome do Campo> em design time. Caso nenhum campo seja ligado, a palavra None aparecerá. Uma característica importante do TQRDBText é que ele suporta trabalhar com controles de dados desabilitados. Os componen tes TTable e TQuery possuem um método chamado Disable Controls que faz com que todos os controles ligados a eles não façam mais atualizações dos dados, esta característica permite um ganho de performance na execução do programa. A formatação da saída de dados do componente TQRDBText é definida através de um conjunto de propriedades tais como: Font, Size, Frame, Color,etc… Caso seja necessário imprimir campos Memo, utiliza-se o componente TQRMemo , porém não se deve esquecer de configurar as propriedades AutoSize e AutoStretch para False, assim, somente o texto que couber no retângulo será exibido. Para fazer o componente crescer de acordo com a necessidade, basta configurar a propriedade AutoStretch para True. IMPRESSÃO DE IMAGENS O QuickReport pode imprimir imagens estáticas ou imagens de um campo de uma tabela. Para inserir uma imagem no relatório, usa -se o componente TQRImage e para imagens de uma tabela o componente TQRDBImage. Os formatos de imagens suportados podem ser: Bitmap, Metafiles e Ícones. IMP RESSÃO DE RICHTEXT O QuickReport permite imprimir campos Memo formatados com os componentes TQRRichText e TQRDBRichText. O componente TQRRichText pode ser apontado para o componente TRichEdit de um formulário da aplicação usando-se a propriedade ParentRic hEdit. Assim o TQRRichText imprime qualquer que seja o texto do Delphi 4 Pag. 161 Universidade Federal do Rio de Janeiro Núcleo de Computação Eletrônica Divisão de Assistência ao Usuário TRichEdit. Pode-se ainda carregar as informações para TQRRichText a partir de uma stream usando o método LoadFromStream da propriedade Lines , ou ainda a partir do arquivo com o método LoadFromFile. Campos RichText podem ser expandidos e divididos em várias colunas se a propriedade AutoStrech é True. O componente TQRBDRichText obtém os dados a partir de uma tabela ou query. CONSTRUTOR DE EXPRESSÕES O QuickReport possui um recurso chamado Expression Evaluator. Ele permite que pequenos cálculos sejam efetuados durante a composição de um relatório. O avaliador possui operador lógicos, aritméticos e funções pré-definidas. Para usar este recurso, basta adicionar o componente TQRExpr na banda onde se deseja efetuar uma expressão, através da propriedade Expression. Delphi 4 Pag. 162