Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Otros entornos y lenguajes > C++ Builder
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 15-02-2017
Avatar de Angel.Matilla
Angel.Matilla Angel.Matilla is offline
Miembro
 
Registrado: ene 2007
Posts: 1.354
Poder: 19
Angel.Matilla Va por buen camino
Aspecto de un combobox

¿Existe la posibilidad de cambiar la altura de un TComboBox? Ahora mismo tengo varios puestos en un formulario pero por más que lo intento no puedo reducir la altura y el aspecto que queda es bastante feo porque los combos son más grandes que los TEdit que hay en el resto del formulario.
Responder Con Cita
  #2  
Antiguo 15-02-2017
Avatar de Caminante
Caminante Caminante is offline
Miembro
 
Registrado: oct 2010
Ubicación: Lima - Peru
Posts: 338
Poder: 15
Caminante Va camino a la fama
Hola

Hasta donde yo recuerdo la unica solucion era cambiar el tamaño de fuente del control ya que cambiar el tamaño del componente no surtia efecto.

Saludos
__________________
Caminante, son tus huellas el camino y nada más; Caminante, no hay camino, se hace camino al andar.
Antonio Machado
Responder Con Cita
  #3  
Antiguo 15-02-2017
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: may 2013
Posts: 885
Poder: 12
aguml Va por buen camino
Lo más fácil seria cambiar el tamaño de los TEdits para que tengan el tamaño de los TComboBoxs.
Lo difícil es lo que intentas aunque imposible no creo que sea. Prueba a ver si esto te sirve: http://forums.codeguru.com/showthrea...-designer-view

Última edición por aguml fecha: 15-02-2017 a las 21:08:49.
Responder Con Cita
  #4  
Antiguo 15-02-2017
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Tal como indica aguml, puedes usar un combobox "ownerdraw", o sea con su propiedad Style en csOwnerDrawFixed. Con eso, ajustando la propiedad ItemHeight obtienes la altura deseada para el combo. Sin embargo, el texto de cada item queda pegado al borde superior y se ve un poco feo. Para centrarlo tienes que implementar el evento OnDrawItem:

Código Delphi [-]
procedure TForm1.ComboBox1DrawItem(Control: TWinControl; Index: Integer; Rect: TRect; State: TOwnerDrawState);
begin
  with (Control as TCustomComboBox) do
  begin
    Canvas.FillRect(Rect);
    InflateRect(Rect, -2, 0);
    Windows.DrawText(Canvas.Handle, PChar(Items[Index]), -1, Rect, DT_SINGLELINE or DT_VCENTER);
  end;
end;

LineComment Saludos
Responder Con Cita
  #5  
Antiguo 15-02-2017
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola.

No se si te sirva pero, de forma similar al enlace que puso aguml un ejemplo usando las propiedades ItemHeight y Height para lograr el cometido:

Código PHP:
void __fastcall TForm1::FormCreate(TObject *Sender)
{
   
ComboBox1->Style     csOwnerDrawVariable;
   
ComboBox1->ItemIndex 0;
}

void __fastcall TForm1::ReduceClick(TObject *Sender)
{
  
ComboBox1->ItemHeight ComboBox1->ItemHeight 2;
  
ComboBox1->Height     ComboBox1->Height 1;
}

void __fastcall TForm1::btnIncreaseClick(TObject *Sender)
{
  
ComboBox1->ItemHeight ComboBox1->ItemHeight 2;
  
ComboBox1->Height     ComboBox1->Height 1;

Efecto:


Saludos

Edito: Y agregando la rutina de roman (que no había visto al momento de este), ciertamente queda mucho mejor presentado.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....

Última edición por ecfisa fecha: 15-02-2017 a las 22:44:54.
Responder Con Cita
  #6  
Antiguo 15-02-2017
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Cita:
Empezado por Angel.Matilla Ver Mensaje
porque los combos son más grandes que los TEdit que hay en el resto del formulario.
Por otro lado, ¿cómo es posible esto? Es decir, por defecto los combos y los edit son del mismo tamaño (altura) que está dado por el tamaño de la fuente de caracteres. Si cambias la fuente del combo a que sea igual a la que usas en los edit, se verían similares ¿no?

LineComment Saludos
Responder Con Cita
  #7  
Antiguo 16-02-2017
Avatar de AgustinOrtu
[AgustinOrtu] AgustinOrtu is offline
Miembro Premium
NULL
 
Registrado: ago 2013
Ubicación: Argentina
Posts: 1.858
Poder: 16
AgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en bruto
Usando las ideas de roman y ecfisa

No he cambiado ninguna propiedad en tiempo de diseño, todo lo hago en ejecucion

Código Delphi [-]
procedure TForm2.FormCreate(Sender: TObject);
begin
  ComboBox1.Style := TComboBoxStyle.csOwnerDrawFixed;
  ComboBox1.OnDrawItem := ComboBox1DrawItem;
  ComboBox1.Font.Size := 14;
  ComboBox1.Canvas.Font.Size := 14;
  ComboBox1.ItemHeight := ComboBox1.Canvas.TextHeight('|') + 2;
  // cargo el combo con la lista de fuentes del sistema para ver como queda
  ComboBox1.Items := Screen.Fonts;
  ComboBox1.ItemIndex := 0;
end;

procedure TForm2.ComboBox1DrawItem(Control: TWinControl; Index: Integer; Rect: TRect; State: TOwnerDrawState);
var
  Target: TComboBox absolute Control;
begin
  Target.Canvas.FillRect(Rect);
  if (Index >= 0) and (Index < Target.Items.Count) then
  begin
    if ([odComboBoxEdit, odSelected] * State = [odComboBoxEdit, odSelected]) then
      Target.Canvas.Font.Color := clHighlightText;

    Target.Canvas.TextRect(Rect, Rect.Left + 2, Rect.Top + 2, Target.Items[Index]);
  end;
end;

// lo que sigue es el codigo de los botones
procedure TForm2.btnIncreaseClick(Sender: TObject);
begin
  ComboBox1.Font.Size := ComboBox1.Font.Size + 1;
  ComboBox1.Canvas.Font.Size := ComboBox1.Canvas.Font.Size + 1;
  ComboBox1.Height := ComboBox1.Height - 1;
  ComboBox1.ItemHeight := ComboBox1.Canvas.TextHeight('|') + 2;
end;

procedure TForm2.btnReduceClick(Sender: TObject);
begin
  ComboBox1.Font.Size := ComboBox1.Font.Size - 1;
  ComboBox1.Canvas.Font.Size := ComboBox1.Canvas.Font.Size - 1;
  ComboBox1.Height := ComboBox1.Height + 1;
  ComboBox1.ItemHeight := ComboBox1.Canvas.TextHeight('|') + 2;
end;



Edito: Probando me estoy dando cuenta de que el evento OnDrawItem no es estrictamente necesario:

Cita:
If an OnDrawItem event handler is not provided, the combo box fills the Rect parameter with the current brush and writes the text value of the item specified by the Index parameter.

Última edición por AgustinOrtu fecha: 16-02-2017 a las 00:29:36.
Responder Con Cita
  #8  
Antiguo 16-02-2017
Avatar de Angel.Matilla
Angel.Matilla Angel.Matilla is offline
Miembro
 
Registrado: ene 2007
Posts: 1.354
Poder: 19
Angel.Matilla Va por buen camino
Gracias por vuestras respuestas. Me ha sido útiles pero al final me dieron una solución que creo más sencilla: Poner en el constructor del formulario
Código:
SendMessage(ComboBox1->Handle, CB_SETITEMHEIGHT, -1, <altura en píxeles>);
Responder Con Cita
  #9  
Antiguo 16-02-2017
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Cita:
Empezado por AgustinOrtu Ver Mensaje
Edito: Probando me estoy dando cuenta de que el evento OnDrawItem no es estrictamente necesario:
Así es, pero tal como comenté en el mensaje, el texto no queda centrado verticalmente

LineComment Saludos
Responder Con Cita
  #10  
Antiguo 16-02-2017
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Cita:
Empezado por Angel.Matilla Ver Mensaje
Gracias por vuestras respuestas. Me ha sido útiles pero al final me dieron una solución que creo más sencilla: Poner en el constructor del formulario
Código:
SendMessage(ComboBox1->Handle, CB_SETITEMHEIGHT, -1, <altura en píxeles>);
Pues sí que es sencilla. Pero más sencilla es cambiar la propiedad ItemHeight, tal como te habíamos dicho

LineComment Saludos
Responder Con Cita
  #11  
Antiguo 16-02-2017
Avatar de Angel.Matilla
Angel.Matilla Angel.Matilla is offline
Miembro
 
Registrado: ene 2007
Posts: 1.354
Poder: 19
Angel.Matilla Va por buen camino
Cita:
Empezado por roman Ver Mensaje
Pues sí que es sencilla. Pero más sencilla es cambiar la propiedad ItemHeight, tal como te habíamos dicho
El probela de esta solcuión es que los elementos pueden llegara a amontonarse al desplegar el combo.
Responder Con Cita
  #12  
Antiguo 16-02-2017
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Y de la otra forma, ¿cómo queda? ¿Puedes poner una imagen?

LineComment Saludos
Responder Con Cita
  #13  
Antiguo 16-02-2017
Avatar de Angel.Matilla
Angel.Matilla Angel.Matilla is offline
Miembro
 
Registrado: ene 2007
Posts: 1.354
Poder: 19
Angel.Matilla Va por buen camino
Cita:
Empezado por roman Ver Mensaje
Y de la otra forma, ¿cómo queda? ¿Puedes poner una imagen?
Pues lo cierto es que la diferencia es menor de lo que me había parecido. Probaré porque tal vez sea mejor solución.
Responder Con Cita
  #14  
Antiguo 16-02-2017
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Pues sí. Es que, a fin de cuentas, si no cabe, no cabe Independientemente del método.

LineComment Saludos
Responder Con Cita
  #15  
Antiguo 16-02-2017
Avatar de AgustinOrtu
[AgustinOrtu] AgustinOrtu is offline
Miembro Premium
NULL
 
Registrado: ago 2013
Ubicación: Argentina
Posts: 1.858
Poder: 16
AgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en bruto
Cita:
Empezado por roman Ver Mensaje
Así es, pero tal como comenté en el mensaje, el texto no queda centrado verticalment
Tenes razon, me pregunto porque lo habran implementado de esa manera. Aunque tuve que hacerme este ejemplo para darme cuenta

Responder Con Cita
  #16  
Antiguo 16-02-2017
Avatar de _Leo
_Leo _Leo is offline
Miembro
 
Registrado: ene 2017
Ubicación: Lanzarote (Islas Canarias)
Posts: 38
Poder: 0
_Leo Va camino a la fama
Cita:
Empezado por Angel.Matilla Ver Mensaje
Pues lo cierto es que la diferencia es menor de lo que me había parecido. Probaré porque tal vez sea mejor solución.
Use SendMessage intencionadamente porque solo cambia el alto del Combo y no de los elementos, pero claro si quieres que también cambie la altura de los distintos elementos lo mejor es lo que comenta Román más arriba. Son igualmente un par de líneas, y opcionalmente el DrawItem para que se muestre el texto centrado verticalmente.
Responder Con Cita
  #17  
Antiguo 16-02-2017
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Ahora que lo mencionas, me parece que hay un problema con la solución del SendMessage. En Delphi 7 al menos, al desplegar el combo la VCL lo regresa a su estado inicial.

LineComment Saludos
Responder Con Cita
  #18  
Antiguo 17-02-2017
Avatar de _Leo
_Leo _Leo is offline
Miembro
 
Registrado: ene 2017
Ubicación: Lanzarote (Islas Canarias)
Posts: 38
Poder: 0
_Leo Va camino a la fama
Cita:
Empezado por roman Ver Mensaje
Ahora que lo mencionas, me parece que hay un problema con la solución del SendMessage. En Delphi 7 al menos, al desplegar el combo la VCL lo regresa a su estado inicial.

LineComment Saludos
En C++Builder va bien, probado en las versiones 1, 4, 6, 2010, XE4 y 10.1, por lo menos ese problema que comentas.

(Aunque Angel no lo menciona, antes del SendMessage hay que poner la propiedad Style a csOwnerDrawVariable)
Responder Con Cita
  #19  
Antiguo 17-02-2017
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Cita:
Empezado por _Leo Ver Mensaje
(Aunque Angel no lo menciona, antes del SendMessage hay que poner la propiedad Style a csOwnerDrawVariable)
Esto es lo que faltaba. Con ello desaparece el problema que veía

LineComment Saludos
Responder Con Cita
  #20  
Antiguo 17-02-2017
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: may 2013
Posts: 885
Poder: 12
aguml Va por buen camino
Supongo que para que no se amontonen puedes reducir el número de Items que se muestran. Por defecto son 8.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Aspecto de un trackbar davidj Varios 2 21-10-2007 17:34:21
boton con aspecto de link halizia HTML, Javascript y otros 28 25-04-2007 20:51:10
Aspecto XP trabuc Varios 2 01-12-2004 16:02:51
Aspecto del formulario sur-se OOP 0 27-09-2004 12:39:46
Formulario con aspecto XP fjolivares Varios 5 09-01-2004 15:55:09


La franja horaria es GMT +2. Ahora son las 00:45:21.


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
Copyright 1996-2007 Club Delphi