Firemonkey: уменьшите размер шрифта текста, чтобы он поместился в TLabel

Я пытаюсь уменьшить размер шрифта TLabel если его текст слишком велик, чтобы поместиться в пределах этикетки. Я не увидел каких-либо свойств, которые мог бы установить на ярлыке, чтобы достичь этого, поэтому я попытался написать свой собственный метод. Мой метод работает с использованием TCanvas.TextWidth чтобы измерить ширину текста в метке, и уменьшить шрифт, пока ширина текста не вписывается в ширину метки.

void __fastcall ShrinkFontToFitLabel( TCanvas * Canvas, TLabel * Label )
{
float NewFontSize = Label->Font->Size;

Canvas->Font->Family = Label->Font->Family;
Canvas->Font->Size = NewFontSize;

while( Canvas->TextWidth( Label->Text ) > Label->Width && NewFontSize > MinimumFontSize )
{
NewFontSize -= FontSizeDecrement;
Canvas->Font->Size = NewFontSize;
}

Label->Font->Size = NewFontSize;
}

Это работает иногда, но в других случаях оно не сжимает шрифт достаточно близко. Кажется, что значение, которое я получаю от звонка Canvas->TextWidth много раз, намного меньше, чем число пикселей в ширине, которое фактически должно быть для метки, чтобы соответствовать тексту.

Я использую Canvas->TextWidth неправильно? Есть ли лучший способ рассчитать ширину строки или изменить размер шрифта TLabel так его текст вписывается в его измерения?

Редактировать:
В этом случае я передаю свою функцию, TCanvas что мой лейбл сидит. Я пытался использовать это TCanvas так же как Label->Canvas, Оба дают мне одинаковое число для ширины текста, и оба не соответствуют фактическому значению в пикселях, необходимому для отображения всей строки.

0

Решение

Следующий код взят из кода, работающего в приложении FMX, слегка измененного для удаления массивов, которые проходят через итерацию, и объявления переменной локально для функции. Он запускается в методе TForm. Холст здесь — это Холст Формы. Вы можете видеть, что я использую «- 35» в какой-то момент — это может быть потому, что цифры были не совсем правильными.

double InitialFontSize = 30;
Canvas->Font->Size = InitialFontSize;
StoryHeadlineLabel->Font->Size = InitialFontSize;
bool fits = false;
do
{
double widthA = Canvas->TextWidth (StoryHeadlineLabel->Text);
if (widthA > StoryHeadlineLabel->Width - 35)
{
StoryHeadlineLabel->Font->Size --;
Canvas->Font->Size --;
}
else
fits = true;
if (StoryHeadlineLabel->Font->Size < 6)
fits = true;
} while (!fits);
0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector