Numeração de páginas usando o FwMsPrinter

Prezados, boa noite!

Estou realizando a conversão de alguns relatórios do Crystal Reports para o Protheus, e para isso estou utilizando a classe FwMsPrinter. Consegui efetuar boa parte das tratativas com sucesso mas estou com dificuldades em uma questão: A numeração de páginas.

Nesse relatório em específico, preciso listar qual a página atual e qual a quantidade total. Exemplo: página 1 de 5.

Porém, estou tendo dificuldades ao informar quantas páginas possui aquele relatório, visto que a propriedade nPageCount só me informa a página atual e também só consigo saber quantas páginas o relatório vai ter após finalização do mesmo.

De forma paliativa, o que estou fazendo é contando a quantidade de registros da query e dividindo pela quantidade de linhas que o relatório suporta, mas como o relatório tem quebra de linhas dependendo dos produtos, essa informação acaba não ficando correta em 100% das situações.

Gostaria de saber se os colegas possuem alguma sugestão de como posso estar fazendo esse controle de forma mais precisa.

Segue em anexo exemplo de como está o layout do relatório

Agradeço desde já pela atenção.

:warning: Atenção: Esta publicação foi transferida automaticamente do fórum antigo, mas os anexos não foram incluídos.

Giordano, boa tarde.

Atualmente a classe FWMSPrinter não possui tratamento para identificar o total de paginas no inicio da impressão.

Olá Giordano,

A classe FWMSPRINTER nao possui tal tratamento. Para você conseguir realizar este controle você teria que saber a relação de caracteres que serão impressos vs os pixels ou caracteres (se assim optar) que poderão ser escritos na folha que desejar. Isso seria um pouco trabalhoso para ser feito.

Recomendo que utilize a classe TREPORT, pois a mesma possui diversas funcionalidades já prontas que poderão facilitar o desenvolvimento.

Lamento não poder ajudar mais.

Boa tarde, Marcos! Obrigado pela informação, mas no caso deste relatório, ele precisa usar o FwMsPrinter pois possui desenhos no qual eu não conseguiria fazer por TReport.

Uma saída é separar o processamento do relatório.

No processamento atual transforma todas as chamadas que está mandando caracteres ou gráficos para o objeto do fwmsprinter para envio de dados para um ou mais arrays e continua controlando as páginas.

quando chegar no final do processamento, vê o total de página que deu e grava em uma váriavel

então roda um loop no array criado mandando desta vez os dados para o objeto do fwmsprinter já sabendo o número total de páginas.

Boa noite, Josué!

Interessante, não havia pensado nisso… Mas como que eu faria para armanezar os desenhos (line, box, etc)? Tem alguma sugestão?

Obrigado pela sugestão.

Boa noite, então, para os elementos gráficos um esquema é adiciona-los como blocos de códigos no array com os respectivos tamanhos para calcular as páginas e depois na rotina de leitura do array transformar em comandos, algo mais ou menos assim:

{ tipocmd , cmd , tamanho }
{ “T”, “Texto para imprimir”, 80}
{ “C”, { || line(100,100), “1”}

Depois no loop do array faz um if para fazer say ou eval no elemento 2 do array e com o elemento 3 você já faz a conta antes de quanto pixels deu o relatório e consequentemente toda a divisão de páginas…