Ler arquivo para imprimir com a Classe WIN32PRN

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

Moderador: Moderadores

Grings
Usuário Nível 3
Usuário Nível 3
Mensagens: 340
Registrado em: 18 Ago 2004 13:51

Ler arquivo para imprimir com a Classe WIN32PRN

Mensagem por Grings »

Estou tentado ler um arquivo texto para imprimir com a classe WIN32PRN e não estou tendo êxito. Para imprimir no modo DOS foi fácil mas a rotina não funciona com a classe. Alguém tem alguma dica de como fazer isso ?
angeiras
Usuário Nível 3
Usuário Nível 3
Mensagens: 134
Registrado em: 21 Nov 2005 20:53
Localização: Olinda/PE

Mensagem por angeiras »

Olá,

Eu uso a win32prn para toda impressão que faço. Dá trabalho no começo mas é só "pegar o jeito" que fica show de bola !

Depois do relatório gerado em texto, uso a rotina para imprimir :

Código: Selecionar todos

#define SALTO_PAGINA chr(12)

********************************
FUNCTION Imprime( cArq, tamrel ) // arquivo e tamanho da linha
********************************
   local cTexto, nLinhas, nA, cLinha, oPrinter := win32prn()

   oPrinter:New( GetDefaultPrinter() )
   oPrinter:Landscape := .F.
   oPrinter:FormType  := 9
   oPrinter:Copies    := 1

   if !oPrinter:Create()
      Alert("Não foi possível criar a impressão")
      return NIL
   endif
   if ! oPrinter:StartDoc("Impressao xharbour")
      Alert("StartDoc() - falhou ")
      return NIL
   endif
   oPrinter:SetDefaultFont()
   if tamrel > 80
      oPrinter:setfont(,,17,,,,255)
   else
      oPrinter:setfont(,,11,,,,255)
   endif

   oPrinter:TextOut( space(tamrel), .T. )
   cTexto  := memoread( cArq )
   nLinhas := mlcount( cTexto, tamrel, 1, .F. )
   for nA := 1 to nLinhas
      cLinha := memoline( cTexto, tamrel, nA, 1, .F. )
      if left( alltrim( cLinha ), 1 ) == SALTO_PAGINA
         oPrinter:NewPage()
      else
         oPrinter:TextOut( cLinha, .T. )
      endif
   next
   oPrinter:EndDoc()
   oPrinter:Destroy()
RETURN NIL
Espero que tenha ajudado...

[]s
Manoel Angeiras
Clipper 5.2e + sixcdx + catools + nanfor
xHarbour 1.0.0 + gtwvw / xHarbour 1.2.1 + Fivewin
Grings
Usuário Nível 3
Usuário Nível 3
Mensagens: 340
Registrado em: 18 Ago 2004 13:51

Mensagem por Grings »

Manoel,

Obrigado pela atenção, mas o problema é que MemoRead() só lê até 64Kb, pelo menos no Clipper, o que acaba limitando o tamanho do relatório, por isso que preciso usar as funções de baixo nível.

Por acaso vc teria a documentação da classe WIN32PRN ou saberia indicar aonde consigo ? Grato!

Abraços

Grings
Avatar do usuário
janio
Colaborador
Colaborador
Mensagens: 1846
Registrado em: 06 Jul 2004 07:43
Localização: UBAJARA - CE

memoread em xh

Mensagem por janio »

Grings escreveu:Manoel,

Obrigado pela atenção, mas o problema é que MemoRead() só lê até 64Kb, pelo menos no Clipper, o que acaba limitando o tamanho do relatório, por isso que preciso usar as funções de baixo nível.

Grings
Olá,

conforme mensagem postada no link viewto ... f48908611e, o xharbour não tem essa limitação.
vagucs escreveu:3- existe o comando SORT, limites de memoria, limite da data ate 2030
Sim, existe o comando SORT, a memoria agora é limitada ao que a maquina tiver disponivel, tipo, os arrays no clipper podem ter até 4096 elementos no xHarbour nao tem limite, as variaveis tipo string no clipper so tem 64k no xHarbour nao tem limites, o memoedit, memoread, etc tambem nao tem limitação de tamanho, os nomes de procedures e variaveis podem ter até 64 letras, vc ainda pode compilar com oxharbour para que ele corte estes nomes para ter mais compatibilidade com o clipper mas nao vejo vantagem, nao tem limite de datas, todas as limitações do clipper acadam com o xHarbour e vc tem o mesmo programa rodando mas com poder de processamentos 32bits puro.
vagucs
Janio
fui...
e-mail:janioaguiar@yahoo.com.br
msn: janio_aguiar@hotmail.com
xHarbour1.2.1/Harbour3.2 + wvg + hwgui + Mediator + MySql
Grings
Usuário Nível 3
Usuário Nível 3
Mensagens: 340
Registrado em: 18 Ago 2004 13:51

Mensagem por Grings »

Bem se não houver a limitação de 64kb o problema estará resolvido, vou testar.

Muito Obrigado pessoal!

Abraços

Grings
leandrolinauer
Usuário Nível 3
Usuário Nível 3
Mensagens: 413
Registrado em: 16 Out 2006 10:59
Localização: Paranaíba-MS

Win32Prn em matriciais

Mensagem por leandrolinauer »

Bom dia.
Aproveitando o assunto, me deparei com o seguinte problema:
Win32Prn imprimindo em JATO DE TINTA, LASER, MATRICIAIS FX890, são rápidas as impressões, mas na LX-300 ESPON a mesma é de uma tamanha lentidão que tive reclamações de cliente, visto que uso a mesma função de impressão para qualquer tipo de impressora cadastrada no windows, como faço para descobrir que tipo de impressora esta cadastrada, se a getprinter informa se é matricial, laser ou jato de tinta, para diferenciar a forma de impressão, usando a win32prn apenas para as HP e JATO DE TINTA.
Se alguém souber alguma forma fácil de resolver, fico grato.
-:]
Harbour 3.2 + GtWVW + QT + SQLite3 + DBF + SQL (Firebird)
Avatar do usuário
janio
Colaborador
Colaborador
Mensagens: 1846
Registrado em: 06 Jul 2004 07:43
Localização: UBAJARA - CE

Mensagem por janio »

Colega,

A impressão na LX300 fica lenta pq a classe win32prn torna a impressão GRÁFICA. Diferente quando mandamos imprimir direto na porta (LPT1), que é uma impressão TEXTO.

O que vc pode fazer é verificar em que porta a impressora está instalada. Geralmente as MATRICIAIS ficam na LTP1 mesmo, enquanto que as JATO DE TINTA usam a porta USB.

Há uma função no xharbour que diz exatamente isso. Só não tô lembrando qual é no momento.

Jânio
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
janio
Colaborador
Colaborador
Mensagens: 1846
Registrado em: 06 Jul 2004 07:43
Localização: UBAJARA - CE

Mensagem por janio »

Pronto. Encontrei.

O segundo parâmentro da função GetPrinterS() informa em qual porta a impressora está instalada.

Faça o teste:

Código: Selecionar todos

   prn := GetPrinterS(.T.)
   for i=1 to len(prn)
       ? prn[i,1]
       ?? prn[i,2]
       l++
   next
Pegue esse parâmentro e caso seja LPT1 imprima direto na porta, sem utilizar a classe win32prn.

Jânio
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
alaminojunior
Colaborador
Colaborador
Mensagens: 1717
Registrado em: 16 Dez 2005 21:26
Localização: Ubatuba - SP

Mensagem por alaminojunior »

Peguei esta função aqui no fórum com um dos colegas, não me lembro com quem. Adaptei para as minhas necessidades e funciona que é uma beleza !!!

Código: Selecionar todos

#include "box.ch"
#include "inkey.ch"

************* 
FUNC CHAMAIMP 
************* 
LOCAL aINCCLI := savescreen( 08,09,21,63 ) 
Private nPrn    := 1 
Private aPrn    := GetPrinters() // Detecta impressoras instaladas
PARA TAM    // S=A IMPRESSAO EM 136 COL. N=A IMPRESSAO EM 79COL. 
If Empty(aPrn) 
   OBRIGA1() 
   Return 
else 
   Hb_Shadow(08,09,19,61)
   @ 08,09,19,61 box B_DOUBLE + space(1) colo "n+/bg" 
   @ 09,26 say "Selecione a impressora" colo "w+/bg"
   @ 18,30 say "ESC - VOLTA" colo "n+/bg"
   SETCOLOR( "w/bg,n/gr*,,,n*/w" ) 
   nPrn:= ACHOICE(11,11,15,59,aPrn,.T.,,nPrn)  // LISTA DE IMPRESSORAS 
EndIf 
if lastkey() = K_ESC
   Restscreen(08,09,21,63,aINCCLI) 
   RETURN NIL 
endif   
IF TAM="S" 
   IF !EMPTY(nPrn) 
      Imprime("Dizimo.imp",136,aPrn[nPrn]) 
   ENDIF 
ELSE 
   IF !EMPTY(nPrn) 
      Imprime("Dizimo.imp",80,aPrn[nPrn]) 
   ENDIF 
ENDIF 
Restscreen(08,09,21,63,aINCCLI) 
RETURN NIL 

**************************** 
STATIC FUNC Imprime( cArq, tamrel ,cPrinter ) 
**************************** 
local cTexto, nLinhas, nA, cLinha    // oPrinter := win32prn():New(cPrinter) 
local oPrinter := win32prn():New(cPrinter),oBmp

oBmp:= Win32BMP():new() 
oPrinter:Landscape := .F. 
oPrinter:FormType  := 9 
oPrinter:Copies    := 1 
oPrinter:SetPrintQuality(-1) //-1Rascunho //-2 Mínima //-3 Média //-4 Alta 

IF !oPrinter:Create() 
   OBRIGA2() 
   return NIL 
endif 

IF ! oPrinter:StartDoc("Controle de D¡zimo Paroquial") // MENSAGEM NO SPOOL 
   OBRIGA2()  
   return NIL 
endif 

oPrinter:SetDefaultFont() 
if tamrel > 80 
   oPrinter:setfont('Courier New',,17,,,,255) 
else 
   oPrinter:setfont('Courier New',,11,,,,255) 
endif 

oPrinter:TextOut( space(tamrel), .T. ) 
cTexto  := memoread( cArq ) 
nLinhas := mlcount( cTexto, tamrel, 1, .F. ) 
nConta  := 0 

for nA := 1 to nLinhas 
    IF oBmp:loadFile("DIZIMO.BMP") 
       oBmp:Draw( oPrinter, { 50, 0, 147, 92 } ) 
    ENDIF 
   cLinha := memoline( cTexto, tamrel, nA, 1, .F. ) 
   IF nCONTA=66  //QUANDO CHEGAR EM 66 UMA NOVA PAGINA 
      oPrinter:NewPage() 
      nConta  := 0 
   else 
      oPrinter:TextOut( cLinha, .T. ) 
   endif 
   nConta=nConta+1 
next 
oPrinter:EndDoc() 
oBMP:Destroy()
oPrinter:Destroy() 
RETURN NIL 

**************************************************** 
FUNC OBRIGA1 
Private rTela  := Savescreen(07,00,19,79) 
wvt_messagebox("Nao Foi Possivel achar Nenhuma Impressora Instalada, Favor Verificar a Impressora !!!","ATENCAO !!!",48) 
**************************************************** 
FUNC OBRIGA2 
Private rTela  := Savescreen(07,00,19,79) 
wvt_messagebox("Problema ao Imprimir....Favor Verificar a Impressora "+ aPrn[nPrn] ,"ATENCAO !!!",48) 
****************************************************
Quanto a lentidão, experimente mudar o tipo de fonte. Apesar que lá em cima já está definido como Rascunho.
Compilador xHarbour 1.2.3 + Embarcadero C++ 7.30
MySQL c/ SQLRDD
HwGui + GTWVG
Avatar do usuário
janio
Colaborador
Colaborador
Mensagens: 1846
Registrado em: 06 Jul 2004 07:43
Localização: UBAJARA - CE

Mensagem por janio »

alaminojunior escreveu:Peguei esta função aqui no fórum com um dos colegas, não me lembro com quem.
Ah! Essa foi o Leonardo (sygecom) que compartilhou conosco.

Jânio
fui...
e-mail:janioaguiar@yahoo.com.br
msn: janio_aguiar@hotmail.com
xHarbour1.2.1/Harbour3.2 + wvg + hwgui + Mediator + MySql
leandrolinauer
Usuário Nível 3
Usuário Nível 3
Mensagens: 413
Registrado em: 16 Out 2006 10:59
Localização: Paranaíba-MS

Win32Prn em matriciais

Mensagem por leandrolinauer »

Boa tarde,

Agradeço desde já a colaboração dos colegas, como Jânio falou o segundo parametro da GetPrinter ela informa que tipo de impressora, é exatamente o que eu preciso, vou testar e porto aqui como fiz para funcionar a mesma impressão com os dois tipos Win32Prn e direto em modo texto.

Grato.
:xau
Harbour 3.2 + GtWVW + QT + SQLite3 + DBF + SQL (Firebird)
Avatar do usuário
sygecom
Administrador
Administrador
Mensagens: 7131
Registrado em: 21 Jul 2006 10:12
Localização: Alvorada-RS
Contato:

Mensagem por sygecom »

Srs. eu estou usando a função PrintSetup() da HWGUI para pegar a impressora do windows, e se o usuario escolher LPT mando imprimir pela PrintFileRaw() e se não for LPT mando imprimir pela Win32Prn.

nPrn:=PrintSetup( @cPrinterName ) // função da HWGUI

PrintFileRaw( cPrinterName, cFILE+".PRN", "Impressao do Sistema" )
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
Responder