Win32prn() só tem me dado dor de cabeça

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

Moderador: Moderadores

lugab
Colaborador
Colaborador
Mensagens: 843
Registrado em: 19 Mai 2009 15:58

Win32prn() só tem me dado dor de cabeça

Mensagem por lugab »

Boa tarde, amigos.

Além dos velhos problemas de tamanho de caractere, que varia de acordo com a marca da impressora usada e que, por sianl, eu já desisti de procurar solução, pois todas as ajudas aqui obtidas não deram resultado, surgiu agora um outro problema:

Estou imprimindo na orientação paisagem, usando: oPrinter:Landscape:= .T.

O resultado é : A primeira página do relatório imprime certinho, com caracteres tamanho nomal, mas da segunda página em diante, os caracteres diminuem de tamanho e os dados são impressos em menos da metade da página, de forma que só com um óculos a gente tem condição de ler a maldita página.


Agora, só me resta pedir ajuda a vcs. Abaixo , o meu código

Código: Selecionar todos

*----------------------------------------
Function impWinPrint(cPrinter,xarqtxt)
*-----------------------------------------
#define DMPAPER_A4                   9  // A4 210 x 297 mm 
LOCAL oPrinter:= Win32Prn():New(cPrinter), aFonts, x, nColFixed,nColTTF, nColCharSet
LOCAL ncarpol, i, nHandle, cString
If Paisagem  && parametro q orienta se imprime retrato ou paisagem...
   oPrinter:Landscape:= .T. // .T.=HORIZONTAL
   Paisagem=.f.
else
   oPrinter:Landscape:= .F. // .T.=HORIZONTAL
Endif

oPrinter:FormType := DMPAPER_A4
oPrinter:Copies   := 1
oPrinter:SetPrintQuality(2) // qualidade da impress’o 1 rascunho 2 normal 3 media 4melhor
oPrinter:SetFont("Courier New",12,12)

IF  !oPrinter:Create()
    Aviso(" Impressora näo pode ser criada !!! ")
    return
else
   IF !oPrinter:startDoc("TPRINT("+xarqtxt+")")
      Aviso("StartDoc() Falha na Impressora !")
      oPrinter:destroy()
      return
   endif
endif

nHandle:= FOPEN( xarqtxt ) // READ
cString:= ""
xmaxLen:= 0
FOR i:= 1 TO 10
    IF gfreadline( @cString, nHandle )
       IF LEN( cString ) > xmaxLen
          xmaxLen:= LEN( cString )
       ENDIF
    ELSE
       EXIT
    ENDIF
NEXT

IF xmaxLen <= 85
    ncarpol:= 11
ELSEIF xmaxlen <= 100
    ncarpol:= 13
ELSEIF xmaxlen <= 136
    ncarpol:= 18
ELSEIF xmaxlen <= 160
    ncarpol:= 21
ENDIF

oPrinter:SetFont("Courier New",12,12)
fSeek( nHandle, 0 )

cString:= ""
xprow:=0
endof_file=.f.
while !endof_file
    gfreadline( @cString, nHandle )
    IF ( xpos:= AT( CHR(12), cString ) ) > 0
       cString:= LEFT( cString, xpos-1 ) + SUBS( cString, xpos + 1, LEN( cString ) )
    ENDIF
    oPrinter:TextOut(cString)
    oPrinter:NewLine()
    IF xpos > 0
       oPrinter:NewPage()
       oPrinter:SetFont('Courier New',,ncarpol)
       oPrinter:NewLine()
       xprow:=0
    ELSE
       xprow++
    ENDIF
enddo

oPrinter:EndDoc()
oPrinter:Destroy()

fclose(nHandle)

RETURN(NIL)
Agradeço , de verdade, qq tentativa de ajuda...

Gabriel

PS: Pensando em me livrar de vez do win32prn(), eu gostaria de saber se existe opção de imprimir com orientação paisagem, usando o PrintFileRaw()
Editado pela última vez por Toledo em 04 Jun 2010 19:12, em um total de 1 vez.
Razão: Mensagem editada para colocar a tag [ code ]<br>Veja como utilizar esta tag: http://www.pctoledo.com.br/forum/faq.php?mode=bbcode#f2r1
lugab
Avatar do usuário
Toledo
Administrador
Administrador
Mensagens: 3133
Registrado em: 22 Jul 2003 18:39
Localização: Araçatuba - SP
Contato:

Re: Win32prn() só tem me dado dor de cabeça

Mensagem por Toledo »

Gabriel, dei uma olhada neste seu código e notei o seguinte:

Antes de começar a fazer a impressão você seta a fonte em:

Código: Selecionar todos

oPrinter:SetFont("Courier New",12,12)
fSeek( nHandle, 0 )
Ai, quando passa para a segunda página, você coloca:

Código: Selecionar todos

oPrinter:NewPage()
oPrinter:SetFont('Courier New',,ncarpol)
oPrinter:NewLine()
Pelo que pude notar, a variável ncarpol pode variar de 11 a 21. Então acho que o problema está ai.

Faça um teste, delete a linha oPrinter:SetFont('Courier New',,ncarpol), e veja o que acontece.

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
Avatar do usuário
gvc
Colaborador
Colaborador
Mensagens: 1270
Registrado em: 23 Ago 2005 10:57

Re: Win32prn() só tem me dado dor de cabeça

Mensagem por gvc »

Qual o problema com posicionamento vc esta tendo?
Eu estou usando posicionamento em mm e esta funcionando muito bem, obrigado.
Tb estou imprimindo várias páginas de relatório e não perde nada.
É claro que +3000 páginas com bitmap, formatação e gerando em PDF pindura a máquina mesmo. Mas acho que dá para sobreviver com isso alguns dias.

Veja o que o Toledo postou e avise se ainda tiver problemas.

Ah! Se é só para imprimir texto usando PrintFileRaw(), vc pode usar o NODOSIMP. Gere o arquivo texto e chame ele para imprimir. Estou usando a alguns anos e não tenho reclamação.
"TRS-80/Sincler/Apple/PC - Clipper Winter 85, tlink 1.0 [pc 10 MHz - 640K] {NEZ 8000 2Kb RAM}"
{POG - Programação Orientada a Gambiarra}
lugab
Colaborador
Colaborador
Mensagens: 843
Registrado em: 19 Mai 2009 15:58

Re: Win32prn() só tem me dado dor de cabeça

Mensagem por lugab »

Oi Toledo e GvC. Obrigado a ambos , pelo help.

Eu cometi um erro e postei o código original, que peguei aqui no fórum . Este código errado q postei já estava no word (e aproveitei e dei um ctrl+c) e eu nem lembrava q ele não é exatamente o que estou usando.

Na verdade no código que uso atualmente no meu fonte (que não da pra dar um ctrl+c) a linha desta variável ganhou um remarks, e nem fui eu q descobriuq estava errada ( pois eu não manjo nada da linguagem deste código ) Foi o próprio autor que postou o código inteiro aqui no fórum, já com o remarks nesta linha.

NA verdade, eu desisti de imprimir com orientação Paisagem. Foi só uma tentativa frustrada de fugir das variações de tamanho de fonte , qdo imprime com o win32prn() em impressoras de fabricantes diferentes.

Meu maior e mais velho problema com o Win32prn(), Toledo e GVT, sem dúvida alguma , continua sendo o de imprimir um mesmo relatório, que variam o tamanho dos caracteres de miudinho (q ninguém consegue ler) ,a miúdo, a meio-miúdo e a tamanho médio, a depender da impressora pra onde o usuário enviar a impressão, sem que eu ,nem ninguém tenha feito qq alteralção no programa e , nem muito menos nessa malfadada rotina do win32prn().

Quando se imprime na Samsumg a dimensão das letras é uma, na Epson jato de tinta é outro tamanho, na Laser HP tmbém já é outro.

Já imprimindo nas matriciais, que eu usa o Printfileraw() , o padrão nunca muda, seja imprimindo na Lx300 como na FX 1170.

Vou é fazer o q o GVc sugeriu e procurar alternativas foras do Xharbour , tipo o NODosImp, pra tentar imprimir de forma padronizada..

Grato,

Gabril
lugab
Avatar do usuário
gvc
Colaborador
Colaborador
Mensagens: 1270
Registrado em: 23 Ago 2005 10:57

Re: Win32prn() só tem me dado dor de cabeça

Mensagem por gvc »

Eu estou usando o WIN32PRN e esta funcionando.
Se puder, mande o fonte do seu relatório para eu dar uma olhada nele. (gvcortez@uol.com.br)
Se puder mandar alguns dados que ele usar para imprimir vai ajudar. Pode mascarar as informações. Só preciso testar a impressão.

Só lembrando que tanto o WIN32PRN como o NODOSIMP é para imprimir relatório em modo gráfico. Não fica muito bom para imprimir em matriciais. (fica muito lento desenhar as linhas).
"TRS-80/Sincler/Apple/PC - Clipper Winter 85, tlink 1.0 [pc 10 MHz - 640K] {NEZ 8000 2Kb RAM}"
{POG - Programação Orientada a Gambiarra}
Avatar do usuário
gvc
Colaborador
Colaborador
Mensagens: 1270
Registrado em: 23 Ago 2005 10:57

Re: Win32prn() só tem me dado dor de cabeça

Mensagem por gvc »

Tente compilar este usando o HBMAKE.
Ah! Eu sempre marco a opção de Info Debug.

Código: Selecionar todos

#define FORM_A4 9
#define RGB( nR,nG,nB ) ( nR + ( nG * 256 ) + ( nB * 256 * 256 ) )
#define PS_SOLID   0
#define BLACK           RGB( 0x0 ,0x0 ,0x0 )
#define BLUE            RGB( 0x0 ,0x0 ,0x85 )
#define GREEN           RGB( 0x0 ,0x85,0x0 )
#define CYAN            RGB( 0x0 ,0x85,0x85 )
#define RED             RGB( 0x85,0x0 ,0x0 )
#define MAGENTA         RGB( 0x85,0x0 ,0x85 )
#define BROWN           RGB( 0x85,0x85,0x0 )
#define WHITE           RGB( 0xC6,0xC6,0xC6 )


function main

local cprinter, oprinter, linha

cprinter := getdefaultprinter()
oprinter:= win32prn():new(cprinter)
oPrinter:Landscape:= .F.
oPrinter:FormType := FORM_A4
oPrinter:Copies   := 1
oPrinter:Create()
oPrinter:startDoc()

oprinter:setPen(0, 5)

oPrinter:SetFont('Courier New', 20, {1, 15}, 0, .F., .F.)

// Cabeçalho
imp2_linha(oprinter, 45, 40, 'COMPROVANTE DE RENDIMENTOS PAGOS E DE RETENÇÃO DE IMPOSTO DE RENDA NA FONTE - 2009')

oPrinter:SetFont('Courier New', 8, {1, 20}, 0, .F., .F.)

// Identificação dos Blocos de Quadros

imp2_linha(oprinter, 47, 90, '(VALORES EXPRESSOS EM REAIS)')
imp2_linha(oprinter, 50, 10, '1 - Dados da Fonte Pagadora')
imp2_linha(oprinter, 68, 10, '2 - Pessoa Física Beneficiária dos Rendimentos')
imp2_linha(oprinter, 86, 10, '3 - Rend. Tributáveis, Deduções e Imposto Retido na Fonte')
imp2_linha(oprinter, 120, 10, '4 - Rend. Isentos e Não Tributáveis')
imp2_linha(oprinter, 154, 10, '5 - Rend. Sujeito à Tributação Exclusiva (Rend.Líquido)')
imp2_linha(oprinter, 164, 10, '6 - Pensionista')
imp2_linha(oprinter, 197, 10, '7 - Informações Complementares')
imp2_linha(oprinter, 244, 10, '8 - Rend. Tributáveis com Exigibilidade Suspensa (*)')
imp2_linha(oprinter, 260, 10, '9 - Observações')

oPrinter:SetFont('Courier New', 10, {1, 15}, 0, .F., .F.)

// 1
imp2_linha(oprinter, 56, 12, 'CNPJ: ')
imp2_linha(oprinter, 63, 12, 'ENDEREÇO: ')

// 2
imp2_linha(oprinter, 74, 12, 'CPF:')
imp2_linha(oprinter, 81, 12, 'NOME:')

// 3
imp2_linha(oprinter, 91, 12, 'TOTAL DE RENDIMENTOS (INCLUSIVE FÉRIAS)')
imp2_linha(oprinter, 97, 12, 'CONTRIBUIÇÃO PREVIDENCIÁRIA OFICIAL')
imp2_linha(oprinter, 103, 12, 'CONTRIB.PREVIDENC PRIVADA, FUNDO DE APOSENT.PROGR.IND. - FAPI E AO MONTEPIO CIVIL')
imp2_linha(oprinter, 109, 12, 'PENSÃO ALIMENTÍCIA')
imp2_linha(oprinter, 115, 12, 'IMPOSTO DE RENDA RETIDO NA FONTE')

oprinter:enddoc(.F.)
oprinter:destroy()

return(Nil)


***
***
***
function imp2_linha(oprinter, linha1, coluna1, frase)
local _linha1, _coluna1, _linha2, _coluna2

_linha1 := oprinter:mm_To_PosY(linha1)
_coluna1 := oprinter:mm_To_Posx(coluna1)

oprinter:textoutat(_coluna1, _linha1, frase)

return(Nil)
"TRS-80/Sincler/Apple/PC - Clipper Winter 85, tlink 1.0 [pc 10 MHz - 640K] {NEZ 8000 2Kb RAM}"
{POG - Programação Orientada a Gambiarra}
lugab
Colaborador
Colaborador
Mensagens: 843
Registrado em: 19 Mai 2009 15:58

Re: Win32prn() só tem me dado dor de cabeça

Mensagem por lugab »

Toledo e GVC, obrigado pelo interesse em me ajudar.

Vou mandar o código correto, dessa vez...

Grato,

Gabriel
Editado pela última vez por lugab em 19 Fev 2010 21:07, em um total de 1 vez.
lugab
lugab
Colaborador
Colaborador
Mensagens: 843
Registrado em: 19 Mai 2009 15:58

Re: Win32prn() só tem me dado dor de cabeça

Mensagem por lugab »

Toledo e GVC, aqui está o código exato. Postei aqui, pq deve haver mais aprendizes como eu, precisando de ajuda no uso do Win32prn()

Desculpem mesmo pelo meu erro anterior, ao colocar um código antigo, pois eu terminei confundindo o Toledo e atrapalhando vcs na hora da ajuda.

Este é o meu código atual, com esses 2 problemas :

1) O Win32prn() Não está comprimindo , apesar de eu ter tentado dezenas de combinacoes de oPrinter:Setfont.

2) Ele não mantém um padrão e muda as dimensões dos caracteres a cada nova marca de impressora usada, os caracteres diminuem ou aumentam de dimensão, por livre e espontânea vontade deste meu malfadado código.

Eis-lo.

Código: Selecionar todos

*-----------------------------
Rotina principal:
*-------------------
Set device to printer  
Set printer to C:\SIG.TXT
( aqui eu gero vabeçalho e linhas do arquivo Sig.Txt)
Public Comprimi:=.F. (.T. se deseja fontes comprimidos) ou .f.
Public Paisagem:=.T. (.T.se deseja orientação Paisagem) ou .f.
nomusu=”nome para a fila de impressão”

SelImp()  && aqui eu chamo Seleção de impressora que dispara a impressão
retu nil
*--------------
Func Selimp
*--------------
Local tela,resp,aimp,aimp2:={},i
Set printer off
Set printer to
Set devi to scree

If xGetImp()
   Auximp=alltrim(upper(aPrn[nPrn]))
   IF AT("LX",AUXIMP)>0 .OR. AT("FX",AUXIMP)>0
      ** Vai Imprimir na Matricial
      PrintFileRaw(aPrn[nPrn],"C:\SIG.TXT", TNOMUSU)
   Else	    
      ** Vai Imprimindo em Não Matricial
      ImpWinPrint(aPrn[nPrn],"C:\SIG.TXT")	 
   Endif
Endif	 
Retu nil


*----------------------------------------
FUNCTION impWinPrint(cPrinter,xarqtxt)
*-----------------------------------------

***** #define DMPAPER_A4                   9  // A4 210 x 297 mm 

LOCAL oPrinter:= Win32Prn():New(cPrinter), aFonts, x, nColFixed,nColTTF, nColCharSet
LOCAL ncarpol, i, nHandle, cString


oPrinter:FormType := 9
oPrinter:Copies   := 1
oPrinter:SetPrintQuality(2) // qualidade da impressao 1=rascunho 2=normal 3=media 4=melhor, -1=sugestão do fórum do Toledo


If Comprimi ( letra comprimida e orientacao retrato NAÕ ESTÁ COMPRIMINDO NADA)
   oPrinter:Landscape:= .F.  && retrato
   oPrinter:SetFont("Courier New",13,{3,-50},0,.F.,.F.) &&(NAO está Comprimindo)
Else   
   If Paisagem
      oPrinter:SetFont('Courier New',,2,2)
      oPrinter:Landscape:= .T. && Paisagem (Letras tão ultrapassando papel de 120 cols)
   else
      oPrinter:Landscape:= .F. && Retrato (Letras estão ultrapassando papel 80 cols)
   Endif
Endif   

Paisagem=.f.
Comprimi=.f.



IF !oPrinter:Create()
   Aviso(" Impressora näo pode ser criada !!! ")
   return
else
   IF !oPrinter:startDoc("TPRINT("+xarqtxt+")")
     Aviso("StartDoc() Falha na Impressora !")
     oPrinter:destroy()
     return
   endif
endif

nHandle:= Fopen( Xarqtxt ) // READ
cString:= ""
xmaxLen:= 0
FOR i:= 1 TO 10
    IF gfreadline( @cString, nHandle )
       IF LEN( cString ) > xmaxLen
          xmaxLen:= LEN( cString )
       ENDIF
    ELSE
       EXIT
    ENDIF
NEXT


fSeek( nHandle, 0 )

cString:= ""
xprow:=0
endof_file=.f.
while !endof_file
    gfreadline( @cString, nHandle )
    IF ( xpos:= AT( CHR(12), cString ) ) > 0
       cString:= LEFT( cString, xpos-1 ) + SUBS( cString, xpos + 1, LEN( cString ) )
    ENDIF
    oPrinter:TextOut(cString)
    oPrinter:NewLine()
    IF xpos > 0
       oPrinter:NewPage()
       oPrinter:NewLine()
       xprow:=0
    ELSE
       xprow++
    ENDIF
enddo

oPrinter:EndDoc()
oPrinter:Destroy()

fclose(nHandle)

RETURN(NIL)

*---------------------------
procedure gfreadline(st,handle)
*---------------------------
st=xfgetline(handle)
return .t.


*---------------------------
function xfgetline(script)
*-------------------------
local return_lin, chunk, bigchunk, oldoffset, at_chr13
return_lin = ''
bigchunk = ''
oldoffset = fseek (script, 0, 1)
do while .t.
   chunk = ''
   chunk = freadstr (script, 100)
   if len (chunk) = 0
      endof_file = .t.
      exit
   endif
   bigchunk = bigchunk + chunk
   if at (chr (10), bigchunk) > 0
      at_chr13 = at (chr (10), bigchunk)
      fseek (script, oldoffset)
      return_lin = freadstr (script, at_chr13 - 1)
      exit
   endif
enddo
fseek (script, 1, 1)
if right(return_lin,1)=chr(13)
   return_lin:=left(return_lin,len(return_lin)-1)
end if
return return_lin


*------------
FUNC xGetImp 
*------------
#include "BOX.CH"
#include "INKEY.CH"

Public nPrn:= 1 

Public aPrn:= GetPrinters()
If Empty(aPrn) 
   Aviso("Nao Tem nenhuma impressora Adicionada ao seu Windows  !") 
   Return .f.
else 
   **Setcolor(CBLUE)
   Setcolor( "n/w,n*/w, , , n*/w" )
   Jankey:=  win(11,10,17,70,"Selecione Impressora ou tecle <ESC> pra desistir" )
   @ 11,10 clea to 17,70
   nPrn:=ACHOICE(12,11,16,69, aPrn,.T.,,nPrn)
   Setcolor( "n/w,n*/w, , , n*/w" )
   RstEnv(Jankey)
endIf 
if lastkey() = K_ESC
   Return .F.
endif 
Return .T.

Como prova de que o meu código está barreado, eu Ja tentei todas essas combinações abaixo, mas elas simplesmente NÃO FAZEM NENHUM EFEITO NESTE MEU CÓDIGO:

Código: Selecionar todos

//oPrinter:setfont('Courier New',,12,,,,255) 
//oPrinter:SetFont("Courier New",13,{3,-50},0,.F.,.F.) 
//oPrinter:Bold(0) 
//oPrinter:SetFont("Courier New",12,{3,-55},700,.F.,.F.) //1,18 -50
//oPrinter:SetFont("Courier New",8,{3,-60},700,.F.,.F.) //1,18 -50
//oPrinter:SetFont("Arial Narrow",8,{3,-60},700,.F.,.F.) //1,18 -50
//oPrinter:SetFont("Courier New",7,{0,15}) //1,18
//oPrinter:SetFont("Courier New",10,10) //10,10
//oPrinter:SetFont("Courier New",7,14) //07,14 
//oPrinter:SetFont("Courier New",7,{0,18}) //1,18
//oPrinter:SetFont('Courier New',7,{3,-50}) // 
//oPrinter:SetFont("Courier New",7,{1,18}) //
//oPrinter:SetFont("ARIAL",2,{1,18}) 


Obrigado pela paciência e vontade de ajudar...

Gabriel
lugab
Avatar do usuário
gvc
Colaborador
Colaborador
Mensagens: 1270
Registrado em: 23 Ago 2005 10:57

Re: Win32prn() só tem me dado dor de cabeça

Mensagem por gvc »

Eu vou verificar e testar seu código mais tarde.
Vc testou o que eu te mandei? Eu imprimo usando coordenadas em mm e mudando os tamanhos do fonte. Não mudei o tipo do fonte ainda.
"TRS-80/Sincler/Apple/PC - Clipper Winter 85, tlink 1.0 [pc 10 MHz - 640K] {NEZ 8000 2Kb RAM}"
{POG - Programação Orientada a Gambiarra}
lugab
Colaborador
Colaborador
Mensagens: 843
Registrado em: 19 Mai 2009 15:58

Re: Win32prn() só tem me dado dor de cabeça

Mensagem por lugab »

Valeu Gvc,

E enquanto isso eu vou estudar o NodosImp()

Gabreil
lugab
Hasse
Usuário Nível 4
Usuário Nível 4
Mensagens: 820
Registrado em: 19 Out 2004 10:30
Localização: Jaraguá do Sul - SC

Re: Win32prn() só tem me dado dor de cabeça

Mensagem por Hasse »

Bom dia lugab.

Analisei teu código somente na área de impressão e sua configuração.

Encontrei alguns erros básicos de conceito e de sintaxe. Vejamos por partes:

1-Não faz sentido você usar a classe Win32prn() para imprimir com impressoras matriciais. O resultado não fica bom além de ser extremamente lenta a impressão.
Você pode desenvolver uma rotina que verifique a impressora padrão. Se for matricial, imprima com o velho sistema @xx,yy SAy "", caso contrário use a classe Win32prn().

2-oPrinter:SetPrintQuality(2) // qualidade da impressao 1=rascunho 2=normal 3=media 4=melhor, -1=sugestão do fórum do Toledo
O parâmetro deve ser SEMPRE negativo, como:
-1 -Qualidade fotográfica;
-2 -Qualidade carta;
-3 -Qualidade média;
-4 -Qualidade rascunho.

3-oPrinter:SetFont('Courier New',,2,2)
Este comando não pode produzir bons resultados bons. O caracter fica todo deformado Veja que o parâmetro 3 está com o valor "2", ou seja, 2 CPI, o que é um caracter muito grande. Conceitualmente, 2 CPI pode ser impresso, desde que você tenha uma altura de caracter e altura de linha compatível.
Lembrar que você pode setar a altura da linha somente antes de criar o documento. Ela não poderá ser alterada no decorrer do documento. O mesmo acontece com o qualidade de impressão e com a orientação do documento.
A fonte poder ser alterada a qualquer momento.
Veja como se configura o setfont:
oPrinter:SetFont(cFontName, nPointSize, nWidth, nBold, lUnderline, lItalic, nCharSet)
oPrinter:SetFont('Courier New',12,{1,12}, 0, .F., .F.)
1-Nome da fonte;
2-Altura da fonte, em pixels;
3-Multiplicador da fonte (horizontal e vertical);
4-Largura da fonte - CPI (12 character per inch);
5-Controla o Negrito-Bold (700) ou normal (.F.);
6-Controla o sublinhado (.T.) ou não (.F.);
7-Controla o itálico (.T.) ou não (.F.).

4-Cuidado com o comprimento da linha. Todos os caracteres que ultrapassarem a largura útil do documento serão truncados.
A classe Win32prn() não gerencia o recurso de "nova linha" caso a linha seja muito comprida. Isto terá que ser feito via software. Lembre-se, a classe Win32prn() não é um editor de texto, que faz isto automaticamente.

5-Outro detalhe importante é em relação ao pitch dos caracteres para cada fonte usada. A grande maioria das fontes do windows são de pitch variável, ou seja, cada caracter possui uma largura diferente. O "i" ocupa menos espaço que o "m". Do meu conhecimento, somente as fontes "Courier" e "Courier New" são de pitch fixo.

6-O "teste4.prg" que estou anexando reproduz as configurações que você listou no teu tópico.
Todas elas funcionam perfeitamente. Os resultados, por vezes, são muito ruins. Veja os resultados de cada configuração.
Observe que os caracteres que ultrapassam a largura útil do documento são perdidos.

7-Muito bem. Faça as correções necessárias.
Se você tiver dificuldades, coloque um exemplo claro do que está acontecendo, e com isto facilitar a nossa ajuda. Uma descrição do tipo "o código não está funcionando" é de difícil análise visto que não temos conhecimento do que está sendo impresso.

Por último, meu amigo, o sucesso é feito de 99% de suor e 1% de sorte. Não desista...
A Classe Win32prn() é muito boa e 100% confiável. Não dá pau.
Bom trabalho.

Código: Selecionar todos

FUNCTION Main()

  LOCAL nPrn:=1
  LOCAL aPrn:= GetPrinters()
  CLS
  IF EMPTY(aPrn)
    Alert("No printers installed - Cannot continue")
    QUIT
  ENDIF
  DO WHILE !EMPTY(nPrn)
    CLS
    @ 0,0 SAY 'Programa de teste Classe WIN32PRN(). Escolha uma impressora. ESC' +;
              ' para sair.'
    @ 1,0 TO maxRow(),maxCol()
    nPrn:= ACHOICE(2,1,maxRow()-1,maxCol()-1,aPrn,.T.,,nPrn)
    IF !EMPTY(nPrn)
      PrnTest(aPrn[nPrn])
    ENDIF
  ENDDO
  *
  @ 22,00 say ""
  RETURN(NIL)
*
*--------------------------------------------------------------------------------------------------
STATIC FUNCTION PrnTest(cPrinter)

LOCAL oPrinter:= Win32Prn():New(cPrinter), aFonts, x, nColFixed,nColTTF, nColCharSet
LOCAL ncarpol, i, nHandle, cString

Comprimi=.F.      && (.T. se deseja fontes comprimidos) ou .f.
Paisagem=.T.      && (.T.se deseja orientação Paisagem) ou .f.

oPrinter:FormType := 9
oPrinter:Copies   := 1
oPrinter:SetPrintQuality(-2)

If Comprimi                                                    && ( letra comprimida e orientacao retrato NAÕ ESTÁ COMPRIMINDO NADA)
   oPrinter:Landscape:= .F.  && retrato
   oPrinter:SetFont("Courier New",13,{3,-50},0,.F.,.F.)        &&(NAO está Comprimindo)
Else   
   If Paisagem
      oPrinter:SetFont('Courier New',,2,2)
      oPrinter:Landscape:= .T.                                 && Paisagem (Letras tão ultrapassando papel de 120 cols)
   else
      oPrinter:Landscape:= .F.                                 && Retrato (Letras estão ultrapassando papel 80 cols)
   Endif
Endif   

Paisagem=.f.
Comprimi=.f.

c_arq := "Teste-" + LTRIM(STR(YEAR(DATE()))) + "-" + STRZERO(MONTH(DATE()),2) +;
                "-" + LTRIM(STR(DAY(DATE()))) + "=" + TIME()

IF !oPrinter:Create()
   Alert(" Impressora näo pode ser criada !!! ")
   return
else
   IF !oPrinter:startDoc("TPRINT("+c_arq+")")
     Alert("StartDoc() Falha na Impressora !")
     oPrinter:destroy()
     return
   endif

endif

// oPrinter:SetFont(cFontName, nPointSize, nWidth, nBold, lUnderline, lItalic, nCharSet)
// oPrinter:SetFont( 'Courier New',,2,2 )
// oPrinter:SetFont( 'Courier New',,12,,,,255 )
// oPrinter:SetFont( 'Courier New',13,{3,-50},0,.F.,.F. )
// oPrinter:SetFont( 'Courier New',12,{3,-55},700,.F.,.F. )
// oPrinter:SetFont( 'Courier New',8,{3,-60},700,.F.,.F. )
// oPrinter:SetFont( 'Arial Narrow',8,{3,-60},700,.F.,.F. )
// oPrinter:SetFont( 'Courier New',7,{0,15} )
// oPrinter:SetFont( 'Courier New',10,10 )
// oPrinter:SetFont( 'Courier New',7,14 )
// oPrinter:SetFont( 'Courier New',7,{0,18} )
// oPrinter:SetFont( 'Courier New',7,{3,-50} )
// oPrinter:SetFont( 'Courier New',7,{1,18} )
// oPrinter:SetFont( 'ARIAL',2,{1,18} )

cString := "1234567890abcdefghijklmnopqrstuvxyz-------50------"      && cada sequencia tem 50 caracteres.
cString += "1234567890abcdefghijklmnopqrstuvxyz------100------"
cString += "1234567890abcdefghijklmnopqrstuvxyz------150------"
cString += "1234567890abcdefghijklmnopqrstuvxyz------200------"
cString += "1234567890abcdefghijklmnopqrstuvxyz------250------"
cString += "1234567890abcdefghijklmnopqrstuvxyz------300------"
cString += "1234567890abcdefghijklmnopqrstuvxyz------350------"

oPrinter:NewLine()
oPrinter:SetFont(  'Courier New',12,{3,-55},700,.F.,.F.  ) 
oPrinter:NewLine()
oPrinter:TextOut( "Fonte:  oPrinter:SetFont( 'Courier New',12,{3,-55},700,.F.,.F. )", .T.)
For lin = 1 TO 350
   oPrinter:TextOut( Str(l1,03) + "-" + SUBS( cString, 1, lin ), .T. )
   IF oPrinter:PRow() > oPrinter:MaxRow() - 2
      oPrinter:NewPage()
      oPrinter:NewLine()
   ENDIF
Next lin

oPrinter:EndDoc()
oPrinter:Destroy()
Hasse
CP200 / CP500 / Basic / dBase III / dBase IV / Clipper Summer / RTlink / Exospace.
Clipper 5.3b / Blinker 7.0 / CDX com TAG
xHarbour 1.2.1-6604 / Borland C++ (5.5.1) 32 bit / HBmake.
Harbour 3.2.0dev (r1412121623) / MINGW / HBM2 / MiniGui HMG 3.1.4 / IDE (Roberto Lopez).
"Conheça todas as teorias, domine todas as técnicas, mas, quando tocares uma alma humana, seja apenas outra alma humana." (C.G.Jung)
lugab
Colaborador
Colaborador
Mensagens: 843
Registrado em: 19 Mai 2009 15:58

Re: Win32prn() só tem me dado dor de cabeça

Mensagem por lugab »

Obrigado, Hasse...

Observando a contribuição abaixo q vc postou, cheguei a conclusão q eu to fazendo tudo errado. Eu copio e col o q o pesoal posta, sem sequer analisar o significado de cada coisa.

Código: Selecionar todos

oPrinter:SetFont(cFontName, nPointSize, nWidth, nBold, lUnderline, lItalic, nCharSet)
oPrinter:SetFont('Courier New',12,{1,12}, 0, .F., .F.)
1-Nome da fonte;
2-Altura da fonte, em pixels;
3-Multiplicador da fonte (horizontal e vertical);
4-Largura da fonte - CPI (12 character per inch);
5-Controla o Negrito-Bold (700) ou normal (.F.);
6-Controla o sublinhado (.T.) ou não (.F.);
7-Controla o itálico (.T.) ou não (.F.).

E eu tenho Uma pegunta: O que significa: Multiplicador de Fonte ??

Grato,
lugab
Hasse
Usuário Nível 4
Usuário Nível 4
Mensagens: 820
Registrado em: 19 Out 2004 10:30
Localização: Jaraguá do Sul - SC

Re: Win32prn() só tem me dado dor de cabeça

Mensagem por Hasse »

A coisa funciona +- assim:

oPrinter:SetFont( 'Courier New',12,{1,18},,.F.,.F. )
oPrinter:SetFont( 'Courier New',12,{2,36},,.F.,.F. )
oPrinter:SetFont( 'Courier New',12,{3,54},,.F.,.F. )

Os 3 set's acima produzem o mesmo resultado. Portanto, o primeiro multiplica a largura da fonte do segundo ( CPI ).

O valor 54 CPI, da terceira linha, multiplicado por 3, resulta em 18 CPI, que é igual ao exemplo da primeira linha.

Valores negativos, aparentemente, produzem o mesmo resultados (quando em matriz), ou seja:
oPrinter:SetFont( 'Courier New',12,{3,-50},,.F.,.F. ) produz caracteres em 16,67 CPI ( = 50/3 ).
Contudo há uma diferença significativa entre valores positivos e negativos:
a)Valores positivos resultam numa fonte de pitch proporcional;
b)valores negativos resultam numa fonte pitch fixo.

Passar os valor em forma de matriz, aparentemente, traz uma vantagem:
oPrinter:SetFont( 'Courier New',12,16.67,,.F.,.F. ) seta o tamanho em 16 CPI (assume o valor do inteiro somente), e
oPrinter:SetFont( 'Courier New',12,{3,50},,.F.,.F. ) seta o tamanho em exatamente 16.67 CPI (exatamente o tamanho "comprimido" usado pelas impressoras matriciais).

Portanto, a informação abaixo está incorreta, já que a multiplicação é somente na horizontal.
3-Multiplicador da fonte (horizontal e vertical);

Dê uma olhada no tópico abaixo, que encontrarás muitas informações.
viewtopic.php?f=4&t=6465&hilit=win32prn+para+iniciantes
Hasse
CP200 / CP500 / Basic / dBase III / dBase IV / Clipper Summer / RTlink / Exospace.
Clipper 5.3b / Blinker 7.0 / CDX com TAG
xHarbour 1.2.1-6604 / Borland C++ (5.5.1) 32 bit / HBmake.
Harbour 3.2.0dev (r1412121623) / MINGW / HBM2 / MiniGui HMG 3.1.4 / IDE (Roberto Lopez).
"Conheça todas as teorias, domine todas as técnicas, mas, quando tocares uma alma humana, seja apenas outra alma humana." (C.G.Jung)
Avatar do usuário
janio
Colaborador
Colaborador
Mensagens: 1846
Registrado em: 06 Jul 2004 07:43
Localização: UBAJARA - CE

Re: Win32prn() só tem me dado dor de cabeça

Mensagem por janio »

plac plac plac plac!

Hasse,

Bela explicação.
fui...
e-mail:janioaguiar@yahoo.com.br
msn: janio_aguiar@hotmail.com
xHarbour1.2.1/Harbour3.2 + wvg + hwgui + Mediator + MySql
lugab
Colaborador
Colaborador
Mensagens: 843
Registrado em: 19 Mai 2009 15:58

Re: Win32prn() só tem me dado dor de cabeça

Mensagem por lugab »

Obrigado Hasse, Gvc e Toledo....

Ja refiz tudo e dessa vez sem copiar e colar. Refiz com conhecimento de causa, graças a ajuda de vcs...

Imagino o quanto este tópico com suas soluções será últil aos aprendizes, que nem eu..


Grato a todos,

Gabriel
Editado pela última vez por lugab em 27 Fev 2010 13:05, em um total de 1 vez.
lugab
Responder