Calculate needed size for a TLabel

delphi

Solution

You can use the TCanvas.TextRect method, along with the tfCalcRect and tfWordBreak flags :

var
  lRect : TRect;
  lText : string;

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

  myLabel.Canvas.Font := myLabel.Font;
  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` wraps a call to the `DrawTextEx` function from the Windows API.

The `tfCalcRect` and `tfWordBreak` flags are delphi wrappers for the values `DT_CALCRECT` and `DT_WORDBREAK` of the windows API. You can find detailed information about their effects in the `DrawTextEx` documentation on msdn

Problem

Ok, here's the problem. I have a label component in a panel. The label is aligned as alClient and has wordwrap enabled. The text can vary from one line to several lines. I would like to re-size the height of the the panel (and the label) to fit all the text. How do I get the necessary height of a label when I know the text and the width of the panel?

Original source