Página 1 de 1

Ler arquivo para imprimir com a Classe WIN32PRN

Enviado: 05 Dez 2006 18:28
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 ?

Enviado: 06 Dez 2006 08:21
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

Enviado: 06 Dez 2006 10:05
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

memoread em xh

Enviado: 06 Dez 2006 11:18
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

Enviado: 06 Dez 2006 16:03
por Grings
Bem se não houver a limitação de 64kb o problema estará resolvido, vou testar.

Muito Obrigado pessoal!

Abraços

Grings

Win32Prn em matriciais

Enviado: 15 Jan 2008 12:24
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.
-:]

Enviado: 15 Jan 2008 12:49
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

Enviado: 15 Jan 2008 13:00
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

Enviado: 15 Jan 2008 13:37
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.

Enviado: 15 Jan 2008 14:06
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

Win32Prn em matriciais

Enviado: 15 Jan 2008 17:36
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

Enviado: 15 Jan 2008 21:02
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" )