Suporte Técnico / Departamento de Operações
Rio de Janeiro, 14 de setembro de 1998
Documento 53
Impressão utilizando o Visual Tech

Após a análise periódica que fazemos sobre os dados colhidos pelo nosso suporte, percebemos ser objeto de relativa dificuldade a impressão utilizando o Visual Tech.

Vale observar que os procedimentos que serão descritos aplicam-se unicamente a versões do Visual Tech iguais ou posteriores a 4.2 r 17 e utilitários v 4.2 r17.

Impressão utilizando o comando OPEN na classe de dispositivos 300

Nesta modalidade o Visual Tech envia os caracteres que estão sendo solicitados pelo programador por meio do comando write diretamente para a impressora.

O usuário deve ir na opção de menu do Visual Tech, Arquivo / Configura impressão, e definir a impressora na qual quer imprimir como específica. Isto feito, certifique-se que no utilitário %CONFIG, o tipo da referida impressora esteja corretamente definido para a porta 300.

Impressão utilizando os recursos do Windows

O Visual Tech for Windows fornece facilidades de impressão avançada, que permitem ao programador elaborar saídas gráficas em impressoras. A idéia implementada visa obter um tipo de interface conhecida como WYSIWYG, do inglês "What You See Is What You Get" ("O que você vê é aquilo que você obtém"). Ou seja, habilitar o programador a construir uma aplicação que seja capaz de mostrar o resultado final em uma janela correspondendo exatamente ao que sairá na impressora.

Assim como em todo ambiente multiprocessado onde é possível executar mais de um processo ao mesmo tempo e mais de um deles imprimindo algo na mesma impressora, o Windows faz uso de um spooler de impressão. Assim assegura-se que somente um serviço de impressão (ou Job) estará sendo executado por vez. Qualquer aplicação que faz uso da impressora terá que inicializar um serviço de impressão. O spooler obriga que todas as ações pertinentes a um serviço sejam guardadas em disco. Ao término do serviço, o resultado final é enfileirado até que o spooler esteja pronto para imprimi-lo. Finalizada a impressão, os dados guardados em disco serão descartados.

Janelas e Impressoras

Os recursos avançados de impressão do Visual Tech for Windows permitem que os controles do tipo shape, label e picturebox contidos em uma janela, possam ser impressos. Para tanto, basta inicializar um serviço de impressão associando uma janela a ele. Os comandos usados são os seguintes:
ZGW BEGINDOC(ID=expressão): onde a "expressão" corresponde ao número de identificação da janela a ser associada ao serviço de impressão. A janela a ser usada deverá existir antes deste comando. O nome do serviço de impressão que será mostrado na janela do Gerenciador de Impressora (Print Manager), será o texto contido na Barra de Título da janela associada ao serviço. A janela usada como janela de impressão não necessita necessariamente ser uma janela visível. Ela servirá apenas como armazenadora de objetos para impressão. Para imprimir uma página, que na verdade será a imagem da janela na impressora, usa-se o comando:
ZGW EJECT(ID=expressão): onde a "expressão" corresponde ao ID da janela associada ao serviço de impressão. Este comando será executado para todas as páginas do relatório a ser gerado. Obviamente, o conteúdo da janela associada poderá ser alterado entre um página e outra. Para terminar o serviço de impressão e colocar o resultado na fila, usa-se o comando:
ZGW ENDDOC(ID=expressão): onde a "expressão" corresponde ao ID da janela associada ao serviço de impressão. Terminado a sessão de impressão a janela poderá ser fechada.

Medidas da Janela

No Visual Tech for Windows, as coordenadas dos objetos são fornecidas em pontos. Pode-se obter a relação de quantos pontos na tela correspondem a uma polegada utilizando-se a função:

Número de Pontos por Polegada = $ZGW(LOGXPIXELS,ID) para a coordenadas horizontais (X) e

Número de Pontos por Polegada = $ZGW(LOGYPIXELS,ID) para a coordenadas verticais (Y). Normalmente os valores para as coordenadas horizontais e verticais são iguais.

Assim se for necessário imprimir um SHAPE de 2 por 1 polegadas na janela de ID=3, pode-se usar:

S LX=$ZGW(LOGXPIXELS,ID)

S LY=$ZGW(LOGYPIXELS,ID)

ZGW I(TYPE="SHAPE":...:WIDTH=2*LX:HEIGHT=LY:...)

A janela associada estará sempre limitada à área do papel. Assim, se as coordenadas de algum objeto ultrapassar a área útil do papel, o objeto poderá sair cortado ou até não ser impresso.

Evento de Impressão

De modo a dar maior controlabilidade ao processo de impressão durante uma sessão, é gerado um evento que permitirá a interação entre o programa de impressão e o spooler. No caso de falta de espaço em disco por exemplo, o programa pode exibir uma mensagem notificando o fato ao usuário que poderá liberar espaço do disco e continuar a impressão, ou ainda, simplesmente cancelar todo o processo.

O evento gerado chama-se ABORTDOC e funciona como uma função extrínseca, passando como parâmetro a natureza do evento causador do erro ou uma simples verificação do desejo do usuário de interromper o processo. O código de retorno indicará se a impressão deverá prosseguir ou não.

Exemplos de impressão utilizando os recursos do Windows

Um dos exemplos disponíveis pode ser encontrado no arquivo vtexem04.exe localizado no diretório Temporário de nossa BBS ou no nosso site ( http://www.xtension.com.br/ftp/vtexem04.exe ).

O arquivo leiame.txt contem esclarecimentos específicos sobre este exemplo.

Em outro caso, é apresentada nesta seção uma aplicação responsável por imprimir cartões de visita de uma empresa fictícia. A figura abaixo mostra o cartão de visitas produzido pela aplicação:

No exemplo são criadas duas janelas. A primeira serve de janela de impressão e portanto será associada ao serviço de impressão. Nesta janela, alguns controles do tipo LABEL e SHAPE são inseridos. É importante notar que a janela é criada como não modal, permitindo que o fluxo de instruções corra normalmente após sua criação e a janela possa ser associada ao serviço de impressão nas próximas instruções.

Uma outra janela é criada para perfazer o controle do serviço, permitindo assim ao usuário interromper a qualquer momento a impressão. Para tanto é utilizado o evento ABORTDOC, que neste caso simples tem seu argumento ignorado, e utilizando-se uma janela não modal. A instrução

SET A=$ZGWAITEVENT assegura que, durante a execução do evento, o usuário possa clicar o botão de cancelamento, que por sua vez irá alterar o valor da variável flag, pondo fim ao ciclo de impressão (linha ploop). A variável especial, $ZGWAITEVENT, permite que um outro evento possa acontecer durante o processamento dos eventos de ABORTDOC.

Este exemplo pode ser encontrado no arquivo vtexem10.exe localizado no diretório Temporário de nossa BBS ou no nosso site (http://www.xtension.com.br/ftp/vtexem10.exe ).

O arquivo leiame.txt contem esclarecimentos específicos sobre este exemplo.

Utilitários de impressão (%wimpimp)

Um outro exemplo existente permite que o programador trabalhe normalmente como se fosse imprimir por meio da porta 300. O utilitário %wimpimp que é acionado, encarrega-se de imprimir via Windows de modo absolutamente transparente.

Este exemplo pode ser encontrado no arquivo vtexem11.exe localizado no diretório Temporário de nossa BBS ou no nosso site (http://www.xtension.com.br/ftp/vtexem11.exe ).

O arquivo leiame.txt contem esclarecimentos específicos sobre este exemplo.

Como resultado podemos destacar a impressão utilizando a impressora default do Windows sem qualquer dificuldade adicional já que podemos usar o comando write normalmente. Alem disto, torna-se possível consultar as páginas anteriormente impressas.

Utilitários de impressão (%wprinter / Chamada 1)

Este utilitário tem por intenção facilitar a vida dos programadores.

Relembrando, o conceito é que uma rede contem várias impressoras espalhadas e que estão presas em algumas máquinas cliente e em servidores de impressão. O importante é compreender que elas podem ser enchergadas pelo Windows.

Além disso, o Visual Tech precisa ligar o tipo correspondente a cada uma das referidas impressoras.

O que o utilitário acima faz é permitir o cadastramento prévio de todas as impressoras com as quais o sistema possa trabalhar definindo inclusive os tipos correspondentes.

Isto feito, outras entradas correlatas deste utilitário permitem a especificação da impressora com a qual se quer trabalhar sem qualquer interferência do usuário.

Ativação da impressora básica da estação (Chamada 2)

s x=$$BASICA^%wprinter(Idpai,Estação)

Idpai = Número do Form que chama (0 para telas caracter)

Estação = $SY

Ativação da impressora especifica (Chamada 3)

s x=$$ROTINA^%wprinter(IdPai,Estação,Rotina,OnOff)

Idpai = Número do Form que chama (0 para telas caracter)

Estação = $SY da estação

Rotina = Identificação da Rotina (ex. NF ou TICKET)

OnOff = 1 para ligar (ativar) a impressora especifica ou 0 para retornar para a impressora básica (equivale a chamada 2)

Chamada no modo de uso do aplicativo (após a fase de definição)
Ao entrar no menu do Sistema execute a chamada 2 para ter certeza que a impressora vai estar configurada para o estado normal.
Antes de uma impressão especifica (antigamente na porta 301) execute a chamada 3 passando qual a impressão que se deseja executar seguido dos comandos o 300 u 300
Ex: s x=$$ROTINA^%wprinter(0,$SY,"NF",1) o 300 u 300
Após o término da impressão execute u 0 c 300 s x=$$ROTINA^%wprinter(0,$SY,"",0) para retornar a definição ao estado inicial.

No início da rotina %wprinter, outras informações podem ser encontradas sobre os parametros necessários.