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?