Ler arquivo para imprimir com a Classe WIN32PRN
Moderador: Moderadores
Ler arquivo para imprimir com a Classe WIN32PRN
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 ?
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 :
Espero que tenha ajudado...
[]s
Manoel Angeiras
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
[]s
Manoel Angeiras
Clipper 5.2e + sixcdx + catools + nanfor
xHarbour 1.0.0 + gtwvw / xHarbour 1.2.1 + Fivewin
xHarbour 1.0.0 + gtwvw / xHarbour 1.2.1 + Fivewin
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
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
Olá,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
conforme mensagem postada no link viewto ... f48908611e, o xharbour não tem essa limitação.
Janiovagucs 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
fui...
e-mail:janioaguiar@yahoo.com.br
msn: janio_aguiar@hotmail.com
xHarbour1.2.1/Harbour3.2 + wvg + hwgui + Mediator + MySql
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

- Mensagens: 413
- Registrado em: 16 Out 2006 10:59
- Localização: Paranaíba-MS
Win32Prn em matriciais
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.
-:]
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)
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
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
e-mail:janioaguiar@yahoo.com.br
msn: janio_aguiar@hotmail.com
xHarbour1.2.1/Harbour3.2 + wvg + hwgui + Mediator + MySql
Pronto. Encontrei.
O segundo parâmentro da função GetPrinterS() informa em qual porta a impressora está instalada.
Faça o teste:
Pegue esse parâmentro e caso seja LPT1 imprima direto na porta, sem utilizar a classe win32prn.
Jânio
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
Jânio
fui...
e-mail:janioaguiar@yahoo.com.br
msn: janio_aguiar@hotmail.com
xHarbour1.2.1/Harbour3.2 + wvg + hwgui + Mediator + MySql
e-mail:janioaguiar@yahoo.com.br
msn: janio_aguiar@hotmail.com
xHarbour1.2.1/Harbour3.2 + wvg + hwgui + Mediator + MySql
- alaminojunior
- Colaborador

- Mensagens: 1717
- Registrado em: 16 Dez 2005 21:26
- Localização: Ubatuba - SP
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 !!!
Quanto a lentidão, experimente mudar o tipo de fonte. Apesar que lá em cima já está definido como Rascunho.
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)
****************************************************Compilador xHarbour 1.2.3 + Embarcadero C++ 7.30
MySQL c/ SQLRDD
HwGui + GTWVG
MySQL c/ SQLRDD
HwGui + GTWVG
Ah! Essa foi o Leonardo (sygecom) que compartilhou conosco.alaminojunior escreveu:Peguei esta função aqui no fórum com um dos colegas, não me lembro com quem.
Jânio
fui...
e-mail:janioaguiar@yahoo.com.br
msn: janio_aguiar@hotmail.com
xHarbour1.2.1/Harbour3.2 + wvg + hwgui + Mediator + MySql
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

- Mensagens: 413
- Registrado em: 16 Out 2006 10:59
- Localização: Paranaíba-MS
Win32Prn em matriciais
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
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)
- sygecom
- Administrador

- Mensagens: 7131
- Registrado em: 21 Jul 2006 10:12
- Localização: Alvorada-RS
- Contato:
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" )
nPrn:=PrintSetup( @cPrinterName ) // função da HWGUI
PrintFileRaw( cPrinterName, cFILE+".PRN", "Impressao do Sistema" )
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
xHarbour.org + Hwgui + PostgreSql