Ayuda con clase TPrinter
Posted: Fri Mar 06, 2015 9:58 pm
Hola amigos,
hace rato venía usando una modificación de el método say de la clase tprinter para que
me justifique a ambos lados, con un par de agregados, y la ayuda de alguien que lo dejó
en el foro:
previamente al inicio del programa se define
#define PAD_BOTH 3
METHOD Say( nRow, nCol, cText, oFont, nWidth, nClrText, nBkMode, nPad, lO2A ) ;
CLASS TPrinter
local nTemp
Local aRect, cC, nI, nP,vec
if ::hDC = 0
return nil
endif
DEFAULT oFont := ::oFont,;
nBkMode := 1 ,;
nWidth := 0 ,;
nPad := ::nPad ,;
lO2A := .F.
IF nWidth > 0 .AND. oFont != Nil // AAL 20/05/2002
vec:=::Cmtr2Pix(nRow,nWidth)
cText:=Alltrim(cText)
DO WHILE ::GetTextWidth( cText, oFont ) > vec[2] //nWidth
IF nPad=1
cText:=Substr(cText,2,Len(cText))
ELSE
cText:=Substr(cText,1,Len(cText)-1)
ENDIF
ENDDO
IF nPad=PAD_BOTH .AND. " "$cText // Justificado a ambos lados
nP:=1
DO WHILE ::GetTextWidth( cText, oFont ) < vec[2] //nWidth
FOR nI=nP TO Len(cText)
nP++
cC:=SubStr(cText,nI,1)
IF cC=" "
cText:=Substr(cText,1,nI)+Substr(cText,nI,Len(cText))
nI:=Len(cText)+1
nP++
ENDIF
NEXT nI
IF nP>=Len(cText)-1
nP:=1
ENDIF
ENDDO
ENDIF
ENDIF
if oFont != nil
oFont:Activate( ::hDCOut )
endif
SetbkMode( ::hDCOut, nBkMode ) // 1,2 transparent or Opaque
if nClrText != nil
SetTextColor( ::hDCOut, nClrText )
endif
Do Case
Case nPad == PAD_LEFT
Case nPad == PAD_RIGHT
nCol := Max( 0, nCol - ::GetTextWidth( cText, oFont ) )
Case nPad == PAD_CENTER
nCol := Max( 0, nCol - ( ::GetTextWidth( cText, oFont ) / 2 ) )
EndCase
If ::oFile # Nil
::oFile:Say( ::nFRow, ::nFCol, cText )
If ::nOldRow == Nil
::nOldRow := nRow
::nOldCol := nCol
Else
If ::nOldRow < nRow
::nFRow ++
::nFCol := 0
::nOldRow := nRow
Else
::nFCol += Len( cText ) + 2
Endif
Endif
Endif
TextOut( ::hDCOut, nRow, nCol, If( lO2A, OemToAnsi( cText ), cText ) )
if oFont != nil
oFont:DeActivate( ::hDCOut )
endif
return nil
La cosa es, que hoy estuve todo el día intentando hacer funcionar ésto en las versiones más nuevas de
la clase tprinter y me fue imposible, alguien tiene idea como modificarla para que funcione?
Muchas gracias!
Roberto
hace rato venía usando una modificación de el método say de la clase tprinter para que
me justifique a ambos lados, con un par de agregados, y la ayuda de alguien que lo dejó
en el foro:
previamente al inicio del programa se define
#define PAD_BOTH 3
METHOD Say( nRow, nCol, cText, oFont, nWidth, nClrText, nBkMode, nPad, lO2A ) ;
CLASS TPrinter
local nTemp
Local aRect, cC, nI, nP,vec
if ::hDC = 0
return nil
endif
DEFAULT oFont := ::oFont,;
nBkMode := 1 ,;
nWidth := 0 ,;
nPad := ::nPad ,;
lO2A := .F.
IF nWidth > 0 .AND. oFont != Nil // AAL 20/05/2002
vec:=::Cmtr2Pix(nRow,nWidth)
cText:=Alltrim(cText)
DO WHILE ::GetTextWidth( cText, oFont ) > vec[2] //nWidth
IF nPad=1
cText:=Substr(cText,2,Len(cText))
ELSE
cText:=Substr(cText,1,Len(cText)-1)
ENDIF
ENDDO
IF nPad=PAD_BOTH .AND. " "$cText // Justificado a ambos lados
nP:=1
DO WHILE ::GetTextWidth( cText, oFont ) < vec[2] //nWidth
FOR nI=nP TO Len(cText)
nP++
cC:=SubStr(cText,nI,1)
IF cC=" "
cText:=Substr(cText,1,nI)+Substr(cText,nI,Len(cText))
nI:=Len(cText)+1
nP++
ENDIF
NEXT nI
IF nP>=Len(cText)-1
nP:=1
ENDIF
ENDDO
ENDIF
ENDIF
if oFont != nil
oFont:Activate( ::hDCOut )
endif
SetbkMode( ::hDCOut, nBkMode ) // 1,2 transparent or Opaque
if nClrText != nil
SetTextColor( ::hDCOut, nClrText )
endif
Do Case
Case nPad == PAD_LEFT
Case nPad == PAD_RIGHT
nCol := Max( 0, nCol - ::GetTextWidth( cText, oFont ) )
Case nPad == PAD_CENTER
nCol := Max( 0, nCol - ( ::GetTextWidth( cText, oFont ) / 2 ) )
EndCase
If ::oFile # Nil
::oFile:Say( ::nFRow, ::nFCol, cText )
If ::nOldRow == Nil
::nOldRow := nRow
::nOldCol := nCol
Else
If ::nOldRow < nRow
::nFRow ++
::nFCol := 0
::nOldRow := nRow
Else
::nFCol += Len( cText ) + 2
Endif
Endif
Endif
TextOut( ::hDCOut, nRow, nCol, If( lO2A, OemToAnsi( cText ), cText ) )
if oFont != nil
oFont:DeActivate( ::hDCOut )
endif
return nil
La cosa es, que hoy estuve todo el día intentando hacer funcionar ésto en las versiones más nuevas de
la clase tprinter y me fue imposible, alguien tiene idea como modificarla para que funcione?
Muchas gracias!
Roberto