Win32Prn no Harbour

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

Moderador: Moderadores

DLZ
Usuário Nível 3
Usuário Nível 3
Mensagens: 184
Registrado em: 09 Jun 2008 10:09
Localização: Ibirubá - RS - Brasil

Win32Prn no Harbour

Mensagem por DLZ »

Olá amigos..
Tenho um sistema compilado com Xharbour 1.0 e Bcc55 que utiliza o Win32Prn e funciona tudo perfeitamente.
Baixei o Harbour 1.01 para fazer alguns testes com a GtWvg. Quando fui compilar esse mesmo sistema com o Harbour, retorna um erro dizendo que não encontrou as funções :

_HB_FUN_CREATEOBJECT
_HB_FUN_SETLASTKEY
_HB_FUN_GETPRINTERS
_HB_FUN_GETDEFAULTPRINTER
_HB_FUN_WIN32PRN
_HB_FUN_WIN32BMP

Utilizo o Hbmake para compilar..
Qual seria a causa do problema ?? a mim parece a falta de alguma lib. Se eu olhar no manual do Xharbour, la consta que essas funções fazem parte da Xhb.lib, mas no Harbour, qual a lib que contém essas funções ?
Avatar do usuário
sygecom
Administrador
Administrador
Mensagens: 7131
Registrado em: 21 Jul 2006 10:12
Localização: Alvorada-RS
Contato:

Re: Win32Prn no Harbour

Mensagem por sygecom »

Buenas Dercio,

Primeiro quero lhe agradecer pelas dicas com a WIN32BMP esta rodando que é um beleza !!!

Antes de compilar com Harbour, já atualize para a versão beta mais recente, esta muito boa e pode baixar no link abaixo:
http://sourceforge.net/project/download ... a1-win.exe

Para usar as funções citadas por você, você tem que linkar as seguintes LIB:
hbct hbwin xhb

Para usar a WIN32PRN no Harbour muda um pouco, apenas onde esta: win32prn():New("NOME_IMP") você muda para: win_prn():New("NOME_IMP")

E onde esta: Win32BMP():new() você muda para: Win_BMP():new()

No resto fica tudo igualzinho !!!
E para compilar use o hbmk2 que esta muito facil de compilar tanto para windows como para linux !!!
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
wagner aragao
Usuário Nível 2
Usuário Nível 2
Mensagens: 58
Registrado em: 30 Jan 2008 02:06
Localização: PORTO VELHO-RONDÔNIA

Re: Win32Prn no Harbour

Mensagem por wagner aragao »

Olá,

Estou tendo problemas com Win32Prn no xHarbour com a seguinte situação : Como tenho centenas de relatórios no meu sistema, quando migrei de clipper para xH, não converti um por um, como tinha funções genérica para gerar os relatórios criei dentro dessas funções uma que gera relatório utilizando essa classe apos ser gerado um arquivo DBF com os dados do relatorio. Só que de vez em quando em impressoras da mesma marca, simplesmente o mesmo relatorio sai desconfigurado. Ou seja em uma impressora HP Laser em um cliente funciona em outro o mesmo relatorio sai desconfigurado, torto, etc... Alguém sabe se pode ser versão do windows, DLL, ou o que ???

Abaixo as funções que uso para impressão :

Código: Selecionar todos

f
unction SENDPRINT()
*****************************************************
* Apresenta tela para escolha do Destino da Impressao
* OBS : Usa variavel global DEST
** Essa função é a chamada prinicipal do relatorio, todo relatório chama ela
*****************************************************
public oUSB := .F., ARQ_NEW
HB_BackGroundDel( nTask )
DEST = SelecPrint()
do case
   case lastkey()=27 .OR. DEST = "0"
        return(.f.)
   case DEST = "Monitor"
        *** Monitor ***
        abre_prn(.f.)
        return(.t.)
   case DEST = "Arquivo"
        *** Arquivo ***
        abre_prn(.t.)
        return(.t.)
   case DEST = "USB"
        *** USB ***
        oUSB := .T.
        abre_prn(.f.)
        return(.T.)
	OTHERWISE
        set print to &DEST
        if !impressora()
           return(.f.)
        endif
endcase
return(.t.)



function ABRE_PRN( GeraTXT )
****************************
* Fecha Arquivo de relatorio
* GeraTXT=Parametro que indica se gera(.f.) ou nao (.t.) arquivo
****************************
local ARQ_ANT
if empty( GeraTXT )
   GeraTXT = .F.
endif
ARQ_ANT = dbf()
public ARQ_DBF, ARQ_PRN
tela_ttt = savescreen( 0, 0, 24, 79 )
if !GeraTXT
   ARQ_DBF='C:\TEMP\PRN'+trim(left(vUSUARIO,4))
   ARQ_PRN='C:\TEMP\PRN'+trim(left(vUSUARIO,4)) + '.PRN'
   
	*** Apagando arquivo de transacao ***
   if file( 'C:\TEMP\PRN'+trim(left(vUSUARIO,4)) + '.DBF')
      ferase( 'C:\TEMP\PRN'+trim(left(vUSUARIO,4)) + '.DBF' )
   endif
   *** Abre o arquivo padrao do sistema ***
   if !netuse('STRU_PRN',.f.)
      return(.f.)
   endif
else
   ARQ_NEW = space(8)
   DIR_NEW = "C:\TEMP\" + space(30)
   quadro( '10','10','15','68',' Geracao de arquivo texto ','W+/B')
   @ 12,12 say '     Nome do arquivo ' get ARQ_NEW pict '@!'    valid !empty(ARQ_NEW)
   @ 13,12 say 'Diretorio de destino ' get DIR_NEW pict '@!S25' valid !empty(DIR_NEW)
   read
   DIR_NEW = alltrim(DIR_NEW)
   *** Verifica se o diretorio existe
   if !isDir( DIR_NEW ) .or. lastkey()=27
      msgAlert( 'O diretorio ' + DIR_NEW + ' NAO existe!')
      ARQ_PRN = '#'      // Sinaliza que nao foi gerado o arquivo
      if !empty(alltrim(ARQ_ANT))
         sele (ARQ_ANT)
      endif
      return(.f.)
   endif
   ARQ_NEW = alltrim(ARQ_NEW)
   if right( alltrim(DIR_NEW), 1 ) <> '\'
      DIR_NEW = alltrim(DIR_NEW) + '\'
   endif
   ARQ_DBF = alltrim(DIR_NEW) + alltrim(ARQ_NEW) + '.DBF'
   ARQ_PRN = alltrim(DIR_NEW) + alltrim(ARQ_NEW) + '.TXT'
   if lastkey() == 27
      if !empty(ARQ_ANT)
         sele (ARQ_ANT)
      endif
      ARQ_PRN = "#"  // Sinaliza que nao foi gerado o arquivo
      return(.f.)
   endif
   *** cria estrutura para TXT ***
   VetorStru = {}
   aadd( VetorStru, { 'L1'       , 'C' ,150, 0 })
   aadd( VetorStru, { 'L2'       , 'C' , 01, 0 })
   aadd( VetorStru, { 'L3'       , 'C' , 01, 0 })
   aadd( VetorStru, { 'DT_BLOQ'  , 'D' , 08, 0 })
   aadd( VetorStru, { 'HORA_BLOQ', 'C' , 08, 0 })
   aadd( VetorStru, { 'MAQ_BLOQ' , 'C' , 10, 0 })
   aadd( VetorStru, { 'QUEMBLOQ' , 'C' , 15, 0 })
   aadd( VetorStru, { 'ROTINA'   , 'C' , 08, 0 })
   DbCreate('&ARQ_DBF',VetorStru)
   use (ARQ_DBF) alias DADOSPRN new exclu
endif
if select('DADOSPRN')>0
   if select('STRU_PRN')>0
      sele STRU_PRN
      use
   endif
   sele DADOSPRN
   zap
else
   copy stru to (ARQ_DBF)
   use
   *** Usa o ALIAS de DADOSPRN ***
   use (ARQ_DBF) alias DADOSPRN new exclu
endif
Restscreen( 0, 0, 24, 79, tela_ttt)
set conso off

set device to print
set printer to (ARQ_PRN)
if !empty(alltrim(ARQ_ANT))
   sele (ARQ_ANT)
endif
return(.t.)


function ClosePrint()
*******************************
* Encerra a sessao de impressao
*** Fecha relatorio e gera o arquivo para impressao
*******************************
do case
   case DEST = "Monitor"
        *** Monitor ***
        fecha_prn(.t.)
   case DEST = "Arquivo"
        *** Arquivo ***
        if ARQ_PRN = "#"
           sele STRU_PRN
           use
           retu
        endif
        fecha_prn(.f.)

        use (ARQ_DBF) alias DADOSPRN new exclu
        sele DADOSPRN
        centra_msg(24,"EXPORTANDO ARQUIVO: " + ARQ_PRN)
        do while !eof()
           repla L1 with RemoveMarcas( L1, .F. ),;
                 L2 with RemoveMarcas( L2, .F. ),;
                 L3 with RemoveMarcas( L3, .F. )
           skip
        enddo
        go top
        vArqTxt := fcreate( ARQ_PRN , 0)
        if ferror()<>0
           msgalert('Erro na criacao do arquivo...')
        endif
        do while !eof()
           vLINHATXT = iif(recno()=1,chr(20),'')+rtrim(L1)+chr(13)+chr(10)
           fwrite( vArqTxt, @vLINHATXT, len( vLINHATXT ) )
           skip
        enddo
        fclose(vArqTXT)
        *** Tirar espaco em branco final de cada linha ***
        *** copy to (ARQ_PRN) fields L1 sdf
        *** use
        MsgAlert("Foi gerado o relatorio em: " + ARQ_PRN, "Atencao" )
        sele DADOSPRN
        use
   Other
        Desl_Imp()
endcase
return(.t.)



function FECHA_PRN( GeraTXT )
****************************
* Fecha Arquivo de relatorio
* GeraTXT=Sinaliza se gera (.f.) ou nao (.t.) um arquivo texto
****************************
private VT1[3], VT2[3], VT3[3], TELA_ANT, COR_ANT
F9:=F10:=.t.
vTEXTO=spac(20)
if pcount()=0
   GeraTXT=.t.
endif
if 'LPT' $ DEST
    set print off
    set printer to
endif
set device to scree
set conso on
*** MSGALERT('CONTEUDO DE DEST='+DEST)
if select('DADOSPRN')=0
   msgalert('O Arquivo de relatorio NAO foi aberto provavel erro na criacao...')
   return(.f.)
endif
sele DADOSPRN
appe from (ARQ_PRN) sdf
go top
TELA_ANT=savescreen(04,00,23,79)
COR_ANT =setcolor()
PROG='Edicao      '
** preenche os vetores com os nome dos campos a serem mostrados
VT1[01]='L1'
VT1[02]='L2'
VT1[03]='L3'
** Mascaras de formatacao
VT2[01]=''
VT2[02]=''
VT3[03]=''
** Cabecalhos
VT3[01]=''
VT3[02]=''
VT3[03]=''
limpa(24)
setcolor('GR+/B')
@ 04,00 to 22,79
@ 22,01 say '  <A-Z>=Busca Texto   <Alt+L>=Continua Busca   <Alt+P>=Imprime  <ESC> P/Sair '
dbedit(05,01,21,78,VT1,'FUNCPRN',VT2,VT3,'','³')
restscreen(04,00,23,79,TELA_ANT)
setcolor(COR_ANT)
sele DADOSPRN
use
ALTF1=.F.
F9:=F10:=.f.
return(.t.)


function FUNCPRN(MODE,PONTEIRO,PROGRAMA)
*******************************
* FUNCAO p/DBEDIT EM RELATORIOS
*******************************
static GETLIST:={}
local COR_ANT, TELA_ANT, ARQ_ANT, TEXTO
priva POS_CURSOR,REGISTRO
public oUSB := .F.
POS_CURSOR=VT1[PONTEIRO]
Barra_rol( 05, 21, 79 , recno(), recco())
do case
   case MODE=0
        return(1)
   case MODE=3
        mensagem('Arquivo SEM registro...')
        return(1)
   case lastkey()=281
        *** <ALT + P> = Imprime o relatorio da tela ***
        COR_ANT=setcolor()
        save scree to TELA_ANT
        ESCOLHA=MsgAlert('Que tipo de relatorio ? ','Atencao',{' Completo ',' A partir daqui '})
        **ONDE   =MsgAlert('Confirma Impressao do Relatorio ? ','Atencao',{' Retorna ',' LPT1 ',' LPT2 ','USB'})
        ONDE = SelecPrint()
        do case
           case ONDE = "0"
                resto scree from TELA_ANT
                setcolor(COR_ANT)
                return(2)
           case ONDE = "Monitor"
           case ONDE = "Arquivo"
           case ONDE = "USB" 
                oUSB := .T.
           otherwise
                setcolor(COR_ANT)
                resto scree from TELA_ANT
                set print to &ONDE
                ?? chr(15)
        endcase
        if ESCOLHA=1
           go top
        endif
        do while !eof()
           @ prow(),00 say L1+L2+L3
           skip
        enddo
        Desl_Imp()
        resto scree from TELA_ANT
        setcolor(COR_ANT)
        return(2)

   case lastkey()>=65 .and. lastkey()<=122 .or. lastkey()>=48 .and. lastkey()<=57
        set curs on
        COR_ANT=setcolor()
        save scree to TELA_ANT
        quadro('10','15','14','65',' Consulta ','W+/G+')
        limpa(24)
        centra_msg(24,'Digite o Texto a Ser Consultado ou <ESC> para retornar')
        @ 12,17 say 'Texto a Ser Procurado Äþ ' get vTEXTO
        read
        setcolor(COR_ANT)
        if lastkey()=27
           resto screen from TELA_ANT
           return(1)
        endif
        NAOACHOU=.f.
        loca for trim(vTEXTO) $ L1
        if eof()
           NAOACHOU=.t.
           loca for trim(vTEXTO) $ L2
           if eof()
              NAOACHOU=.t.
              loca for trim(vTEXTO) $ L3
              if eof()
                 NAOACHOU=.t.
              else
                 NAOACHOU=.f.
              endif
           else
              NAOACHOU=.f.
           endif
        endif
        if NAOACHOU
           mensagem('Dados informado NAO localizado...')
        endif
        resto screen from TELA_ANT
        return(2)
   case lastkey()=294
        **** Continua busca ***
        cont
        return(2)
   case lastkey()=27
        return(0)
   otherwise
        * continua execucao
        return(1)
endcase
return(1)


function SelecPrint()
************************************
* Funcao para selecao de impressoras
************************************
LOCAL vaPrinter, i, vnAch, acPrinter, cRet, cCor,;
      acPrn, acPrnSel, vcTela
PUBLIC xPrinter
cCor := setcolor()

*** Pego o nome da impressora padrao
acPrinter := GetDefaultPrinter()
*** Pego a lista de todas a impressoras configuradas
vaPrinter := GetPrinters()
*** Mantenho a padrao para retorno
cRet := acPrinter

*** Se nao tem nenhuma, mostra mesagem, mas Continua
If Empty( vaPrinter )
	msgalert("Nenhuma impressora instalada")
EndIf

*** Preparo os arrays
vaPrinter := GetPrinters(.t.)
acPrn     := {}
acPrnSel  := {}

*** Laco para montar o array com
*** todas as impressoras
For i:= 1 TO Len(vaPrinter)
    if acPrinter = vaPrinter[i,1]  // Se for a padrao
       *** Coloca um (P) antes do nome
    	 AADD(acPrn,"(P) "+vaPrinter[i,1]+' em '+vaPrinter[i,2])
    else
       *** Armazena as outras
	    AADD(acPrn,"    "+vaPrinter[i,1]+' em '+vaPrinter[i,2])
    endif
    *** Monta um array secundario
    AADD(acPrnSel,vaPrinter[i,1])
Next
*** Adiciona itens extras aos arrays
AADD(acPrn,"    "+"(Monitor)")
AADD(acPrnSel,"Monitor")
AADD(acPrn,"    "+"(Arquivo)")
AADD(acPrnSel,"Arquivo")

*** Monta a janela para selecao
vcTela = savescreen(09, 14, 21, 67)
setcolor("n/w,w+/g")
@ 09, 14 clear to 21,67
@ 09, 14 say " Sele‡Æo de impressora                                " color "w+/r"
@ 21, 14 say " " +chr(24)+chr(25)+": Movimenta | Enter: Seleciona |  ESC: Cancelar    " color "w+/Gr"
vnAch = achoice(10,15,20,66,acPrn,,"myFuncao")
restscreen(09, 14, 21, 67,vcTela)
*** Selecionou ou pressionou ESC
if lastkey() = 13
	*** Se for USB ou de REDE ***
	if "USB" $ acPrn[vnAch] .or. "ET0" $ acPrn[vnAch]
	   cRet := "USB"
	else
	*** Demais impressoras
      cRet := acPrnSel[vnAch]
   endif
else
   *** Abandonou
   cRet := "0"
endif
if lastkey() <> 27
   if ! acPrnSel[vnAch] $ "Monitor|Arquivo"
  	   PrintOnLine(acPrnSel[vnAch])
   endif
   *** Passa o nome da impressora para uma variavel publica
   *** para ser utilizada depois
   xPrinter = acPrnSel[vnAch]
   *** msgalert('impressora retornada '+xPrinter)
else
   cRet = "0"
endif
Setcolor(cCor)
Return(cRet)



function myFuncao()
****************************
* Funcao de apoio do achoice
****************************
Local vnRetorno
do case
   case lastkey() = 19 .or. lastkey() = 4
        vnRetorno := 2
   case lastkey() = 13 .or. lastkey() = 16
        vnRetorno := 1
   case lastkey() = 27
        vnRetorno := 0
   otherwise
        vnRetorno := 2
endcase
return(vnRetorno)



Function PrintOnLine(vcPrintOn)
*****************************************
* Funcao para verificar o
* status da impressora
* selecionada, local ou em rede
*****************************************
local nStatus := PrintStat(vcPrintOn)
If nStatus > 0
   MsgAlert("Condicao da impressora: " + IsImpressora(vcPrintOn))
endif
Return(.t.)


function IsImpressora( QuePrinter )
*****************************************
* Funcao para retornar a mesnagem de
* status da impressora
*****************************************
LOCAL nStatus
nStatus := PrintStat( QuePrinter )
if     nStatus <        1 ; return "OK"
elseif nStatus =        1 ; return "Impressora Pausada"
elseif nStatus =        2 ; return "Impressora com Erro"
elseif nStatus =        4 ; return "Impressora Deletando"
elseif nStatus =        8 ; return "Impressora em Modo Bandeja"
elseif nStatus =       16 ; return "Impressora Sem Papel"
elseif nStatus =       32 ; return "Impressora em Modo Manual"
elseif nStatus =       64 ; return "Impressora com Problema no Papel"
elseif nStatus =      128 ; return "Impressora OffLine"
elseif nStatus =      256 ; return "Impressora com IO Ativo"
elseif nStatus =      512 ; return "Impressora Ocupada"
elseif nStatus =     1024 ; return "Impressora Imprimindo"
elseif nStatus =     2048 ; return "Impressora Memoria Lotada"
elseif nStatus =     4096 ; return "Impressora Nao Instalada"
elseif nStatus =     8192 ; return "Impressora Aguardando"
elseif nStatus =    16384 ; return "Impressora Processando"
elseif nStatus =    32768 ; return "Impressora Inicializando"
elseif nStatus =    65536 ; return "Impressora em Atencao"
elseif nStatus =   131072 ; return "Impressora Toner Baixo"
elseif nStatus =   262144 ; return "Impressora Sem Toner"
elseif nStatus =   524288 ; return "Impressora PAGE_PUNT"
elseif nStatus =  1048576 ; return "Impressora Intervencao do Usuario"
elseif nStatus =  2097152 ; return "Impressora Sem Memoria"
elseif nStatus =  4194304 ; return "Impressora Tampa Aberta"
elseif nStatus =  8388608 ; return "Impressora Servidor Desconhecido"
elseif nStatus = 16777217 ; return "Impressora POWER_SAVE"
endif
return(nil)


Function PrintUSB(DocPrinter)
******************************************
* Funcao para impressao em impressoras USB
*
* Retorna .t. se bem sucedido
*         .f. se falhou
******************************************

/******************************************
 Tabela para tamanho de papel
 LETTER 1 US  Letter format 8 1/2 x 11 inch
 LEGAL  5 US  Legal  format 8 1/2 x 14 inch
 A3     8 DIN A3     format 297 x 420 mm
 A4     9 DIN A4     format 210 x 297 mm

 Tabela para oPrinter:bold
 DONTCARE     0    // THIN       100
 EXTRALIGHT 200    // LIGHT      300
 NORMAL     400    // MEDIUM     500
 SEMIBOLD   600    // BOLD       700
 EXTRABOLD  800    // HEAVY      900

 Tabela de Set de Caracteres
 ANSI_CHARSET        0
 DEFAULT_CHARSET     1  (default)
 SYMBOL_CHARSET      2
 SHIFTJIS_CHARSET    128
 HANGEUL_CHARSET     129
 HANGUL_CHARSET      129
 GB2312_CHARSET      134
 CHINESEBIG5_CHARSET 136
 OEM_CHARSET         255
 JOHAB_CHARSET       130
 HEBREW_CHARSET      177
 ARABIC_CHARSET      178
 GREEK_CHARSET       161
 TURKISH_CHARSET     162
 VIETNAMESE_CHARSET  163
 THAI_CHARSET        222
 EASTEUROPE_CHARSET  238
 RUSSIAN_CHARSET     204

 Tabela de Constantes de formatação de impressora
 ON_F20     = 'M'+chr(15)
 OFF_F20    = 'P'+chr(18)
 ON_EXPANDE = chr(14)+chr(15)
 ON_18      = chr(18)
 ON_20X15   = chr(20)+chr(15)
 ON_15      = chr(15)
 ON_12      = chr(12)+chr(13)
 ON_NEGRO   = chr(27)+'E'
 OFF_NEGRO  = chr(27)+'F'
*******************************************/
Local mDocPrint, vDocPrint, nA, nLand, nLin := 1, nTamPag, cMsg, ;
      vPosi, nTamLin, ON_F20, OFF_F20, ON_EXPANDE, ON_18,        ;
      ON_20X15, ON_15, ON_12

Private oPrinter

oPrinter := Win32Prn():new( xPrinter )   // Crio a instancia da impressora

*** Leio o arquivo gerado do diretorio temp ou outro qualquer
*** mDocPrint = MemoRead(DocPrinter)
mDocPrint = ''


*** Verifica se vai imprimir em Retrato (nLand=.f.)
*** ou Paisagem (nLand=.t.)
nLand   := .f.
nTamLin := 229
nTamPag := 64 // 64 Linhas em modo Retrato ou 45 em modo Paisagem

ON_F20     := 'M'+chr(15)
OFF_F20    := 'P'+chr(18)
ON_EXPANDE := chr(14)+chr(15)
ON_18      := chr(18)
ON_20X15   := chr(20)+chr(15)
ON_15      := chr(15)
ON_12      := chr(12)+chr(13)
ON_NEGRO   := chr(27)+'E'
OFF_NEGRO  := chr(27)+'F'

*** Mostra mensagem no rodape
cMsg := iif(nLand,"Imprimindo em modo Paisagem","Imprimindo..")
nA   := len(cMsg)
nA   := int((80-nA)/2)
@ 24, nA say cMsg color "gr+/n"

oPrinter:landscape := nLand
oPrinter:formType  := 9           // Papel A4 - Ver tabela acima
oPrinter:copies    := 1           // Numero de copias
*** oPrinter:charSet( 0 )         // Ver tabela acima

*** Cria dispositivo de impressao
If .not. oPrinter:create()
   MsgAlert( "Nao foi possivel criar o dispositivo de impressao" )
   return(.f.)
EndIf

*** Criar trabalho de impressao
*** MSGALERT('DOCPRINTER='+DOCPRINTER)
If .not. oPrinter:startDoc( DocPrinter ) // Encarrega o spooler para comecar com um novo documento
   MsgAlert( "Nao foi possivel criar o documento" )
   return(.f.)
EndIf

*** Cria a fonte padrão
oPrinter:setfont("Courier", 10, 14)  // Expandido
oPrinter:bold( 600 )

vPosi := 1
*** Laco para imprimir linha por linha
sele DADOSPRN
go top
for nA := 1 to recco()
	 vDocPrint := L1+L2+L3
    vPosi     := vPosi + 229 + 1

    *** Formata a Fonte de Caracteres da Impressora
    If ON_F20 $ vDocPrint    // Compacta   'M'+chr(15)
       oPrinter:setfont("Courier",6.5,22)
       oPrinter:bold( 0 )
       vDocPrint := StrTran(vDocPrint,ON_F20,"")
    endif

    If OFF_F20 $ vDocPrint   // Descompacta   'P'+chr(18)
       oPrinter:setfont("Courier",6.5,18)
       oPrinter:bold( 0 )
       vDocPrint := StrTran(vDocPrint,OFF_F20,"")
    Endif

    If ON_15 $ vDocPrint     // Muito Compactado - chr(15)
       oPrinter:setfont("Courier",6.5,22)
       oPrinter:bold( 0 )
    EndIf

    If ON_18 $ vDocPrint     // Compactado  - chr(18)
       oPrinter:setfont("Courier",8,12)
       oPrinter:bold( 0 )
    EndIf

    If ON_20X15 $ vDocPrint .or.; // Compactado - chr(20)+chr(15)
       ON_NEGRO $ vDocPrint
       vDocPrint := StrTran(vDocPrint,ON_NEGRO,"")		 
		 oPrinter:setfont("Courier",6.5,18)
       oPrinter:bold( 200 )
    EndIf

    If ON_12 $ vDocPrint      // ON_12 - chr(12)+chr(13) = EJECT
       vTexto    := substr(vDocPrint,1,at(ON_12,vDocPrint)-1)  // Imprime somente ate ao CR
       vDocPrint := substr(vDocPrint,at(ON_12,vDocPrint)+1)    // Guarda o restante da linha
       vTexto    := RemoveMarcas(vTexto)
       oPrinter:textOut(rTRIM(vTexto))                         // Imprime a linha ate o CR
       oPrinter:newPage()
       nLin      := 1
       If ON_EXPANDE $ vDocPrint // Expandido - chr(14)+chr(15)
          oPrinter:setfont("Courier",10,14)
          oPrinter:bold( 600 )
       endif
    EndIf

    If ON_EXPANDE $ vDocPrint // Expandido - chr(14)+chr(15)
       oPrinter:setfont("Courier",10,14)
       oPrinter:bold( 600 )
    Endif
    *** Remove todo e qualquer caractere especial
    *** menor que 32 ou maior que 125 (asc)
    vDocPrint := RemoveMarcas(vDocPrint)

    oPrinter:textOut(rTRIM(vDocPrint)) // Imprime a linha
    oPrinter:newLine() // Insere uma nova linha

    oPrinter:setfont("Courier",6.5,22)
    oPrinter:bold( 0 )

    *** Verifica se chegou no final da pagina
    nLin ++
    if nLin > nTamPag
       nLin := 1
       oPrinter:newPage()  // Salta a página - eject
    endif

	 *** coloquei para testar com DBF
	 skip 
next
*** Envia saida para impressora
oPrinter:endDoc()

*** Encerra a impressao e destroi o objeto
oPrinter:destroy()
Set Printer To
Return(.t.)


Function RemoveMarcas(mTexto)
*****************************
* Remove caracteres especiais
* Retorna uma string sem
* os caracteres especiais
*****************************
Local vT, vRetornaTexto, vTemp
vRetornaTexto := ''
for vT := 1 to len(mTexto)
    vTemp = substr( mTexto, vT, 1 )
    if asc(vTemp) <= 31 .or. asc(vTemp) >= 126
       loop
    endif
    vRetornaTexto := vRetornaTexto + vTemp
next
Return(vRetornaTexto)





xHarbour 1.2.3 Simplex / xDev 0.70 / LetoDB 2.15b37 / HWGUI 2.17 / xDesigner (LF Basso)
jcdatrindade
Usuário Nível 1
Usuário Nível 1
Mensagens: 9
Registrado em: 13 Mai 2011 10:06
Localização: Araxa / MG

Win32Prn no Harbour

Mensagem por jcdatrindade »

Amigo Sygecon

Devo ganhar o trofeu "Pá de Ouro" ao desenterrar esse tópico.

tô tendo probllema em portar do xHarbour 1.2.1 para o Harbour 3.0
justamente com o win32prn

tá dando esse erro na linkedicao

Compiling: pedidos.hbp...
hbmk2: Linkando... pedidos.exe
Error: Unresolved external '_HB_FUN_GETPRINTERS' referenced from C:\DRIVE_E\ADMIN\ADM\.HBMK\WIN\BCC\DISPREL.OBJ
Error: Unresolved external '_HB_FUN_GETDEFAULTPRINTER' referenced from C:\DRIVE_E\ADMIN\ADM\.HBMK\WIN\BCC\DISPREL.OBJ
Error: Unresolved external '_HB_FUN_WIN_PRN' referenced from C:\DRIVE_E\ADMIN\ADM\.HBMK\WIN\BCC\DISPREL.OBJ
Error: Unresolved external '_HB_FUN_FIELDSIZE' referenced from C:\DRIVE_E\ADMIN\ADM\.HBMK\WIN\BCC\ADM1601.OBJ
hbmk2: Erro: Executando linkeditor. 2
0 Files, 0 Warnings, 4 Errors
Compile time: 18.44s Link time: 0s Total time: 18.58s

já acrescentei as libs conforme você falou e o erro perciste

se bem entendi as libs são inseridas na compilação ok?

aguardo e obrigado!!!
Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7929
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

Win32Prn no Harbour

Mensagem por Itamar M. Lins Jr. »

Ola!

GETPRINTERS => win_printerList()
GETDEFAULTPRINTER => win_printerGetDefault()
WIN_PRN => oPrn := win_prn():New(cPrint)

Fieldsize eu não achei.

Saudações,
Itamar M. Lins Jr.
Saudações,
Itamar M. Lins Jr.
Avatar do usuário
Toledo
Administrador
Administrador
Mensagens: 3133
Registrado em: 22 Jul 2003 18:39
Localização: Araçatuba - SP
Contato:

Win32Prn no Harbour

Mensagem por Toledo »

Itamar M. Lins Jr. escreveu:Fieldsize eu não achei.
Acho que tem na lib HBCT do Harbour.

Abraços,
Toledo - Clipper On Line
toledo@pctoledo.com.br
Harbour 3.2/MiniGui/HwGui
Faça uma doação para o fórum, clique neste link: http://www.pctoledo.com.br/doacao
jcdatrindade
Usuário Nível 1
Usuário Nível 1
Mensagens: 9
Registrado em: 13 Mai 2011 10:06
Localização: Araxa / MG

Win32Prn no Harbour

Mensagem por jcdatrindade »

Valeu pessoal

Funcionou beleza.

Agora, é meio fora desse topico mas tô precisando de um parametro para forçar a recompilacao de tudo

no hbmake eu usava o parametro /ex

no hbmk2 eu nao sei.


valeu
Avatar do usuário
Toledo
Administrador
Administrador
Mensagens: 3133
Registrado em: 22 Jul 2003 18:39
Localização: Araçatuba - SP
Contato:

Win32Prn no Harbour

Mensagem por Toledo »

Use o -rebuild ou delete a pasta .hbmk que está na pasta do seu programa.

Abraços,
Toledo - Clipper On Line
toledo@pctoledo.com.br
Harbour 3.2/MiniGui/HwGui
Faça uma doação para o fórum, clique neste link: http://www.pctoledo.com.br/doacao
jcdatrindade
Usuário Nível 1
Usuário Nível 1
Mensagens: 9
Registrado em: 13 Mai 2011 10:06
Localização: Araxa / MG

Win32Prn no Harbour

Mensagem por jcdatrindade »

Obrigado mestre

tópico resolvido
Responder