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)