PDA

Ver la Versión Completa : Ajustar ancho del desplegable de un ComboBox


hector.roma
17-10-2006, 00:20:57
Hola a todos, y gracias por su ayuda

Tengo unos ComboBoxes con muy poco Width pero conteniendo unos Items que no entran en el Width del ComboBox. ¿Hay alguna forma para que al desplegar el ComboBox, el ancho de lo desplegado se ajuste al item del de mayor tamaño?


Para mayor claridad espero, imaginemos el siguiente ComboBox (recordad, imaginemos):

[____][V] bonito verdad!!, y supongamos que el width del ComboBox, es el que vemos y pensemos en elementos como: "El Conde Dracula", "Demencia 13", "La orgía nocturana de los vampiros", si desplegamos el ComboBox tendríamos algo como

[____][V]
|El Cond|
|Demenci|
|La orgí|
---------

cuando mi intención, y mi pregunta es si me podéis orientar para alcanzar el objetivo de tener un resultado similar a:
[____][V]___________________________
|El Conde Drácula |
|Demencia 13 |
|La orgía nocturna de los vampiros |
------------------------------------


Gracias y espero que mis AsciiComboBox's sean de ayuda.

hector.roma
17-10-2006, 00:22:45
Lógica y realmente las paredes del último AsciiComboBox, deberían estar alineadas al de mayor ancho.

Bicho
17-10-2006, 09:20:24
Hola, pues si le echas un vistazo a la seccion de trucos (http://www.clubdelphi.com/trucos/index.php) puedes encontrarte con éste (http://www.clubdelphi.com/trucos/index.php?id=74) que lo que hace es modificar el ancho del mismo en tiempo de ejecución.

Espero te sirva,

Saludos

Lepe
17-10-2006, 09:46:42
Para saber el ancho que tiene en Pixels según la fuente elegida, pues usa la humilde rutina FontWidth (http://www.clubdelphi.com/foros/showpost.php?p=89981&postcount=6), o bien incluso el Combo1.canvas.TextWidth.


AnchoDelCombo := Fontwidth(Combo1.Font, Combo1.items[3]);


Para hacer más eficiente el tema, guardar en un .ini, registro, etc, el máximo ancho que hay por el momento; al añadir un texto al combo, se compara el máximo ancho con el ancho del nuevo Item y si es mayor el nuevo, guardarlo en el .ini, así evitamos hacer las comparaciones con todos los elementos cada vez que se despliega el combo.

Saludos

Bicho
17-10-2006, 09:50:49
Bueno, he estado entretenido y se me han adelantado, pero he podido hacer un ejemplo que contrasta el truco con lo que comenta Lepe.


var
Ancho, x, aux: integer;
begin
Ancho := 0;
aux := 0;
for x := 0 to ComboBox1.Items.Count - 1 do begin
aux := Combobox1.Canvas.TextWidth(Combobox1.Items.Strings[x]);
if aux > Ancho then Ancho := aux;
end;

ComboBox1.Perform(CB_SetDroppedWidth,Ancho,0);


Espero te sirva,

Saludos

hector.roma
19-10-2006, 00:33:23
Ciertamente, la sección de trucos siempre es mi gran olvidada y a ella le debo muchas horas ahorradas.

Gracias a todos por recordarme su existencia, y gracias por la ayuda.