Imprime apenas 1 pagina

Projeto [x]Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

EDSON MONTRESOR
Usuário Nível 1
Usuário Nível 1
Mensagens: 11
Registrado em: 23 Jan 2018 21:59
Localização: MATAO / SP

Imprime apenas 1 pagina

Mensagem por EDSON MONTRESOR »

Caros companheiros, boa noite.

Estou apelando a vocês pois não consegui resolver o problema (Pura ferrugem depois de muito tempo parado).

Pesquisei aqui no fórum e localizei a rotina de impressão abaixo, gerei o relatório em arquivo texto, controlei via programa o EJECT, porem, só imprime 1 pagina.

Poderiam me informar onde estou errando.

Código: Selecionar todos

FUNCTION SELPRINT(PRELATO)
Local eol := Chr(13) + Chr(10), cCupom, nPrn, aPrn := Win_PrinterList() 

#define FORM_A4 9
REQUEST hb_CodePage_PTISO 
Set( _SET_CODEPAGE, "PTISO" ) 

  
do While nPrn != 0 
 @ 1, 0 SAY "Selecione a impressora:" 
 @ 2, 0 TO MaxRow(), MaxCol() 
 nPrn := AChoice( 3, 1, MaxRow() - 1, MaxCol() - 1, aPrn, .T.,, nPrn ) 

 IF nPrn != 0 
  PrintWinPrn( PRELATO , aPrn[ nPrn ] ) 
 Endif 
EndDo 
   
Clear Screen 
   
eturn Nil 
   
Function PrintWinPrn( cArq, cPrint ) 
Local oPrn, aPrn := GetPrinters(), n := 0 
   
oPrn := Win_Prn():New(cPrint) 
oPrn : LandScape := .F. 
oPrn : FormType  := FORM_A4 
oPrn :Copies := 1 
oPrn :CharSet(255) 
oPrn:SetFont('courier new',17,{1,17}, 0,.F.,.F.) 
   
If !oPrn:Create() 
 Alert("Nao foi criado o documento de Impressao") 
 Return nil 
EndIf 
   
If !oPrn:StartDoc("Imprimindo Documento") 
 Alert("Erro na Impressora") 
 Return nil 
EndIf 
  
HB_CDPSelect("PT850") 
   
SetPrc(0,0) 
cText := MemoRead( cArq ) 
nLinh := MlCount( cText ) 
For n := 1 to nLinh 
 *TERM1(N,NLINH,19)
 oPrn:TextOut(HB_AnsiToOem(MemoLine(cText,,n)),.t.) 
Next 
oPrn:EndDoc() 
   
HB_CDPSelect( "PTISO") 
   
Return .t.
Editado pela última vez por Toledo em 02 Fev 2018 16:16, em um total de 1 vez.
Razão: Mensagem editada para colocar a tag [ code ]<br>Veja como utilizar esta tag: http://www.pctoledo.com.br/forum/faq.php?mode=bbcode#f2r1
EDSON MONTRESOR
Usuário Nível 1
Usuário Nível 1
Mensagens: 11
Registrado em: 23 Jan 2018 21:59
Localização: MATAO / SP

IMPRIME APENAS 1 PAGINA

Mensagem por EDSON MONTRESOR »

Segue o arquivo TXT
Anexos
RELFOR.txt
(276.41 KiB) Baixado 78 vezes
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

IMPRIME APENAS 1 PAGINA

Mensagem por JoséQuintas »

Numa pesquisa rápida da win_prn(), encontra-se um método NewPage(). Isso te diz alguma coisa?
winprn.png
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
alaminojunior
Colaborador
Colaborador
Mensagens: 1717
Registrado em: 16 Dez 2005 21:26
Localização: Ubatuba - SP

IMPRIME APENAS 1 PAGINA

Mensagem por alaminojunior »

método NewPage(). Isso te diz alguma coisa?
Exatamente.
O controle de páginas você mesmo precisa fazer.
Naquele laço For ... Next você precisa controlar o número de linhas impressas, segundo a resolução da impressora, tamanho de fontes, etc ... e ao chegar no final da folha ou próximo, você envia o método de nova página zerando o parâmetro de linha.

Win32Prn é uma classe muito poderosa. Entendendo a mesma e sabendo usar, dá pra fazer um estrago.
Compilador xHarbour 1.2.3 + Embarcadero C++ 7.30
MySQL c/ SQLRDD
HwGui + GTWVG
EDSON MONTRESOR
Usuário Nível 1
Usuário Nível 1
Mensagens: 11
Registrado em: 23 Jan 2018 21:59
Localização: MATAO / SP

IMPRIME APENAS 1 PAGINA

Mensagem por EDSON MONTRESOR »

Desculpem, mas eu havia entendido que o controle de páginas poderia ser feito na construção do arquivo ".txt", e nele, inseri o comando EJECT ao final de cada pagina.

Obrigado pelas dicas e vou rever o programa.
Avatar do usuário
Toledo
Administrador
Administrador
Mensagens: 3133
Registrado em: 22 Jul 2003 18:39
Localização: Araçatuba - SP
Contato:

IMPRIME APENAS 1 PAGINA

Mensagem por Toledo »

Edson, dê uma olhada neste arquivo que está na seção Download aqui do fórum:

Visualizando relatórios - Console + HwGui

No arquivo open_rel.prg procure pela função Imprime_hb(). Nesta função tem controle para relatórios com várias páginas.

Abraços,
Toledo - Clipper On Line
toledo@pctoledo.com.br
Harbour 3.2/MiniGui/HwGui
Faça uma doação para o fórum, clique neste link: http://www.pctoledo.com.br/doacao
EDSON MONTRESOR
Usuário Nível 1
Usuário Nível 1
Mensagens: 11
Registrado em: 23 Jan 2018 21:59
Localização: MATAO / SP

Imprime apenas 1 pagina

Mensagem por EDSON MONTRESOR »

Obrigado mais uma vez
EDSON MONTRESOR
Usuário Nível 1
Usuário Nível 1
Mensagens: 11
Registrado em: 23 Jan 2018 21:59
Localização: MATAO / SP

Imprime apenas 1 pagina

Mensagem por EDSON MONTRESOR »

Caros colegas, bom dia!

O grande auxilio do Toledo já me foi muito mais que suficiente para o que eu queria.

Mas a titulo de matar minha curiosidade, gostaria de saber o seguinte:

Quando gerei o arquivo "relfor.txt" adicionei os EJECTs ao fim de cada pagina e repeti o cabeçalho do relatório no inicio da nova pagina.

Quando edito o "relfor.txt", existe a indicação de fim de página.

Entendo que o laço FOR / NEXT lê linha-a-linha do arquivo "relfor.txt" e nesta situação, no programa acima, daria para EJETAR a pagina ao encontrar a indicação de fim de pagina no arquivo ?

Obrigado
Avatar do usuário
alaminojunior
Colaborador
Colaborador
Mensagens: 1717
Registrado em: 16 Dez 2005 21:26
Localização: Ubatuba - SP

Imprime apenas 1 pagina

Mensagem por alaminojunior »

Entendo que o laço FOR / NEXT lê linha-a-linha do arquivo "relfor.txt" e nesta situação, no programa acima, daria para EJETAR a pagina ao encontrar a indicação de fim de pagina no arquivo ?
A classe Win32Prn não interpreta assim.

O comando EJECT funciona enviando um chr(12) para a impressora, zerando as coordenadas de linha e coluna, ejetando a página.
Na Win32Prn para começar ela não entende muito bem de linhas e colunas, mas sim de píxels.
Portanto o controle está contigo.
Compilador xHarbour 1.2.3 + Embarcadero C++ 7.30
MySQL c/ SQLRDD
HwGui + GTWVG
EDSON MONTRESOR
Usuário Nível 1
Usuário Nível 1
Mensagens: 11
Registrado em: 23 Jan 2018 21:59
Localização: MATAO / SP

Imprime apenas 1 pagina

Mensagem por EDSON MONTRESOR »

Partindo do principio que antes da impressão, a função esta lendo um arquivo TEXTO, fiz a seguinte alteração e aparentemente deu certo:

  1. Código: Selecionar todos

    
    cText := MemoRead( cArq ) 
    nLinh := MlCount( cText ) 
    For n := 1 to nLinh 
    
      oPrn:TextOut(HB_AnsiToOem(MemoLine(cText,85,n)),.t.) 
     
      cLinha := memoline( cText, 85 , n, 1, .F. ) 
    
     if  chr(12) $ clinha
       oPrn:newpage() 
     endif 
     
    Next
    
[/color]
EDSON MONTRESOR
Usuário Nível 1
Usuário Nível 1
Mensagens: 11
Registrado em: 23 Jan 2018 21:59
Localização: MATAO / SP

Imprime apenas 1 pagina

Mensagem por EDSON MONTRESOR »

alaminojunior, obrigado, pois a sua citação do chr(12) me fez tentar esta alternativa....
Avatar do usuário
alaminojunior
Colaborador
Colaborador
Mensagens: 1717
Registrado em: 16 Dez 2005 21:26
Localização: Ubatuba - SP

Imprime apenas 1 pagina

Mensagem por alaminojunior »

Gostei !
Uma saída inteligente.
Compilador xHarbour 1.2.3 + Embarcadero C++ 7.30
MySQL c/ SQLRDD
HwGui + GTWVG
EDSON MONTRESOR
Usuário Nível 1
Usuário Nível 1
Mensagens: 11
Registrado em: 23 Jan 2018 21:59
Localização: MATAO / SP

Imprime apenas 1 pagina

Mensagem por EDSON MONTRESOR »

Boa tarde a todos.

Gostaria de saber se é possível centralizar dentro da ACHOICE as opções de impressoras ?

Na captura das impressoras tentei utilizar:

Código: Selecionar todos

LOCAL nPrn, aPrn := padc(Win_PrinterList(),30)
e deu falha.

Também tentei:

Código: Selecionar todos

nPrn := AChoice( 7, 1, MaxRow() - 1, 78 , padc(aPrn,30) , .T.,, nPrn ) 
e deu falha.

Gostaria que a ACHOICE exibisse os menu de impressoras centralizados:

Código: Selecionar todos

"          IMPRESSORA A          "
"          IMPRESSORA B          "
e não

Código: Selecionar todos

"IMPRESSORA A                    "
"IMPRESSORA B                    "
Obrigado
Avatar do usuário
Toledo
Administrador
Administrador
Mensagens: 3133
Registrado em: 22 Jul 2003 18:39
Localização: Araçatuba - SP
Contato:

Imprime apenas 1 pagina

Mensagem por Toledo »

Edson, tente o seguinte:

Código: Selecionar todos

aPrn := Win_PrinterList()
FOR i:=1 TO Len(aPrn)
  aPrn[i]:= padc(aPrn[i],30)
NEXT
Abraços,
Toledo - Clipper On Line
toledo@pctoledo.com.br
Harbour 3.2/MiniGui/HwGui
Faça uma doação para o fórum, clique neste link: http://www.pctoledo.com.br/doacao
Avatar do usuário
rubens
Colaborador
Colaborador
Mensagens: 1520
Registrado em: 16 Ago 2003 09:05
Localização: Nova Xavantina - MT

Imprime apenas 1 pagina

Mensagem por rubens »

Bom dia

Dá uma olhada nesse tópico... viewtopic.php?f=4&t=18184

Rubens
"Eu e minha casa servimos ao Senhor e você ???"
Responder