Procedure Wokupas
*!* ----------------
LPARAMETERS tcString,tcFontName,tnFontSize,tcEstilo,tnAddSpace,tlLogarit
*!* Devuelve el ancho en pixeles que ocupa tcString para la fuente
*!* tcFontName, de tamaño tnFontSize y en estilo tcEstilo
*!* tnAddSpace: opcional (+/-)
#DEFINE _ESTILO_ "BINOQS-TU"
TRY
LOCAL lnPixels,;
i,;
lcEstilo,;
lcSub,;
LOEX AS Exception
lcEstilo=""
lnPixels=0
tcFontName=EVL(m.tcFontName,"Arial")
tnFontSize=EVL(m.tnFontSize,8)
if Vartype(m.tcEstilo)#"C"
tcEstilo=IIF(Vartype(m.tcEstilo)="L",iif(tcEstilo,"B","N"),"N")
ENDIF
tcEstilo=ALLTRIM(UPPER(EVL(m.tcEstilo,"N")))
FOR i=1 TO LEN(tcEstilo)
lcSub=SUBSTR(m.tcEstilo,i,1)
lcSub=IIF(m.lcSub $ _ESTILO_,m.lcSub,"N")
IF AT(lcsub,lcEstilo)=0
lcEstilo=m.LcEstilo + m.lcSub
ENDIF
NEXT
lnPixels=TxtWidth(m.tcString,m.tcFontName,m.tnFontSize,m.lcEstilo) * ;
FontMetric(6,m.tcFontName,m.tnFontSize,m.lcEstilo)
IF tlLogarit
lnPixels = lnPixels + CEILING(LOG(LEN(m.tcString))*FontMetric(6,m.tcFontName,m.tnFontSize,m.lcEstilo))
ELSE
lnPixels = m.lnPixels + EVL(m.tnAddSpace , INT(m.lnPixels/20) )
ENDIF
CATCH TO LOEX
LOEX.UserValue=PROGRAM()
* ShowError(loex,,,.t.) && mostrar el error
FINALLY
#UNDEF _ESTILO_
ENDTRY
RETURN m.lnPixels
ENDPROC@Fidel: yo suelo usar _Screen.TextWidth , configurando primero _Screen.FontName / .FontSize… etc. En mi caso, con esa función me resultó más que suficiente.
HTH
Mario
PROCEDURE Wokupas_ML
* ----------------------------------------------------------------------------------
* Devuelve el tamaño en pixeles que ocupa tcString para los valores dados.
* ----------------------------------------------------------------------------------
* lnPixels = Wokupas_ML("Tamño de la Cadena de Caracteres","Thaoma",11,"BI")
*
* Parameters
* tcString: cadena de caracteres
* tcFontName: fuente
* tnFontSize: tamaño
* t_lc_Estilo: (.F./.T.) Afecta FontBold solamente.
* "BIN-U" (Bold,Italic,Normal,Strike,Underline (cualquier combinación)
* ----------------------------------------------------------------------------------
* Default
* FontName = "Arial"
* FontSize = 8
* FontBold = .f.
* FontItalic = .f.
* FontUnderline = .f.
* FontStrikeThru = .f.
* ----------------------------------------------------------------------------------
* FontStrikeThru y FontUnderline son irrelevantes para el cálculo de espacio
* ----------------------------------------------------------------------------------
LPARAMETERS tcString,tcFontName,tnFontSize,t_lc_Estilo
TRY
LOCAL lBold,;
lItalic,;
lnPixels,;
lStrike,;
lUnderLine,;
loex AS Exception,;
loForm AS Object
lnPixels=0
tcFontName=EVL(m.tcFontName,"Arial")
tnFontSize=EVL(m.tnFontSize,8)
IF VARTYPE(m.t_lc_Estilo)="C"
t_lc_Estilo = UPPER(m.t_lc_Estilo)
lItalic = AT("I",m.t_lc_Estilo) > 0
lStrike = AT("-",m.t_lc_Estilo) > 0
lUnderLine = AT("U",m.t_lc_Estilo) > 0
ENDIF
lBold = ICASE( VARTYPE(m.t_lc_Estilo) = "L" , m.t_lc_Estilo ,;
VARTYPE(m.t_lc_Estilo) = "C" , AT( "B" , m.t_lc_Estilo ) > 0 ,;
.f.)
loForm = NEWOBJECT("Form")
WITH loForm
.FontName = m.tcFontName
.FontSize = m.tnFontSize
.FontBold = m.lBold
.FontItalic = m.lItalic
* .FontUnderLine = m.lUnderLine
* .Fontstrikethru = m.lStrike
ENDWITH
lnPixels = loform.TextWidth(m.tcString)
CATCH TO loex
loex.UserValue = PROGRAM()
* ShowError(loex)
FINALLY
loForm = null
ENDTRY
RETURN m.lnPixels
ENDPROC