Ajustar ancho desplegable en combo

932 views
Skip to first unread message

Toni Akux

unread,
Dec 27, 2014, 10:42:05 AM12/27/14
to publice...@googlegroups.com
Hola Amig@s,
Pues bien, este es un problema que he ido arrastrando desde hace tiempo y no encuentro solución. Veréis, cuando asocio un cursor a un combo, me muestra en el desplegable todos los datos de ese cursor, hasta ahí, perfecto. El problema es que el ancho del desplegable no me coincide con el ancho del control Combo, pues el ancho me que al tamaño del campo que muestro (algunas veces se queda corto y otras es mas ancho que el propio combo. Esto sí ocurre cuando a un Combo le asigno los valores manualmente, al desplegar éste despliega en todo lo ancho del combo, sin alargarse ni acortarse.
Por si sirve de referencia, os explico exactamente como asigno el cursor al Combo:
1.- Hago el SELECT de un ID y un Nombre, y lo almaceno en un cursor, por ejemplo CUR01
2.- Le indico al Combo el Row Source: ThisForm.Combo.RowSource="ALLTRIM(CUR01.Nombre),ID"
3.- Propiedades del Combo:
  • BoundColumn = 2
  • Bound To = .T.
  • ColumnCount = 1
  • RowSourceType = 6 (Fields)
He intentado jugar con el ColumnWidths pero no creo que sea la solución. ¿Qué opinais?

Un saludo,

ZeRoberto

unread,
Dec 27, 2014, 10:48:50 AM12/27/14
to publicesvfoxpro
Creo que lo toma del ancho del campo. Eso se lo puede controlar si se tiene mas de  campo a mostrar.

Toni Akux

unread,
Dec 27, 2014, 11:56:49 AM12/27/14
to publice...@googlegroups.com
Hola Ze Roberto,
Efectivamente el ancho lo coge del campo. Antes olvidé mencionar que esto lo soluciono de una manera chapucera así:

ThisForm.Combo1.ColumnWidths = ALLTRIM(STR(ThisForm.Combo1.Width - 24)) + ",0"

¿Por qué 24? No lo sé. Si hago esto, cambio el nº de columnas a dos (ColumnCount=2) y quito las líneas entre campos (ColumnLines=.F.), se queda clavao siempre.
Como me parece una chapuza, pensé que esto le habría pasado a más gente y me gustaría saber como lo hanido solucionando.

Un saludo,

Carlos Alfaro

unread,
Dec 27, 2014, 12:52:29 PM12/27/14
to publice...@googlegroups.com

Saludos estimado colega:

 

Puede ser que yo esté equivocado, proba llenando la propiedad InputMask del Combobox con tantas X como máximo de dígitos pueda tener el contenido.

 

Bendiciones.

 

Carlos Alfaro

Allan Raúl Acuña

unread,
Dec 27, 2014, 12:57:36 PM12/27/14
to publice...@googlegroups.com
Utiliza la propiedad ColumnWidths

Si tu cursor tiene 2 columnas y deseas mostrar una de ellas, entonces:

ColumnWidths=100,0

Así solo se mostraría el primer campo del cursor


Saludos cordiales.

Lic. Allan Raúl Acuña
Analista Programador
msn= allan...@hotmail.com
skype= NicEasySoft
            +(505) 8 999 8950
Managua, Nicaragua
Centroamérica



From: publice...@googlegroups.com
To: publice...@googlegroups.com
Subject: RE: [vfp] Ajustar ancho desplegable en combo
Date: Sat, 27 Dec 2014 11:52:16 -0600

integral

unread,
Dec 27, 2014, 3:59:13 PM12/27/14
to publice...@googlegroups.com
Estimado Amigo :

En mi caso utilizo el siguiente codigo desde hace varios años y me ha funcionado perfectamente. En verdad no me gusta ver un control Combobox cuyo ancho del contenido sea mayor...

Ej.-

Thisform.CboTipoCampana.ColumnCount  = 2
Thisform.CboTipoCampana.ColumnWidths = "83,0"
Thisform.CboTipoCampana.ColumnLines  = .F.

Espero haber respondido a tu pregunta.

Saludos,

INTEGRAL

Fidel Charny

unread,
Dec 28, 2014, 10:38:03 AM12/28/14
to publice...@googlegroups.com
Te puedes ayudar con la función Get_Pixel().
LOCAL lnMax,lcMaxLenght,lnRec,lcPatron,lnAlternativa,;
    lcFontName
,lnFontSize,lnColumns
lnMax
=0
lcPatron
=""
lcFontName
="Arial"
lnFontSize
=8
lnAlternativa
=0
lnColumns
=1

SELECT NOMBRE
,CUIT FROM CLIENTES WHERE !DELETED();
     ORDER BY nombre
into cursor pepa

IF lnAlternativa
=0
   
* Buscar el valor más ancho
    SCAN
        IF LEN
(TRIM(nombre))>lnMax
            lnMax
=LEN(TRIM(nombre))
            lcPatron
=TRIM(nombre)
        ENDIF
    ENDSCAN
    GO top
ELSE
   
* Utilizar un patrón aproximado
   
LcPatron=LEFT(REPLICATE("ADIJTZ",10),LEN(pepa.nombre))
ENDIF

WITH THIS
   
.Rowsourcetype=2
   
.ROWSOURCE="pepa.nombre,cuit"
   
.ControlSource="pepa.nombre"
   
.ColumnCount=lnColumns
   
.ColumnWidths=TRANSFORM(Get_Pixel(lcPatron,lcFontName,lnFontSize));
       
+IIF(lnColumns=1, "" , ","+TRANSFORM(Get_Pixel("99-99999999-9",lcFontName,lnFontSize)))
   
ENDWITH

Función Get_Pixel
*!*    -----------------
Procedure Get_Pixel
*!*    ----------------
LPARAMETERS tcString
,tcFontName,tnFontSize,tcEstilo,tnAddSpace
*!*    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"
LOCAL lnPixels
, i ,lcEstilo,lcSub
lcEstilo
=""
lnPixels
=0
tcFontName
=EVL(tcFontName,"Arial")
tnFontSize
=EVL(tnFontSize,8)

if Vartype(tcEstilo)#"C"
    tcEstilo
=IIF(Vartype(tcEstilo)="L",iif(tcEstilo,"B","N"),"N")
ENDIF
tcEstilo
=ALLTRIM(UPPER(EVL(tcEstilo,"N")))
FOR i
=1 TO LEN(tcEstilo)
    lcSub
=SUBSTR(tcEstilo,i,1)
    lcSub
=IIF(lcSub $ _ESTILO_,lcSub,"N")
    IF AT
(lcsub,lcEstilo)=0
        lcEstilo
=LcEstilo + lcSub
    ENDIF
NEXT

lnPixels
=TxtWidth(tcString,tcFontName,tnFontSize,lcEstilo) * ;
     
FontMetric(6,tcFontName,tnFontSize,lcEstilo)

Return lnPixels +  EVL(tnAddSpace , INT(lnPixels/20) )
ENDPROC




Fernando D. Bozzo

unread,
Dec 29, 2014, 3:14:48 AM12/29/14
to publice...@googlegroups.com
Hola Toni:

Realmente no es una chapuza tu solución, sino matemática :-)

Para calcular el ancho de la opción, creo que los parámetros son estos, que al final coinciden casi justo con tus valores:

*-- "this" se refiere al combobox, en el método Init.
this.ColumnCount = 2
this.ColumnWidths = TRANSFORM( this.Width - SYSMETRIC(5) - SYSMETRIC(12) * 2 ) + ',0'

Lo anterior es considerando mostrar una columna. La segunda solo se agrega para limitar a la primera, y si no se muestran las líneas entre columnas hay que restar la cantidad de (columas-1)


Saludos!
Reply all
Reply to author
Forward
0 new messages