Я наступил на те же грабли что и уважаемый HyperZen. Причем наступал я на эти грабли много раз раз, в каждой версии Delphi.
Малюсенькое исправление решает проблему:
function SetupTextObject(const AName, AText : String; AWidth, AHeight, X , Y : Single;
AAlign, AVertAlign: TListItemAlign; ATextAlign, ATextVertAlign: TTextAlign) : TListItemText;
begin
Result:=TListItemText(AItem.View.FindDrawable(AName));
if Result=Nil then
begin
Result:=TListItemText.Create(AItem);
Result.Name:=AName;
Result.Width:=AWidth;
//*********************************************************
Result.Font.Size:=Result.Font.Size + 0.01; // Вот этот костыль заставляет все работать как задуманно.
//*********************************************************
Result.Text:=AText;
Result.PlaceOffset.X:=X;
Result.PlaceOffset.Y:=Y;
Result.Align:=AAlign;
Result.VertAlign:=AVertAlign;
Result.TextAlign:=ATextAlign;
Result.TextVertAlign:=ATextVertAlign;
if AHeight=-1 then
begin
if FListViewItemTextHeigh=-1 then // Так как везде один шрифт, то вычисляем высоту текста однократно
begin
FListViewItemTextHeigh:=GetTextHeight(Result, AWidth, AText);
Result.Height:=FListViewItemTextHeigh;
end
else
Result.Height:=FListViewItemTextHeigh;
end
else
Result.Height:=AHeight;
end;
end;
Проблема в старинном глюке эмбаркадеровского ListView - вычисление высоты текста на этапе создания, или позднее не имеет смысла, потому как размер шрифта по умолчанию (обычно 12), перед отрисовкой превратиться во все что угодно, но не в 12, стиль применит свой размер шрифта и ваши расчеты высоты итема можно будет выкинуть. Победить глюк можно только установкой своего размера (обязательно отличного от 12 - цифра 12 "мудро" используется ембаркадерой как флаг означающий что можно применить стиль.
Помню что задавал здесь этот вопрос не раз, но так и не получил ответа - как узнать размер шрифта из стиля, а не из FontSize????????????????!!!!!!!!!!!!!! Только с размерами шрифта из стиля имеет смысл расчитывать высоту.
Даже в стандартых примерах эмбаркадыры этот скользкий момент старательно обходится и внимание на нем не концентрируется. Вот пример \Studio\18.0\Samples\Object Pascal\Multi-Device Samples\User Interface\ListView\VariableHeightItems:
Drawable.Font.Size := 1; // Ensure that default font sizes do not play against us
Drawable.Font.Size := 10 + Random(4) * 4;
они делают хитро, вместо стандартный 12 пишут 1, а потом уже вписывают нужные значения. Если закомментировать эти две строчки (или написать Drawable.Font.Size := 12), то пример перестает работать, текст режется.