2010-04-27 14 views
15

Bien, este es el problema. Tengo un componente de etiqueta en un panel. La etiqueta está alineada como alClient y tiene habilitada la palabra. El texto puede variar de una línea a varias líneas. Me gustaría volver a dimensionar la altura del panel (y la etiqueta) para que se ajuste a todo el texto.Calcular el tamaño necesario para un TLabel

¿Cómo obtengo la altura necesaria de una etiqueta cuando conozco el texto y el ancho del panel?

Respuesta

15

Usted puede utilizar el método TCanvas.TextRect, junto con las banderas tfCalcRect y tfWordBreak:

var 
    lRect : TRect; 
    lText : string; 

begin 
    lRect.Left := 0; 
    lRect.Right := myWidth; 
    lRect.Top := 0; 
    lRect.Bottom := 0; 

    lText := myLabel.Caption; 

    myLabel.Canvas.TextRect( 
      {var} lRect, //will be modified to fit the text dimensions 
      {var} lText, //not modified, unless you use the "tfModifyingString" flag 
      [tfCalcRect, tfWordBreak] //flags to say "compute text dimensions with line breaks" 
     ); 
    ASSERT(lRect.Top = 0); //this shouldn't have moved 
    myLabel.Height := lRect.Bottom; 
end; 

TCanvas.TextRect envuelve una llamada a la función DrawTextEx de la API de Windows.

Las banderas tfCalcRect y tfWordBreak son envoltorios de Delphi para los valores DT_CALCRECT y DT_WORDBREAK de la API de Windows. Se puede encontrar información detallada acerca de sus efectos en la documentación DrawTextEx en msdn

+4

Debe agregar myLabel.Canvas.Font: = myLabel.Font antes de la línea TextRect. –

2

Si puede alinearlo al ToP y mantener AutoSize encendido, TLabel ajustará automáticamente la altura después de configurar el título.

+0

Esto realmente no funciona o funciona solo parcialmente. Por algún motivo, la etiqueta corta el texto de en el lado derecho. Solo muestra texto envuelto cuando hay una nueva línea. Entonces, si tiene un texto largo sin líneas nuevas, no lo ajusta, y no puede ver el texto completo – Asped

+0

@Asped Esto parece haber funcionado para mí en Delphi XE2, se ajusta correctamente y ajusta la altura automáticamente. – Alister

10

Use TextWidth y TextHeight.

ver un ejemplo aquí: http://www.greatis.com/delphicb/tips/lib/fonts-widthheight.html

TextWidth le dirá la amplia sería el texto, y luego se puede dividir que por el ancho de control para ver cuántas filas necesita. El resto de la división debe ser una fila adicional.

+0

esto podría salir mal si utiliza wordwrap y se necesita más de 1 línea adicional –

+0

esto es genial, ¿es posible determinar la casilla de verificación o el tamaño de la radio? Noté que cambia con la fuente y el tamaño del componente ... quiero decir que la caja es más grande o más pequeña ... –

3

puede utilizar una línea de código para este

label.width: = label.canvas.textwidth (Label.Caption);

o puede usar label autosize property para true en el inspector de objetos.

+1

Quiere cambiar el tamaño de la altura –

Cuestiones relacionadas