Como saber cuántos caracteres caben en un TextBox

937 views
Skip to first unread message

Edgar Acevedo

unread,
Oct 6, 2012, 9:44:41 PM10/6/12
to publice...@googlegroups.com, Edgar Acevedo
Saludos respetables colaboradores:

Suponiendo que tengo un TextBox de uno 100 pixeles de ancho (Width), que tiene letra  "Lucida Console" de tamaño 12...
¿Cómo puedo saber cuantos caracteres caben en ese espacio si NO tuvieran negrilla (FontBold = .F.)?
¿y Cómo saber cuantos caracteres caben en ese mismo espacio si los caracteres tuvieran NEGRILLA (FontBold = .T.)?

Saludos y gracias anticipadas,


Edgar Acevedo

edgar suarez kummers

unread,
Oct 6, 2012, 9:54:07 PM10/6/12
to publice...@googlegroups.com
http://css-tricks.com/css-font-size/

tocayo Edgar mira el link de arriba

sin garantía de que es lo que buscas


edgar suarez kummers



--
 
 
 

Edgar Acevedo

unread,
Oct 7, 2012, 12:37:54 AM10/7/12
to publice...@googlegroups.com
Muchísimas gracias tocayo Edgar, pero aún no obtengo exactamente lo que quiero.
De manera muy "simplista" si quieres, pensé que con la función FONTMETRIC() del zorro podría lograr esto, pero a veces obtengo comportamientos "extraños" en los resultados de mi fórmula.

Seguiré tratando de "pulir" la fórmula siempre con ayuda del FONTMETRIC().

Mil gracias !


Edgar Acevedo

--
 
 
 

Hugo Carlos Aguilar Zapata

unread,
Oct 7, 2012, 9:31:58 AM10/7/12
to publice...@googlegroups.com
muestra tu formula, quizas te podamos ayudar a pulirla o corregirla para que obtengas lo que quieres

saludos

--
 
 
 

FidelJ

unread,
Oct 7, 2012, 11:01:25 AM10/7/12
to publice...@googlegroups.com, Edgar Acevedo
En el supuesto que envías, "Lucida Console" es una fuente de ancho fijo, por lo que resulta bastante fácil saber en ancho. Los caraceteres ocupan siempre el mismo espacio. Es muy distinto el caso de "Arial" ó "Sain Serif", o cualquier otra fuente de ancho variable.

Salvo el caso de fuentes de ancho fijo, la cantidad de pixeles es extremadamente variable.
Por ejemplo:
cPala=REPLICATE("M",30) necesistaría unos 252 pixeles
bPala=REPLICATE("i",30) necesitaría unos 63 píxeles
Para determinar el ancho de un TextBox, cuando se necesita, utilizo esta función, con bastante éxito.
Sin embargo, según las características particulares de algunos textos (combinación de mayúsculas y minúsculas, etc), por ahí se necesita un factor de corrección distinto, que coloco en el parámetro xnAdd.
Esta función utiliza TXTWIDHT() y FONTMETRIC()
***************************************************************************
Procedure Wokupas(xcTexto,xcFuente,xnTam,xcEstilo,xnAdd)
***************************************************************************
if Vartype(xcFuente)#"C"
xcFuente="Arial"
endif
if Vartype(xnTam)#"N"
xnTam=8
endif
if Vartype(xcEstilo)#"C"
if Vartype(xcEstilo)="L"
xcEstilo=iif(xcEStilo,"B","N")
else
xcEstilo="N"
endif
endif
if Vartype(xnAdd)#"N"
xnAdd=0
endif
nProm=FontMetric(6,xcFuente,xnTam,xcEstilo)
nvtex=TxtWidth(xcTExto,xcFuente,xnTam,xcEstilo)*nProm
if xnAdd=0
xnAdd=Int(nvTex/20)
endif
Return xnAdd+nvTex
ENDPROC

Luis Maria Guayan

unread,
Oct 7, 2012, 11:11:17 AM10/7/12
to publice...@googlegroups.com
* Normal
? FLOOR(100 / FONTMETRIC(6,"Lucida Console",12))
* Negrita
? FLOOR(100 / FONTMETRIC(6,"Lucida Console",12,"B"))

Luis María Guayán
Tucumán, Argentina
_________________________
http://www.PortalFox.com
Nada corre como un zorro
_________________________

--
 
 
 

Luis Maria Guayan

unread,
Oct 7, 2012, 11:40:41 AM10/7/12
to publice...@googlegroups.com
Si trabajas con FONTMETRIC() la fórmula para 100 pixeles sería:


* Normal
? FLOOR(100 / FONTMETRIC(6,"Lucida Console",12))
* Negrita
? FLOOR(100 / FONTMETRIC(6,"Lucida Console",12,"B"))


Y si no obtienes los resultados en tus TextBoxes, puede deberse a que debes considerar el BorderStyle del TextBox que por defecto es 1 pixel y el Margin que por defecto son 2 pixeles, o sea que allí se suman 3 pixeles * 2 (derecho e izquierdo) = 6 pixeles menos

Mira este ejemplo configurando 0 BorderStyle y Margin en cada TextBox:


PUBLIC oForm1
oForm1 = NEWOBJECT("Form1")
oForm1.SHOW(1)
RETURN

DEFINE CLASS Form1 AS FORM

  AUTOCENTER = .T.
  CAPTION = "Ejemplo"
  NAME = "Form1"

  ADD OBJECT text1 AS TEXTBOX WITH ;
    FONTNAME = "Lucida Console", ;
    FONTSIZE = 12, FONTBOLD = .F., ;
    VALUE = "1234567890", ;
    BORDERSTYLE = 0, HEIGHT = 23, ;
    LEFT = 36, MARGIN = 0, ;
    TOP = 36, VISIBLE = .T., ;
    WIDTH = 100, NAME = "Text1", ;
    BACKCOLOR = 255

  ADD OBJECT text2 AS TEXTBOX WITH ;
    FONTNAME = "Lucida Console", ;
    FONTSIZE = 12,     FONTBOLD = .T., ;
    VALUE = "123456789", ;
    BORDERSTYLE = 0, HEIGHT = 23, ;
    LEFT = 36, MARGIN = 0, ;
    TOP = 84, VISIBLE = .T., ;
    WIDTH = 100, NAME = "Text2", ;
    BACKCOLOR = 255

ENDDEFINE


Luis María Guayán
Tucumán, Argentina
_________________________
http://www.PortalFox.com
Nada corre como un zorro
_________________________

--
 
 
 

Edgar Acevedo

unread,
Oct 7, 2012, 2:02:48 PM10/7/12
to publice...@googlegroups.com
Mil gracias Luis !

Justamente mi problema era que mi fórmula solo era (100 / FONTMETRIC(6,"Lucida Console",12))  y no usaba el FLOOR para siempre aproximar al entero inferior, como debiera ser.

Una vez mas, muy agradecido

Saludos,



Edgar


--
 
 
 

Edgar Acevedo

unread,
Oct 7, 2012, 2:18:25 PM10/7/12
to publice...@googlegroups.com
Hola Hugo:

Mi fórmula era (100 / FONTMETRIC(6,"Lucida Console",12))
Luis María me la corrigió agregándole la función FLOOR y ya me ha quedado bien el asunto.
       FONT(100 / FONTMETRIC(6,"Lucida Console",12))

Saludos y muchas gracias.


Edgar Acevedo.

--
 
 
 

edgar suarez kummers

unread,
Oct 7, 2012, 2:37:02 PM10/7/12
to publice...@googlegroups.com
Estimado Tocayo Edgar:

Se te lenguó la traba:

No es --> FONT(100 / FONTMETRIC(6,"Lucida Console",12))
Sino ---> FLOOR(100 / FONTMETRIC(6,"Lucida Console",12))

Muy buena la fórmula, felicitaciones a tí y a LMG


edgar suarez kummers


Edgar Acevedo

unread,
Oct 7, 2012, 2:56:15 PM10/7/12
to publice...@googlegroups.com
Ja, ja, ja, ja gracias por la corrección.  Todo fue por culpa de una foto de un nuevo auto ecológico que me enviaron que me dejó alucinando.  Te la comparto...


Imágenes integradas 1





--
 
 
 

image.jpeg

Miguel Canchas

unread,
Oct 7, 2012, 3:26:22 PM10/7/12
to publice...@googlegroups.com

Crei que hablabas de este carro :

 

http://acidcow.com/pics/20120928/i_like_big_butts_06.jpg

 

MK

--
 
 
 

image001.jpg
image002.jpg

HernanCano

unread,
Oct 7, 2012, 4:50:17 PM10/7/12
to publice...@googlegroups.com

Bien, Edgar.
¿Y cómo obtuviste (100 / FONTMETRIC(6,"Lucida Console",12)) sin el FLOOR?

Edgar Acevedo

unread,
Oct 7, 2012, 6:57:29 PM10/7/12
to publice...@googlegroups.com
Ejemplos:

?    (100 / FONTMETRIC(6,"Lucida Console",12))  te da 10.0000

Allí todo bien. Pero a veces lo tenía en modo "BOLD", entonces

?   (100 / FONTMETRIC(6,"Lucida Console",12,"B"))   me daba 11.1111

El problema estaba cuando me daba los decimales y aproximaba.  Con FLOOR siempre obtengo el entero mas bajo.

?   FLOOR(100 / FONTMETRIC(6,"Lucida Console",12,"B"))  te da 11

Parecerá poca cosa, pero quería poner de forma "programática" 48 controles entre TextBox, Labels y ComboBox, así que al aplicar varias veces esta fórmula en una misma línea las cosas no me quedaban bien debido a mi error de incluir los decimales en el cálculo.  Algunas líneas quedaban bien, otras quedaban como que "cortas" y otras como con "desperdicio".  En algún momento se me ocurrió "REDONDEAR" a enteros, pero fue una idea realmente estúpida.  Lo mejor es TRUNCAR al entero menor como me lo hizo ver Luis María.



--
 
 
 

mpulla

unread,
Oct 15, 2012, 11:56:27 PM10/15/12
to publice...@googlegroups.com, Edgar Acevedo

Hola FidelJ

Muy buen codigo.

Gracias por compartirlo.

Saludos.
Mauricio
Reply all
Reply to author
Forward
0 new messages