Página 1 de 1

Imprime apenas 1 pagina

Enviado: 01 Fev 2018 23:59
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.

IMPRIME APENAS 1 PAGINA

Enviado: 02 Fev 2018 00:04
por EDSON MONTRESOR
Segue o arquivo TXT

IMPRIME APENAS 1 PAGINA

Enviado: 02 Fev 2018 10:39
por JoséQuintas
Numa pesquisa rápida da win_prn(), encontra-se um método NewPage(). Isso te diz alguma coisa?
winprn.png

IMPRIME APENAS 1 PAGINA

Enviado: 02 Fev 2018 11:46
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.

IMPRIME APENAS 1 PAGINA

Enviado: 02 Fev 2018 14:56
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.

IMPRIME APENAS 1 PAGINA

Enviado: 02 Fev 2018 16:13
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,

Imprime apenas 1 pagina

Enviado: 02 Fev 2018 16:24
por EDSON MONTRESOR
Obrigado mais uma vez

Imprime apenas 1 pagina

Enviado: 03 Fev 2018 12:11
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

Imprime apenas 1 pagina

Enviado: 03 Fev 2018 12:27
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.

Imprime apenas 1 pagina

Enviado: 03 Fev 2018 17:08
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]

Imprime apenas 1 pagina

Enviado: 03 Fev 2018 17:11
por EDSON MONTRESOR
alaminojunior, obrigado, pois a sua citação do chr(12) me fez tentar esta alternativa....

Imprime apenas 1 pagina

Enviado: 03 Fev 2018 17:21
por alaminojunior
Gostei !
Uma saída inteligente.

Imprime apenas 1 pagina

Enviado: 04 Fev 2018 17:05
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

Imprime apenas 1 pagina

Enviado: 05 Fev 2018 07:55
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,

Imprime apenas 1 pagina

Enviado: 05 Fev 2018 08:48
por rubens
Bom dia

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

Rubens