Página 1 de 1
Impressão a partir de uma determinada página
Enviado: 02 Abr 2009 14:47
por asimoes
Amigos,
Estou precisamendo de uma função ou rotina que permita a impressão de uma determinada página.
Isto é para uma impressão em impressora matricial, onde uma determina página embolou na impressora e para não ter que imprimir tudo novamente.
[]´s
Impressão a partir de uma determinada página
Enviado: 02 Abr 2009 15:22
por Pablo César
Essa opção de selecionar a página a ser impresa sem necessidade de reprocessamento só é válida quando é criado arquivo de impressão, certo ?.
Se você quer uma "função" pode usar a PrintFile() da WAPI do Maligno para que faz isso. Só eu não tenho usado, portanto não tenho um exemplo. Parece que deve ser informado o quarto parametro e depois não sei bem ao certo. Prefiro deixar ao Maligno te dar mais instruções de cómo funciona esse recurso.
A outra forma é você importar o conteúdo do arquivo de impressão, digamos para um dbf e procurar algum caracterque identifique o início e fim. Pode até ser usado o caracter chr(255) para início e chr(12) para o final da página. Dessa forma, na hora de gerar o arquivo, certifique-se que irá ter o chr(255) e chr(12) em cada página com excepção da ultima folha.
Re: Impressão a partir de uma determinada página
Enviado: 02 Abr 2009 16:04
por asimoes
Olá Pablo,
Antes de mais nada obrigado pela sua atenção.
Pablo César escreveu:Essa opção de selecionar a página a ser impresa sem necessidade de reprocessamento só é válida quando é criado arquivo de impressão, certo ?.
No meu caso seria em tempo de execução mesmo tipo: Informaria o número inicial e final da página em um get.
Sem a necessidade de gerar um arquivo.
Sei que esta rotina é meia chatinha de fazer.
[]´s
Impressão a partir de uma determinada página
Enviado: 02 Abr 2009 16:42
por Pablo César
Bom pensei que fosse gerar arquivo. Isso facilita muito as coisas, eu tenho como regra criar arquivos de impressão. Ja tenho comentado as minhas razões. Mas enfim vamos lá... ver se eu posso te ajudar.
Não acredito que venha ter alguma função que trate isso, ao menos não que não possa ser elaborada. Tudo dependerá como você tem o seu código.
Então o que diferencia mandar a string para impressora ? Não sei que comando você utiliza para impressão. E o seu relatório tem com certeza um laço de repetição (do while, for...) então você talvez esteja colocando set devices ou set print antes e depois desse laço. Você deve ter uma variável que controla o numero da página (senão, então crie).
Bem a idéia é você não mandar para a impressora se essa variavel página não seja igual a que está sendo solicitada, daí só pula o registro mas não utilize o "@ SAY" ou nem o "?" e acho que não tem por quê não dar certo.
Claro que antes de tudo você terá que interagir com o usuário perguntando qual é o número de página a ser impresso, isso se for apenas uma. Se a seleção de página for do tipo imprima de tal pág. até tal pág. (estilo Word/Excel, WAPI) então fica um pouco mais complicado de fazer, mas nada que não seja impossível.
Se bem que ainda acho seria muito melhor, você mandar gerar em arquivo, visualizar o relatório em tela e fazer uma opção de impressão seletiva de página de dentro do visualizador. Pois uma vez gerado, você tem a informação de quantas páginas tem esse relatório e que ainda podes limitar a que o usuário não peça uma página que não exista ou até mesmo fazer uma janela seletiva (tipo achoice para que o usuário escolha quais páginas irão ser impressas) este ultimo em forma de matriz e que na minha opinião melhor opção quando quer selecionar ao acaso alguma páginas de forma bem seletiva.
Re: Impressão a partir de uma determinada página
Enviado: 02 Abr 2009 16:51
por Maligno
aSimoes escreveu:Sem a necessidade de gerar um arquivo.
Bom, nesse caso a função pretendida deverá estar fortemente ligada ao seu código, o que realmente a tornará bem mais "chatinha" pra fazer. Neste caso, só podemos dar uma ajudinha.
Se no seu lugar estivesse, uma função especial de impressão faria. Você imprime, muito provavelmente, por meio do direcionamento de impressão para a impressora, pelo método @...SAY. O que se pode fazer é uma função que receba essa impressão, linha após linha, como normalmente seria na impressão normal. Previamente configurada para imprimir esta ou aquela página, esta função descartaria tudo que estivesse em desacordo com essa configuração, até o momento em que recebesse dados das páginas configuradas. Nem é tão difícil. Se você queimar um pouco a pestana, certamente conseguirá fazer tudo em pouco tempo.
Só não queira colocar esse tipo de controle dentro da impressão deste relatório. Crie uma função à parte, senão vai virar um balaio de gato desgraçado.
Re: Impressão a partir de uma determinada página
Enviado: 03 Abr 2009 16:45
por janio
Respondi a algo semelhante
neste tópico
Re: Impressão a partir de uma determinada página
Enviado: 03 Abr 2009 16:49
por Maligno
Se bem que, particularmente, eu prefiro o método da biblioteca WAPI. Os únicos trabalhos extras são: direcionar a impressão para um arquivo e inserir um marcador de página antes de cada página. Mais nada.
Por ela eu consigo imprimir listas irregulares de páginas, seções de páginas, páginas pares, ímpares, de trás pra frente, de frente pra trás, várias cópias, cópias concatenadas ou separadas, etc. Ficou melhor que o método do Windows. Moléstia à tarde.

Impressão a partir de uma determinada página
Enviado: 03 Abr 2009 18:06
por Pablo César
eu consigo imprimir listas irregulares de páginas, seções de páginas, páginas pares, ímpares, de trás pra frente, de frente pra trás, várias cópias, cópias concatenadas ou separadas, etc. Ficou melhor que o método do Windows.
Dê exemplo então Maligno, pois eu acho que é um pouco complicado todos aqueles parâmetros... não que dedicando duas horas, eu não possa entender... hihihi Não mas sério dê alguns exemplos do uso com PRINTFILE da WAPI, please !
Re: Impressão a partir de uma determinada página
Enviado: 03 Abr 2009 18:20
por Maligno
Código: Selecionar todos
WAPI -PRINT:#;saida.txt;"Meu Titulo";T;E1,2-15,50-;T;2;F;result.txt
PrintFile("#", // impressora "default"
"saida.txt", // nome do arquivo que contém o texto
"Meu Titulo", // título do relatório
.T., // TRUE indica que as páginas contém os marcadores de início de página
"1,2-15,50-", // imprimir as páginas 1, 2 até 15 e de 50 até a última
.F., // FALSE indica que não quero imprimir tudo
.T., // TRUE indica que quero que sejam impressas apenas as páginas PARES
.F., // FALSE indica que não quero imprimir as páginas ÍMPARES
.T., // TRUE indica que quero imprimir em ordem invertida
2, // duas cópias de tudo
.F. // imprimir não agrupadas, ou seja, 2 cópias de cada página juntas: 1,1,2,2,3,3,4,4,...
)
Dois exemplos simples. O primeiro pra quem prefere usar o WAPI.EXE diretamente. O segundo é pela funçãode biblioteca, que é bem mais fácil. Qualquer mudança de parametrização é bem fácil. Basta ler o help. Não demora mais que alguns minutos. Duas horas é exagero.

Re: Impressão a partir de uma determinada página
Enviado: 04 Abr 2009 08:18
por anacatacombs
Maligno escreveu:(...) Os únicos trabalhos extras são: direcionar a impressão para um arquivo e inserir um marcador de página antes de cada página. Mais nada.
De que forma deve ser feito esse marcador?
Re: Impressão a partir de uma determinada página
Enviado: 04 Abr 2009 09:13
por asimoes
Amigos,
Consegui fazer a rotina para impressão de uma determinada página.
Mas tive que usar o artificio do set printer to cArq:
Um pequeno trecho da impressão:
EscPrint : Verifica se o usuário teclou Esc
Código: Selecionar todos
SetColor(cCorGet)
Aviso(24,"")
@ 24,15 Say 'Pagina inicial: 999 Pagina final: 999'
@ 24,31 Get pag_ini Picture '999'
@ 24,51 Get pag_fim Picture '999' Valid Pag_Fim >=Pag_Ini
Read
If Lastkey() = 27
Return
Endif
SetPrc(0,0)
Do While !Eof()
EscPrint()
If Fim
RstEnv(Tela)
Return
Endif
Contagem++
Quantos(Contagem)
If Prow() < 2 .Or. Prow() > LinTam(55)
If Prow() > LinTam(55)
Eject()
Endif
Cabec_Tab(vtitu)
Endif
If vCodClaOld # Classe // provoca o salto de pagina.
If Prow() > LinTam(55)
Eject()
Cabec_Tab(vTitu)
Else
@ Prow()+ 1,00 Say Replicate('-',80)
Endif
@ Prow()+ 1,00 Say Negrito(.T.)+'CLASSE: '+Classe+Negrito(.F.)
@ Prow()+ 1,00 Say Repli('=',80)
vCodclaOld := classe
Endif
If vCodSubOld # SubClasse
If Prow() > LinTam(55)
Eject()
Cabec_Tab(vTitu)
Else
@ Prow()+ 1,00 Say Replicate('-',80)
Endif
@ Prow()+ 1,00 Say ' SUBCLASSE: '+subClasse
@ Prow()+ 1,00 Say Replicate('-',80)
vCodSubOld := SubClasse
Endif
EscPrint()
If Fim
RstEnv(Tela)
Return
Endif
If Prow() > LinTam(55)
Eject()
Cabec_Tab(vtitu)
Endif
@ Prow()+1,00 Say Codigo
@ Prow() ,07 Say Descricao
@ Prow() ,58 Say Left(Razao,14)
@ Prow() ,72 Say Prc_Vend Picture '@E 9,999.99'
DbSkip() // pula para proximo produto
Enddo
PROCEDURE Cabec_Tab(Titulo)
SetPrc(0,0)
If Pg >= Pag_Ini .And. Pg <= Pag_Fim // Aqui controlo as páginas para impressão.
Set Printer To &Arq_Temp Additive
Else
Set Printer To lixo.prn
Endif
@ 00,00 Say Comprimido(.F.)
@ 01,00 Say ' TABELA DE PREÇOS'
@ 01,54 Say 'Data: '+Dtoc(Date())
@ 01,72 Say 'Pag: '
@ 01,77 Say Pg Picture '999'
@ 02,00 Say Repli('=',80)
@ 03,00 Say 'CODIGO DESCRICAO FORNECEDOR PRECO'
@ 04,00 Say Replicate('.',80)
Pg++
Return