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, Оба дают мне одинаковое число для ширины текста, и оба не соответствуют фактическому значению в пикселях, необходимому для отображения всей строки.

1 ответ

Решение

Следующий код взят из кода, работающего в приложении 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);
Другие вопросы по тегам