Да, согласен.
На XE5 Update 2 наблюдается, описанное вами поведение. На текущий момент это уже исправлено. Поэтому предлагаю для XE5 программное решение этой задачи:
procedure TForm1.FormCreate(Sender: TObject);
begin
FTextLyout := TTextLayoutManager.DefaultTextLayout.Create;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
FreeAndNil(FTextLyout);
end;
procedure TForm1.Label1Resize(Sender: TObject);
var
LabelTmp: TLabel;
begin
if Sender is TLabel then
begin
LabelTmp := Sender as TLabel;
FTextLyout.BeginUpdate;
try
FTextLyout.Text := LabelTmp.Text;
FTextLyout.MaxSize := TPointF.Create(LabelTmp.Width, 1000);
FTextLyout.WordWrap := LabelTmp.WordWrap;
FTextLyout.Font := LabelTmp.Font;
FTextLyout.HorizontalAlign := LabelTmp.TextAlign;
FTextLyout.VerticalAlign := LabelTmp.VertTextAlign;
finally
FTextLyout.EndUpdate;
end;
LabelTmp.Height := FTextLyout.Height;
end;
end;
Основная идея следующая: мы используем TTextLayout и параметры метки для вычисления размера текста в TLabel. На основании этого задаем новую высоту для метки.
Обратите внимание, что в этом примере все метки выравнены по верхнему и нижнему краю. Поэтому ширину для текста я указываю равной ширине метки. Если вам нужно вычислить ширину текста, то нужно задавать тогда высоту.
Событие TLabel.Label1Resize нужно задать событию OnResize у меток, где вы хотите автоматически вычислять высоту метки.
Рабочий пример можно скачать тут: LabelAutosizeDemo.zip