Página 1 de 1

TextAtFont

Enviado: 30 Dez 2011 11:12
por leandrolinauer
Caros colegas.

Estou com um problemão com harbour 3.0, eu tinha uma formulação de etiquetas o qual usava a função textatfont em perfeita harmonia, mas ao migrar para harbour 3.0 as etiquetas ficaram bem fora de rumo mesmo, tendo que refaze-la novamente.

Ocorreu que a função texatfont na parte de alinhamento, nao esta obedecendo o comando expecifico de imprimir a partir da esquerda do valor x. exemplo

Tenho um valor 43,59 para imprimir, coloco os centavos 0,59 em x lugar da folha e imprimo os 43 em uma posição que ficasse junto com os ,59 mais ou menos assim ,59 ,
43
especificamente o textatfont nao respeitou o alinhamento 1, o 0 e o 2 funcionam, mas o 1 que utilizo nao esta dando certo, quando coloco e fica no inicio da folha em cima e nao no lugar dele.

Alguem sabe o porque, se o problema esta no textatfont ou na winprn, fico no aguardo..

Atenciosamente
Leandro
:(

TextAtFont

Enviado: 30 Dez 2011 17:32
por asimoes
Olá Lenadro,

Já deu uma olhada neste exemplo da contrib?

Código: Selecionar todos

#include "common.ch"
#include "hbwin.ch"

PROCEDURE Main( cPar1 )
   LOCAL nPrn := 1
   LOCAL cBMPFile := Space( 40 )
   LOCAL aPrn := WIN_PRINTERLIST()
   LOCAL GetList := {}

   CLS

   IF Empty( aPrn )
      Alert("No printers installed - Cannot continue")
      QUIT
   ENDIF

   DO WHILE nPrn != 0
      CLS
      @ 0, 0 SAY "Win_Prn() Class test program. Choose a printer to test"
      @ 1, 0 SAY "Bitmap file name" GET cBMPFile PICT "@K"
      READ
      @ 2, 0 TO MaxRow(), MaxCol()
      nPrn := AChoice( 3, 1, MaxRow() - 1, MaxCol() - 1, aPrn, .T.,, nPrn )
      IF nPrn != 0
         PrnTest( aPrn[ nPrn ], cBMPFile, iif( ISCHARACTER( cPar1 ) .AND. Lower( cPar1 ) == "ask", .T., NIL ) )
      ENDIF
   ENDDO

   RETURN

STATIC PROCEDURE PrnTest( cPrinter, cBMPFile, lAsk )
   LOCAL oPrinter := Win_Prn():New( cPrinter )
   LOCAL aFonts
   LOCAL x
   LOCAL nColFixed
   LOCAL nColTTF
   LOCAL nColCharSet

   oPrinter:Landscape := .F.
   oPrinter:FormType  := WIN_DMPAPER_A4
   oPrinter:Copies    := 1
   IF ISLOGICAL( lAsk )
      oPrinter:AskProperties := lAsk
   ENDIF

   IF ! oPrinter:Create()
      Alert( "Cannot Create Printer" )
   ELSE
      IF ! oPrinter:startDoc( "Win_Prn(Doc name in Printer Properties)" )
         Alert( "StartDoc() failed" )
      ELSE
         oPrinter:SetPen( WIN_PS_SOLID, 1, HB_WIN_RGB_RED )
         oPrinter:Bold( WIN_FW_EXTRABOLD )
         oPrinter:TextOut( oPrinter:PrinterName + ": MaxRow() = " + Str( oPrinter:MaxRow(), 4 ) + "   MaxCol() = " + Str( oPrinter:MaxCol(), 4 ) )
         oPrinter:Bold( WIN_FW_DONTCARE )
         oPrinter:NewLine()
         oPrinter:TextOut("   Partial list of available fonts that are available for OEM_")
         oPrinter:NewLine()
         oPrinter:UnderLine( .T. )
         oPrinter:Italic( .T. )
//       oPrinter:SetFont( "Courier New", 7, { 3, -50 } )  // Compressed print
         nColFixed   := 40 * oPrinter:CharWidth
         nColTTF     := 48 * oPrinter:CharWidth
         nColCharSet := 60 * oPrinter:CharWidth
         oPrinter:TextOut( "FontName" )
         oPrinter:SetPos( nColFixed )
         oPrinter:TextOut( "Fixed?" )
         oPrinter:SetPos( nColTTF )
         oPrinter:TextOut( "TrueType?" )
         oPrinter:SetPos( nColCharset )
         oPrinter:TextOut( "CharSet#", .T. )
         oPrinter:NewLine()
         oPrinter:Italic( .F. )
         oPrinter:UnderLine( .F. )
         aFonts := oPrinter:GetFonts()
         oPrinter:NewLine()
         FOR x:= 1 TO Len( aFonts ) STEP 2
            oPrinter:CharSet( aFonts[ x, 4 ] )
            IF oPrinter:SetFont( aFonts[ x, 1 ] )       // Could use "IF oPrinter:SetFontOk" after call to oPrinter:SetFont()
               IF oPrinter:FontName == aFonts[ x, 1 ]  // Make sure Windows didn't pick a different font
                  oPrinter:TextOut( aFonts[ x, 1 ] )
                  oPrinter:SetPos( nColFixed )
                  oPrinter:TextOut( iif( aFonts[ x, 2 ], "Yes", "No" ) )
                  oPrinter:SetPos( nColTTF )
                  oPrinter:TextOut( iif( aFonts[ x, 3 ], "Yes", "No" ) )
                  oPrinter:SetPos( nColCharSet )
                  oPrinter:TextOut( Str( aFonts[ x, 4 ], 5 ) )
                  oPrinter:SetPos( oPrinter:LeftMargin, oPrinter:PosY + ( oPrinter:CharHeight * 2 ) )
                  IF oPrinter:PRow() > oPrinter:MaxRow() - 16  // Could use "oPrinter:NewPage()" to start a new page
                     EXIT
                  ENDIF
               ENDIF
            ENDIF
            oPrinter:Line( 0, oPrinter:PosY + 5, 2000, oPrinter:PosY + 5 )
         NEXT
         oPrinter:SetFont( "Lucida Console", 8, { 3, -50 } )  // Alternative Compressed print
         oPrinter:CharSet( 0 )  // Reset default charset
         oPrinter:Bold( WIN_FW_EXTRABOLD )
         oPrinter:NewLine()
         oPrinter:TextOut( "This is on line" + Str( oPrinter:Prow(), 4 ) + ", Printed bold, " )
         oPrinter:TextOut( " finishing at Column: " )
         oPrinter:TextOut( Str( oPrinter:Pcol(), 4 ) )
         oPrinter:SetPrc( oPrinter:Prow() + 3, 0 )
         oPrinter:Bold( WIN_FW_DONTCARE )
         oPrinter:TextOut( "Notice: UNDERLINE only prints correctly if there is a blank line after", .T. )
         oPrinter:TextOut( "        it. This is because of :LineHeight and the next line", .T. )
         oPrinter:TextOut( "        printing over top of the underline. To avoid this happening", .T. )
         oPrinter:TextOut( "        you can to alter :LineHeight or use a smaller font, or use :SetBkMode( WIN_TRANSPARENT )" )
         oPrinter:NewLine()
         oPrinter:NewLine()
         oPrinter:SetFont( "Lucida Console", 18, 0 )  // Large print
         oPrinter:SetColor( HB_WIN_RGB_GREEN )
         oPrinter:TextOut( "Finally some larger print" )
         oPrinter:Box(   0, oPrinter:PosY + 100, 100, oPrinter:PosY + 200 )
         oPrinter:Arc( 200, oPrinter:PosY + 100, 300, oPrinter:PosY + 200 )
         oPrinter:Ellipse( 400, oPrinter:PosY + 100, 500, oPrinter:PosY + 200 )
         oPrinter:FillRect( 600, oPrinter:PosY + 100, 700, oPrinter:PosY + 200, HB_WIN_RGB_RED )

//       To print a barcode;
//       Replace 'BCod39HN' with your own bar code font or any other font
//         oPrinter:TextAtFont( oPrinter:MM_TO_POSX( 30 ), oPrinter:MM_TO_POSY( 60 ), "1234567890", "BCod39HN", 24, 0 )
//
         PrintBitMap( oPrinter, cBMPFile )

         oPrinter:EndDoc()
      ENDIF
      oPrinter:Destroy()
   ENDIF

   RETURN

STATIC PROCEDURE PrintBitMap( oPrn, cBitFile )
   LOCAL oBMP

   IF Empty( cBitFile )
      *
   ELSEIF ! hb_FileExists( cBitFile )
      Alert( cBitFile + " not found " )
   ELSE
      oBMP := Win_BMP():New()
      IF oBmp:loadFile( cBitFile )

         oBmp:Draw( oPrn, { 200, 200, 2000, 1500 } )

         // Note: Can also use this method to print bitmap
         //   oBmp:Rect := { 200, 200, 2000, 1500 }
         //   oPrn:DrawBitMap( oBmp )

      ENDIF
      oBMP:Destroy()
   ENDIF

   RETURN
Feliz 2012.

TextAtFont

Enviado: 31 Dez 2011 09:31
por Eolo
Leandro,, eu enfrentei a mesma coisa na impressão de etiquetas de gôndola para um mercado, quando passei do xHarbour 100 pro 121: a função TEXTOUTAT() usava os parâmetros 0, 1 e 2 (esquerda, direita e centro) e, na versão 121, esses parâmetros passaram pra 0, 2 e 6 (dica do Edson Alamino). Alterei só isso e voltou tudo ao normal. Será que não é o seu caso também?

TextAtFont

Enviado: 31 Dez 2011 09:47
por asimoes
Olá Leandro,

Houve uma manutenção na função hoje:

2011-12-31 03:30 UTC+0100 Viktor Szakats (harbour syenar.hu)
* contrib/xhb/xhw32prn.prg
! fixed typo in ::TEXTATFONT() to pass vertical alignment parameter.
(checkme)

Se você está testando com harbour 3.0.1 baixe a versão compilada (mingw) amanhã para testar:
A versão que está lá ainda é de 30/12/2011 a correção foi feita pelo svn.

http://sourceforge.net/projects/harbour ... e/download

TextAtFont

Enviado: 31 Dez 2011 11:58
por leandrolinauer
Bom dia,
Fiz o teste que o Eolo passou mudando para 6, e deu certinho, só esta fora de linha e coluna não ficou igual, mas pelo menos não fica la no topo, vou alinhar e aviso se deu tudo certo.
Vou baixar a versao nova harbour 3.0.1 e ver se funcionaria mais alinhada a textatfont.

Grato a todos pela ajuda.
Um feliz 2012.

TextAtFont

Enviado: 01 Jan 2012 11:20
por Eolo
Leandro, uma coisa me chamou a atenção no seu post: "só esta fora de linha e coluna". Estranhei porque eu entendo que a grande sacada do textoutat (acho que também do textatfont) é usar coordenadas em pixels e não em linha x coluna.

Na impressão das tais etiquetas que mencionei, eu faço o seguinte (lembrando que uso o xHarbour 121):

- defino o tamanho do papel: oPrinter:formtype(9) -> A4

- defino a qualidade de impressão: oPrinter:setPrintQuality(x) -> de 1 a 4 (de pior para melhor)

- obtenho a largura e altura do formulário em pixels (oprinter:pagewidth e pageheight), o que vai variar em função do tamanho do papel e da qualidade de impressão escolhidos. Uma A4 com qualidade rascunho, por ex, tem 2480x3507 pixels. Com qualidade ótima, tem 9921x14031.

- por fim, mando a textoutat() imprimir usando coordenadas em pixels.
Por exemplo, uma A4 com qualidade ótima:
oPrinter:TextOutat(9850,13500,"R$ 123,45",.f.,.f.,2)
-> Imprime a string no "rodapé" da folha (posição 9850, de um máximo de 9921)
-> a impressão da string "termina" em 13500 (perto da margem direita)

A precisão é milimétrica (ops, "pixelmétrica" hehehe).

TextAtFont

Enviado: 01 Jan 2012 11:58
por Eolo
Ops, faltou um detalhe importante: pagewidth mostra a largura "total" da folha e pageheight a altura "total".

Só que tem que considerar as MARGENS, onde não dá pra imprimir.
- oprinter:rightmargin retorna a margem direita
- oprinter:leftmargin - esquerda
- oprinter:topmargin - superior
- oprinter:bottom - inferior

A "área imprimível", então, é
- pagewidth menos as margens esquerda e direita
- pageheight menos as margens superior e inferior.

O que vc mandar imprimir fora dessa área imprimível, não vai sair. E isso não é exclusivo do [x]Harbour. Se vc colocar ZERO nas margens de um documento do MS Word, ele vai chiar. Se vc tentar imprimir algo no CorelDraw, usando o tamanho total, ele vai avisar que "tem coisa fora da área imprimível". Etc.

TextAtFont

Enviado: 03 Jan 2012 10:14
por leandrolinauer
Bom dia.
Eu não uso a TextOutat uso a textFontAt, creio que a texfontat nao usa em pixell, assim que sobrar um tempo a mais, vou reconfigurar outra usando a textoutat e ver como funciona.

No momento deu certo usando o parametro 6, quando a harbour 3.1 que fiquei de baixar, o compilador é minigui, aí nao deu certo a compilação porque uso a gtwvw.

Pergunto, da certo eu compilar com a minigui e usar a hwgui, porque pretendo mudar totalmente o fonte do sistema para hwgui, visto que uso ainda o formato do clipper usando a gtwvw, ai o processo para mudar para hwgui vai ser um pouco dolorosa.

Grato por enquanto.
:)Pos

TextAtFont

Enviado: 03 Jan 2012 10:34
por asimoes
leandrolinauer escreveu:minigui
Você está querendo dizer mingw?

TextAtFont

Enviado: 03 Jan 2012 11:00
por Eolo
O método TextFontAt é uma combinação de TextOutAt, SetFont e SetColor. Ela serve quando vc precisa imprimir algo com fonte e cor diferentes das que estão setadas, sem as alterar permanentemente. Acabou essa impressão, voltam a fonte e a cor anteriores.

TextAtFont

Enviado: 04 Jan 2012 08:58
por leandrolinauer
Bom dia aSimoes
asimoes escreveu:leandrolinauer escreveu:
minigui
Você está querendo dizer mingw?
Sim, correto é mingw.
Mas a mingw não é minigui? que é a mesma coisa HMG?, estou confuso com isto.

Agora a HWgui, é uma biblioteca da mesma forma que a atual que eu uso GTWVW, só melhor, correto.

Aí eu estava analisando e estou querendo migrar tudo para HWGui, Harbour 3.0 +SQLite.

Atenciosamente
Leandro

TextAtFont

Enviado: 04 Jan 2012 09:06
por asimoes
Olá Leandro,
MinGW é o compilador e MiniGui é a biblioteca gráfica.

Projetos criados em Minigui podem ser compilados usando Borland 5.1 ou MinGW (HMG Oficial)