Impressão a partir de uma determinada página

Fórum sobre a linguagem CA-Clipper.

Moderador: Moderadores

Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

Impressão a partir de uma determinada página

Mensagem 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
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

Impressão a partir de uma determinada página

Mensagem 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.
Um clip-abraço !

Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

Re: Impressão a partir de uma determinada página

Mensagem 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
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

Impressão a partir de uma determinada página

Mensagem 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.
Um clip-abraço !

Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
Avatar do usuário
Maligno
Membro Master
Membro Master
Mensagens: 6398
Registrado em: 06 Jul 2004 01:40
Localização: Londrina/PR

Re: Impressão a partir de uma determinada página

Mensagem 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.
[]'s
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.

---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
Avatar do usuário
janio
Colaborador
Colaborador
Mensagens: 1846
Registrado em: 06 Jul 2004 07:43
Localização: UBAJARA - CE

Re: Impressão a partir de uma determinada página

Mensagem por janio »

Respondi a algo semelhante neste tópico
fui...
e-mail:janioaguiar@yahoo.com.br
msn: janio_aguiar@hotmail.com
xHarbour1.2.1/Harbour3.2 + wvg + hwgui + Mediator + MySql
Avatar do usuário
Maligno
Membro Master
Membro Master
Mensagens: 6398
Registrado em: 06 Jul 2004 01:40
Localização: Londrina/PR

Re: Impressão a partir de uma determinada página

Mensagem 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. :)
[]'s
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.

---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

Impressão a partir de uma determinada página

Mensagem 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 !
Um clip-abraço !

Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
Avatar do usuário
Maligno
Membro Master
Membro Master
Mensagens: 6398
Registrado em: 06 Jul 2004 01:40
Localização: Londrina/PR

Re: Impressão a partir de uma determinada página

Mensagem 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. :)
[]'s
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.

---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
anacatacombs
Membro Master
Membro Master
Mensagens: 472
Registrado em: 12 Jul 2005 16:53
Localização: Cianorte-Paraná
Contato:

Re: Impressão a partir de uma determinada página

Mensagem 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?
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

Re: Impressão a partir de uma determinada página

Mensagem 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
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Responder