Página 1 de 1

Usando a WIN32PRN

Enviado: 28 Abr 2008 20:30
por Jarbas
Pessoal, boa noite, tive que mudar o meu programa (xharbou 0.99.70) para utilizar a win32prn , peguei aqui um exemplo e fui a luta .

As duvidas são :

1 - a impressao ficou bastante lenta
2 - na lexmark imprimiu certinho , mas na hp d2640 nao imprime e da uma mensagem de erro da propria hp , entro no painel da impressora e tem dois documentos a serem impressos .

Eu fiz assim :

Código: Selecionar todos

escolhe_a_impressora(_impressora) // o operador vai escolher a  impressora
                                   // q estiver instalada no windows - getprinters()

set devi to print

set printer to teste.prn

for i:=1 to 10 
    @ prow()+1,pcol say 'teste '+strzero(i,2)
next

set devi to screen

set printer to 

Nova_Impressao('teste.prn',80,_Impressora)


function Nova_Impressao(_Arquivo,tamrel,cPrinter)

local cTexto, nLinhas, nA, cLinha    // oPrinter := win32prn():New(cPrinter)
local oPrinter := win32prn():New(cPrinter)
local lA_TmpArqImp
 
oPrinter:Landscape := .F.
oPrinter:FormType  := 9
//oprinter:SetPrintQuality(-1) // qualidade da impressão
oPrinter:Copies    := 1
 
rddsetdefault('dbfntx')
_TmpArqImp:='Func_'+subst(time(),4,2)+right(time(),2)+'.DBF'
vARQ:={}
aadd( vARQ, {"LINHA","C",200,0} )
DBcreate((lA_TmpArqImp), vARQ)
 
USE (_TmpArqImp) alias temp new shared 
append from (_Arquivo) sdf  

IF ! oPrinter:Create()
   Alerta("Não foi possivel criar a impressão ")
   return NIL
ELSE
   IF ! oPrinter:StartDoc("Impressao")
      Alerta("Falha na criação do arquivo de impressão ")
      return NIL
   endif
 
   IF TAMREL=80
      oPrinter:setfont('Courier New',,11,,,,255) // Normal
   ELSE
      oPrinter:SetFont("Courier New",11,{3,-50}) // Comprimida
   ENDIF
   oPrinter:Bold(0) // Normal
 
   dbgotop()
   Do while !eof()
      cLinha := Linha           // Busca linha de impressao
      oPrinter:newline() // Inicia nova linha
 
      oPrinter:SetFont("Courier New",11,{3,-50}) // Comprimida
 
      oPrinter:TextOut(HB_OemToAnsi(cLinha))
      oPrinter:Bold(0) // Normal
      dbskip()
 
      if ! eof()
         if (oPrinter:MaxRow() - 2) <= oPrinter:Prow() // Usa "oPrinter:NewPage()" para iniciar nova pagina
            oPrinter:NewPage()
         endif
      endif
   enddo
   oPrinter:EndDoc()
   oPrinter:Destroy()
ENDIF
USE
ferase((lA_TmpArqImp))
rddsetdefault('MYSQL')
RETURN NIL

Se alguem puder me ajudar , ficarei muito grato
Abs
Jarbas

Enviado: 28 Abr 2008 22:54
por Luciano Bonfim
vc esta setando a fonte toda hora dentro do loop, seta ela antes fora do loop... mesma coisa com o negrito... pra que dentro do loop!!!

Enviado: 29 Abr 2008 08:58
por Jarbas
Obrigado Luciano, vc tem razão , isso deve agilizar a impressao , mas pq nao consigo imprimir na hp d2640 ??? A win32prn não é para qualquer impressora ??


Valeu
Abs
Jarbas

Enviado: 29 Abr 2008 11:07
por Luciano Bonfim
bem... isso eu já näo sei te responder... mas fa o seguinte: imprime para PDF(via driver PDF) e depois dentro do PDF manda imprimir para essa impressora ai que funciona....

Enviado: 29 Abr 2008 21:03
por Jarbas
Sera que ninguem saberia me dizer qual é o problema ????

Eu falei a impressora errada , o correto é hp deskjet d2460, mas eu acho q não ha problema com ela , pois faço um documento no bloco de notas e imprime direitinho .
Eu pensei que o win32prn service para impressão em qualquer impressora !! Ou realmente serve e eu estou fazendo algo errado ??


A mensagem que aparece aqui é :
"Falha ao imprimir este documento"
"Nome do Documento: 'Documento de nivel inferior' "
"Nome do . . . . e assim vai "

depois no painel da impressora ficam 2 arquivos :
c:\docume~\adimin~\config\temp\xht406.tmp
impressao

Se alguem puder me ajudar , fico muito grato.

Abs
Jarbas

Enviado: 30 Abr 2008 08:51
por sygecom
Olá Jarbas,
Compile o exemplo do link abaixo e teste nessa impressora onde esta dando o problema:
https://pctoledo.org/forum/viewtopic.php?t=6465

Obs: Até agora não encontrei impressoras que não funcione com a Win32Prn.

Enviado: 30 Abr 2008 13:31
por Jarbas
Ola, obrigado pela resposta , e vc tem razao imprimiu , vc poderia me dizer onde estou errando :

escolhe_a_impressora(_impressora) // o operador vai escolher a impressora
// q estiver instalada no windows - getprinters()

set devi to print

set printer to teste.prn

for i:=1 to 10
@ prow()+1,pcol say 'teste '+strzero(i,2)
next

set devi to screen

set printer to

Nova_Impressao('teste.prn',80,_Impressora)


function Nova_Impressao(_Arquivo,tamrel,cPrinter)

local cTexto, nLinhas, nA, cLinha // oPrinter := win32prn():New(cPrinter)
local oPrinter := win32prn():New(cPrinter)
local lA_TmpArqImp

oPrinter:Landscape := .F.
oPrinter:FormType := 9
oPrinter:Copies := 1

rddsetdefault('dbfntx')
_TmpArqImp:='Func_'+subst(time(),4,2)+right(time(),2)+'.DBF'
vARQ:={}
aadd( vARQ, {"LINHA","C",200,0} )
DBcreate((lA_TmpArqImp), vARQ)

USE (_TmpArqImp) alias temp new shared
append from (_Arquivo) sdf

IF ! oPrinter:Create()
Alerta("Não foi possivel criar a impressão ")
return NIL
ELSE
IF ! oPrinter:StartDoc("Impressao")
Alerta("Falha na criação do arquivo de impressão ")
return NIL
endif

IF TAMREL=80
oPrinter:setfont('Courier New',,11,,,,255) // Normal
ELSE
oPrinter:SetFont("Courier New",11,{3,-50}) // Comprimida
ENDIF
oPrinter:Bold(0) // Normal

dbgotop()
Do while ! eof()
cLinha := Linha // Busca linha de impressao
oPrinter:newline() // Inicia nova linha
oPrinter:TextOut(HB_OemToAnsi(cLinha))
dbskip()

if ! eof()
if (oPrinter:MaxRow() - 2) <= oPrinter:Prow() // Usa "oPrinter:NewPage()" para iniciar nova pagina
oPrinter:NewPage()
endif
endif
enddo
oPrinter:EndDoc()
oPrinter:Destroy()
ENDIF
USE
ferase((lA_TmpArqImp))
rddsetdefault('MYSQL')
RETURN NIL

MUITO OBRIGADO
ABS
JARBAS

Enviado: 30 Abr 2008 13:46
por sygecom
Posta a função "escolhe_a_impressora()"

Enviado: 30 Abr 2008 13:58
por sygecom
Tente colocar um "oPrinter:newline()" antes de setar a FONT COM "oPrinter:setfont()"

Enviado: 30 Abr 2008 14:06
por sygecom
Outra coisa, não tem necessidade de ficar mudando o RDD a toda hora, Apenas deixe o REQUEST DBFNTX no inicio do seu sistema, e deixe como RDD padrão o "MYSQL" e na hora de criar os DBF , use assim:
DBcreate(cFILE, vARQ,"DBFNTX")

E para abrir o DBF:
USE NOMETEMP new shar VIA "DBFNTX"
append from (cArq) sdf && nome completo do arquivo sdf
...
...
...