Ayuda para ajustar tamaño de Contenedor

550 views
Skip to first unread message

Alejandro Garcia G.

unread,
Oct 29, 2016, 12:19:40 PM10/29/16
to Comunidad de Visual Foxpro en Español
Saludos a todos.

Estoy tratando de realizar una clase contenedora, dentro voy a colocar un Label a partir de la posición 5 (Left = 5), ¿Cómo puedo hacer para que independientemente del largo del texto, se ajuste el tamaño del contenedor y un poco mas?, algo similar a como sucede con los botones normales que trae VFP.

¿Se puede eso?.

P.D.: El control se inicia con un Label de tamaño X, yo dentro del código puedo cambiar dicho Label y hacerlo mas grande o mas pequeño y se autoajuste de manera automatica.

Ultraton500

unread,
Oct 29, 2016, 3:00:06 PM10/29/16
to Comunidad de Visual Foxpro en Español
Alejandro, la única función de vfp indicada para eso es TXTWIDTH( ) pero entiendo que no tiene precisión ya que su forma de calcular el ancho de una cadena es multiplicando la cantidad de caracteres por el ancho promedio de caracteres de la fuente utilizada. Es decir que devolvería el mismo valor tanto para "iii" como para "www".
Si no hubiese una mejor solución y estuviese realmente decidido a lograr este objetivo me tomaría el trabajo (con un editor gráfico) de contar cuántos píxeles tiene de ancho cada letra (mayúscula, minúscula y acentuada), número o símbolo en la fuente que utilizo en el label y con esos datos hago una función que recorra la cadena sumando caracter a caracter su longitud en píxeles y así poder establecer su ancho y entonces ajustar el contenedor.
Esto sería factible si el label siempre tendría el mismo tipo y tamaño de fuente y si no fuese multilínea (WORDWRAP=.F.).

Saludos,
Javier.

HernanCano

unread,
Oct 30, 2016, 2:29:49 AM10/30/16
to Comunidad de Visual Foxpro en Español
Alejandro:

¿ .AutoSize ?

Fidel Charny

unread,
Oct 30, 2016, 9:50:28 AM10/30/16
to Comunidad de Visual Foxpro en Español
Yo utilizo la función que copio abajo. Para el caso, conocido el texto se determina el espacio que ocupa y en función de ese espacio ajustas el tamaño del container.


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



El sábado, 29 de octubre de 2016, 13:19:40 (UTC-3), Alejandro Garcia G. escribió:

Carton Jeston (9.0.0.7423)

unread,
Mar 30, 2017, 5:01:00 PM3/30/17
to Comunidad de Visual Foxpro en Español
Aunque ya hace un tiempo, decirte que aunque tenia mi funcion para hacer lo mismo, me gusto mas la tuya ya que la veo mas completa.

Mario López

unread,
Mar 31, 2017, 8:56:08 AM3/31/17
to Comunidad de Visual Foxpro en Español

@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


Carlos Miguel FARIAS

unread,
Mar 31, 2017, 9:36:41 AM3/31/17
to Grupo Fox
Siendo viernes hoy, entiendo que si el plato es suficientemente grande y esta bien lleno, hay que darle con el tenedor sin asco.
Las opciones son o que ajustes el contenedor al contenido o el contenido al contenedor. Para ajustar el contenido al contenedor puedes usar la propiedad anchor.
En las GUI por ejemplo para python, los contenedores se ajustan en forma automática al contenido si no se le fija dimensiones, caso contrario se puede trabajar con diferentes variantes de ajuste (tanto de contenedores como contenidos).
Saludos: Miguel, La Pampa (RA)

Fidel Charny

unread,
Mar 31, 2017, 11:43:40 AM3/31/17
to Comunidad de Visual Foxpro en Español
Bien Mario, eso da un resultado muy preciso.

Antonio Meza

unread,
Mar 31, 2017, 11:46:16 AM3/31/17
to Comunidad de Visual Foxpro en Español
Y no es mas sencillo simplemente hacer esto

_space = 30
this.container.Width = this.textbox.Width + _space

* Centrar el Texto 
this.textBox.left = (this.container.Width - this.textBox.Width) / 2

Donde _space es cualquier variable para indicar el espacio que quieres que tenga el container adicional al tamaño del textbox.

Nota: Es la formula que uso en FoxyRb para obtener el tamaño de las pestañas, grupos y botones.

saludos
Antonio Meza

Alejandro Garcia G.

unread,
Mar 31, 2017, 12:01:09 PM3/31/17
to Comunidad de Visual Foxpro en Español
Ya yo habia olvidado esto pero ya que lo revivieron voy a aplicar algunos consejos.

Saludos, y buen dato Antonio.

Fidel Charny

unread,
Mar 31, 2017, 4:31:57 PM3/31/17
to Comunidad de Visual Foxpro en Español
Antonio:
El tema ya estaba muerto, solo que apareció Carton Jeston con una observación. Lo que dices es más sencillo, pero no tiene que ver con lo que se solicitó, que trata de atacar el problema de un control label autosize=.t., donde resulta necesario calcular el espacio que ocupará el nuevo .caption, para ajustar el tamaño del Container.

Antonio Meza

unread,
Mar 31, 2017, 5:52:12 PM3/31/17
to Comunidad de Visual Foxpro en Español
FoxyRb esta compuesto por containers, una pestaña (tab) es un container que tiene dentro un label con autosize = .t., y para determinar el tamaño de la pestaña (container) que depende del tamaño del texto simplemente hago lo que comente.

Nota: En vez de poner Label puse TextBox jajajajaj a lo mejor por eso piensas que no funciona pero tan así que funciona que lo puede ver en FoxyRb.

saludos
Antonio Meza

Fidel Charny

unread,
Apr 1, 2017, 10:20:48 AM4/1/17
to Comunidad de Visual Foxpro en Español
Recalculando, recalculando...
Para no afectar el Screen (solamente por el uso interactivo, con esas consultas rápidas que uno hace al trabajar), tomando tu idea, lo pongo de este modo:
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



El viernes, 31 de marzo de 2017, 9:56:08 (UTC-3), Mario López escribió:

ZeRoberto

unread,
Apr 2, 2017, 12:05:55 AM4/2/17
to publicesvfoxpro
Usa TxtWidth()

Saludos
Reply all
Reply to author
Forward
0 new messages