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" )