Impressão no Visual Basic

O trabalho de impressão de relatórios no Visual Basic pode ser feito basicamente de três formas:

Trataremos aqui apenas da primeira alternativa, remetendo o leitor para o "Visual Basic 5.0 Programmer’s Guide to the Win32 API" - que acompanha este pacote - para a teoria e exemplos de como utilizar a API do Windows na geração de relatórios. Quanto ao Crystal Reports, embora seja uma ferramenta poderosa para geração de relatórios, muitas vezes o programador não consegue contornar os limites da ferramenta para realizar tudo o que deseja. Em futuras atualizações deste produto trataremos do assunto.

Nota: As futuras atualizações estarão disponíveis na Internet conforme instruções que acompanham este produto.

Imprimindo com o Objeto Printer

O objeto Printer é a representação da impressora dentro do Visual Basic.

Através dos seus métodos e propriedades você pode definir praticamente tudo que precisa para suas tarefas de impressão.

Inicialmente referenciando a impressora padrão do sistema, o objeto Printer pode ser modificado para referenciar uma outra impressora instalada. Na coleção Printers você encontrará uma referência para cada impressora presente na instalação. Usando a instrução Set, é possível atribuir ao objeto Printer qualquer uma destas referências. Assim: Set Printer = Printers(1), por exemplo, fará com que o objeto Printer tenha suas propriedades modificadas para refletir as atuais configurações da impressora Printers(1), e qualquer tarefa de impressão concluída pelo objeto Prnter será destinada a esta impressora.

Numa tarefa de impressão, devemos levar em conta várias informações que determinarão o resultado final. Algumas destas informações estão listadas abaixo:

O tamanho do papel a ser usado para imprimir o relatório;

O área imprimível dentro da página;

As margens que separam os limites da área imprimível dos limites da página física;

As fontes a serem usadas na geração do texto;

Os atributos dos elementos gráficos presentes no relatório, tais como cores, espessuras de linhas, modos de desenho, etc.

O número de cópias do relatório;

O número de páginas;

A orientação da saída em relação ao papel (retrato ou paisagem).

 

Os parâmetros para geração de relatórios podem ser fixados pelo programador ou permitir que a interação com o usuário determine vários desses parâmetros. Essa interação normalmente é feita através de uma caixa de diálogo de impressão, usando o método ShowPrinter do controle de diálogos comuns. Após o retorno da caixa de diálogo, as propriedades do controle de diálogos comuns são verificadas para que o programa responda às escolhas do usuário. A criação de uma classe para exibição de diálogos de impressão também pode ser uma alternativa para ter-se maior flexibilidade na escolha de quais opções disponibilizar para o usuário. Existem casos em que é necessário deixar ao usuário até mesmo a possibilidade de modificar a fonte usada para impressão do relatório, já que nem sempre a fonte escolhida pelo programador é a que melhor se ajusta á impressora do usuário. Exemplo de casos assim são os relatórios que devem ser impressos em fontes do dispositivo nas impressoras matriciais.

Iniciamos uma tarefa de impressão escolhendo a impressora para a qual será destinado nosso relatório e configurando as propriedades da página de impressão. Como já vimos acima, a coleção Printers contém todas as impressoras disponíveis para o sistema. Em tempo de execução podemos verificar a propriedade DeviceName dessas impressoras e identificar uma que estejamos querendo atribuir ao objeto Printer para se tornar a impressora padrão da aplicação. Feito isto, devemos configurar a página sobre a qual iremos imprimir.

O tamanho da página pode ser escolhido atribuindo à propriedade PaperSize uma das constantes para os tamanhos pré-definidos listados na figura abaixo ou utilizando as propriedades Height e Width do objeto Printer.

Figura 12.1

As propriedades Height e Width têm precedência sobre a propriedade PaperSize. Ao atribuir valores a essas propriedades, PaperSize é automaticamente configurada para vbPRPSUser (tamanho definido pelo usuário).

Os valores atribuídos a Height e Width são entendidos sempre como estando em twips (1/1440 de polegada) e correspondem às dimensões físicas da página. A área realmente imprimível na página é obtida com as propriedades ScaleWidth, ScaleHeight, ScaleLeft e ScaleTop. Os valores em que estão expressas essas propriedades depende da propriedade ScaleMode. Em ScaleMode, você define as unidades de medida usadas para posicionar texto e gráficos impressos na página. Veja na tabela abaixo as opções para essas unidades.

Figura 12.2

Ao modificar alguma das propriedades ScaleHeight, ScaleWidth, ScaleTop ou ScaleLeft, você cria o seu próprio sistema de coordenadas.

Uma vez que definimos qual o tamanho do papel e obtivemos o tamanho da área imprimível, falta-nos saber quais são as margens que separam a área imprimível da área física total da página. O objeto Printer não possui nenhuma propriedade ou método que retorne essa informação, mas dentro das DLLs do Windows existe uma função que pode ser chamada para retornar-nos essa informação: GetDeviceCaps. Essa é uma função da API do Windows, que retorna diversas informações sobre um dispositivo informado. Como toda função residente em DLLs, GetDeviceCaps precisa ser declarada antes que possamos fazer chamadas a ela em uma aplicação Visual Basic. A declaração de GetDeviceCaps, bem como as de inúmeras outras funções da API do Windows, pode ser obtida usando o API Text Viewer, que acompanha o Visual Basic 5.0. Com o API Text Viewer é possível também obter-se as declarações de constantes e tipos de dados definidos pelo usuário requeridos nas chamadas a funções da API. Por questão de simplificação apresentamos abaixo a declaração de GetDeviceCaps e das constantes usadas para obtenção das margens que precisemos obter.

Figura 12.3

Incluindo estas declarações em um módulo padrão da aplicação podemos chamar GetDeviceCaps de qualquer parte do código para obtermos informações sobre o dispositivo identificado pelo parâmetro hdc. As duas constantes declaradas são usadas para obtenção das margens esquerda e superior que separam os limites da página física da área imprimível. Os valores retornados estarão em número de pontos da impressora e dependerão da resolução presentemente selecionada na configuração do dispositivo. Antes de usá-los em cálculos, será preciso convertê-los para a unidade de medida adequada.

Serão necessárias duas chamadas a GetDeviceCaps para obter as margens de impressão: uma, passando PHYSICALOFFSETX como argumento nIndex para obter a margem esquerda ; e outra, passando PHYSICALOFFSETY para obter a margem superior. Como argumento para hdc, passamos Printer.Hdc. O cálculo das margens direita e inferior pode ser feito usando as medidas físicas da página total - obtidas com as propriedades Height e Width -, as margens obtidas com GetDeviceCaps e as medidas da área imprimível obtidas com as propriedades ScaleWidth e ScaleHeight. Este cálculo só pode ser feito após a redução de todas as medidas a uma unidade comum.

Para converter as medidas obtidas com as chamadas a GetDeviceCaps para as medidas que estivermos usando, podemos recorrer inicialmente às propriedades TwipsPerPixelX e TwipsPerPixelY do objeto Printer. Estas propriedades nos retornam o número de twips ocupado por cada ponto do dispositivo. Isso nos permite converter os pontos obtidos nas chamadas a GetDeviceCaps para twips. Multiplicando Printer.TwipsPerPixelX pelo número de pontos da margem esquerda, obtemos, em twips, o valor dessa margem. Fazemos o mesmo com Printer.TwipsPerPixelY e a margem superior. Uma vez convertidas as margens para twips, fica fácil convertê-las para outra unidade.

Vamos seguir nosso estudo supondo que estamos trabalhando com a unidade twips. Antes de enviar qualquer texto ou gráfico para a página, precisamos definir a posição dentro da página em que imprimiremos. Isto é feito com o uso das propriedades CurrentX e CurrentY. Com estas propriedades definimos as coordenadas cartesianas para a posição em que se dará a próxima impressão que fizermos sobre a página. CurrentX e CurrentY estão sempre em unidades definidas pela propriedade ScaleMode. Para o uso dos métodos gráficos, consulte a documentação do Visual Basic que contém maiores detalhes sobre o significado de CurrentX e CurrentY em cada caso.

Feita a escolha da posição para a nossa próxima ação de envio de dados, podemos iniciar a montagem do conteúdo da página. Para enviar texto usamos o método Print do objeto Printer. Veja um exemplo de uso do método Print: Printer.Print "Isto é uma string.". A string entre aspas poderia ser substituída pelo nome de uma variável contendo uma string, por exemplo: Printer.Print varStr. Neste caso seria impresso o conteúdo da variável varStr.

A combinação do método Print com as propriedades relativas a fontes do objeto Printer, nos possibilitam imprimir texto com aspectos variados. Utilizando, por exemplo, a propriedade FontName, podemos definir o nome da fonte em que será impresso qualquer texto que enviemos para a página após a sua atribuição. Os textos anteriormente enviados permanecem inalterados. Na sequência veremos um exemplo do uso dessas propriedades.

Uma vez que tenhamos criado todo o conteúdo de uma página, desejaremos passar para a seguinte. Isto é feito com uma chamada ao método NewPage do objeto Printer. A página que acabou de ser criada é salva, mas não é enviada para a impressora ainda. Somente após o término da geração do relatório é que todas as páginas estarão disponíveis para impressão. O método NewPage cria uma página vazia com as propriedades CurrentX e CurrentY configuradas para o canto superior esquerdo da nova página.

Criada a última página do relatório, podemos sinalizar o seu término com uma chamada a EndDoc. Isso fará com que a aplicação envie o relatório para um arquivo em disco de onde poderá ser transferido para a impressora pelos mecanismos gerenciadores de impressão do Windows.

O que foi visto até aqui descreve em linhas gerais a impressão com o objeto Printer. Para ver um exemplo de impressão, procure pela aplicação ExempPrt no diretório Exemplos\ExemploPrt deste CD. Você encontrará uma pequena aplicação, onde poderá ver o uso do que foi visto acima e de mais alguns recursos de uso comum nas tarefas de impressão com o objeto Printer.

 

Mantenha seu código melhor organizado com a indentação do RabJump