Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   [BUG] ComboBoxEx (https://www.clubdelphi.com/foros/showthread.php?t=74486)

roman 22-06-2011 20:58:37

[BUG] ComboBoxEx
 
Usando un control ComboBoxEx en Delphi 7 me doy cuenta de lo siguiente.

Supongamos que llenamos el combo con 15 elementos:

Código Delphi [-]
for I := 1 to 15 do
  ComboBoxEx1.Items.Add(Format('Item %0.2d', [i]));

El combo se ve así:



Para poder ver todos los elementos al momento de desplegar la lista, ajusto la propiedad DropDownCount a 15. El resultado es el que se espera:

.

Sin embargo, si cambio el tamaño de letra del combo a 10 (el de defecto es 8), el resultado es este:



Es decir, que al parecer, el desplegado no toma en cuenta la altura real de cada elemento.

Revisando el código del componente, veo con sorpresa esto:

Código Delphi [-]
function TCustomComboBoxEx.GetItemHt: Integer;
begin
  Result := 16;
end;

¡Una constante! :eek:

El código del método correspondiente en el combo normal es así:

Código Delphi [-]
function TCustomComboBox.GetItemHt: Integer;
begin
  if FStyle in [csOwnerDrawFixed, csOwnerDrawVariable] then
    Result := FItemHeight else
    Result := Perform(CB_GETITEMHEIGHT, 0, 0);
end;

Cosa bastante más razonable.

Si redefino el método de esta manera:

Código Delphi [-]
function TComboBoxEx.GetItemHt: Integer;
begin
  Result := Perform(CB_GETITEMHEIGHT, 0, 0);
end;

el resultado vuelve a ser el esperado:



// Saludos

ecfisa 23-06-2011 00:10:57

Hola.

Nunca había usado el ComboBoxEx, pero tenés toda la razón.
Y agregando algo más, como tengo el tamaño de fuente en escala grande, poniendo DropDownCount:= 15 y Font.Size:= 8 obtengo el mismo resultado que vos con size = 10.
Para lograr visualizar los 15 items tuve que usar 'Currier New' y size = 6.
O sea que la cantidad de items mostrado depende también de la escala de font declarada en el S.O., como se desprende lógicamente del
código que implementaron en la función GetItemHt...

Saludos.

Al González 23-06-2011 00:11:06

Gracias por el aviso y la solución, Román. :)

Posiblemente le dijeron al programador en turno algo como:
Cita:

— ¡Hey! Liberamos versión en 4, 3, 2...
:p

Casimiro Notevi 23-06-2011 00:16:49

Pues en delphi2007 pone igual

Código Delphi [-]
function TCustomComboBoxEx.GetItemHt: Integer;
begin
  Result := 16;
end;

¿No habrá algún motivo?

Chris 23-06-2011 00:29:13

No ocupo el componente, pero que bueno que nos hallas avisado. A cómo dice Al, seguro eso ha de haber sido una pereza del programador.

Deberías reportar tu descubrimiento a Embarcadero.

Saludos,
Chris

roman 23-06-2011 05:40:08

Es curioso lo poco usado del componente a pesar de los beneficios que presenta. ¿O será que no reporta beneficios reales?

A decir verdad yo casi nunca lo había usado pero hoy lo hice por una única, simple y boba razón: tiene la propiedad Action de la que carece el combo regular. Cosa, por cierto, también inexplicable.

// Saludos

dec 17-04-2012 07:12:35

Hola,

Subo este hilo para indicar que en Delphi XE2 ocurre lo mismo, es decir:

Código Delphi [-]
function TCustomComboBoxEx.GetItemHt: Integer;
begin
  Result := 16;
end;

Yo he llegado aquí porque, si se incrementa la fuente del "Combo", el efecto es todavía "peor", puesto que la lista desplegable aparece muy pequeña, desproporcionada, sino se aplica la solución propuesta por Román.

Casimiro Notevi 17-04-2012 10:42:54

¿Qué esperarán para corregirlo? :confused:

dec 17-04-2012 13:56:16

Hola,

Igual no es un error Casimiro... aunque lo cierto es que ocurre lo que explica Román, y, si aumentas el tamaño de la fuente el efecto es mayor, no digamos si se usa el estilo "simple" del "ComboBoxEx". No sé. Lo cierto es que la solución propuesta por Román parece funcionar bien. :confused:

roman 18-04-2012 01:53:14

Jamás lo van a corregir. Si el autor de este hilo se hubiera tomado la molestia de consultar la ayuda habría visto esta descripción del método GetItemHt:

Cita:

Empezado por Ayuda de Delphi
Extended combo boxes do not support variable-height items. For this reason, TCustomComboBoxEx overrides the GetItemHt method so that it always returns 16.

:D

// Saludos

Casimiro Notevi 18-04-2012 02:06:24

Vaya, qué cosas :confused:

dec 18-04-2012 10:45:57

Hola,

De todas formas... sigo sin entender nada. ¿Cómo es que podemos nosotros sobreescribir el método y obtener los resultados esperados? ¿Estamos saltándonos alguna ley o algo? ¿Terminaremos obteniendo resultados "impredecibles"? ¿Qué me pasa, doctor? :D

roman 18-04-2012 17:41:54

Pues claro, yo tampoco entiendo. A mi juicio, la razón que da la ayuda es incorrecta porque en este caso específico no se trata de elementos de altura variable, sino de la misma altura en todos, que cambia sólo por el tamaño de la fuente.

// Saludos

dec 18-04-2012 19:03:08

Hola,

Por eso decía: a ver si va a haber algo escondido por ahí... tal vez el "error" provenga de que el alto del "ComboBox" no puede determinarse mediante la propiedad "ItemHeight", ni siquiera con la propiedad "Height", sino que depende del tamaño de la fuente. De hecho a mí me ha parecido leer algo sobre esto en la ayuda. Bueno. El caso es que la solución propuesta funciona como se espera, doy fe, también si se incrementa el tamaño de la fuente que viene predeterminado. ;)


La franja horaria es GMT +2. Ahora son las 22:56:42.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi