Перейти к содержанию
Fire Monkey от А до Я
  • 0

C++Builder 10.1 Upd1 и автоматическое изменение высоты TListBoxItem


antarey

Вопрос

Согласно мануалу  реализовал код
 

void TfrmMain::CalculateItemHeight(TObject *Sender)
{
    TTextLayout* FTextLayout = TTextLayoutManager::TextLayoutForClass(TTextLayoutManager::DefaultTextLayout);
    TListBoxItem *ListItem = dynamic_cast<TListBoxItem*>(Sender);

        FTextLayout->BeginUpdate();
        try
        {
            FTextLayout->Text = ListItem->Text;
            FTextLayout->MaxSize = TPointF(ListItem->Width, 1000);
            FTextLayout->WordWrap = ListItem->WordWrap;
            FTextLayout->Font = ListItem->Font;
            FTextLayout->HorizontalAlign = ListItem->TextAlign;
            FTextLayout->VerticalAlign = ListItem->VertTextAlign;
        }
        __finally
        {
            FTextLayout->EndUpdate();
        }

            ListItem->Height = FTextLayout->Height;
}

Прописал события для итема, итемы создаю в рантайме, и ничего :( 
Как автоматически подгонять высоту итема под текст? Что я не так сделал? 

Ссылка на комментарий

Рекомендуемые сообщения

  • 0
В 06.10.2016 в 00:14, antarey сказал:

Согласно мануалу  реализовал код
 


void TfrmMain::CalculateItemHeight(TObject *Sender)
{
    TTextLayout* FTextLayout = TTextLayoutManager::TextLayoutForClass(TTextLayoutManager::DefaultTextLayout);
    TListBoxItem *ListItem = dynamic_cast<TListBoxItem*>(Sender);

        FTextLayout->BeginUpdate();
        try
        {
            FTextLayout->Text = ListItem->Text;
            FTextLayout->MaxSize = TPointF(ListItem->Width, 1000);
            FTextLayout->WordWrap = ListItem->WordWrap;
            FTextLayout->Font = ListItem->Font;
            FTextLayout->HorizontalAlign = ListItem->TextAlign;
            FTextLayout->VerticalAlign = ListItem->VertTextAlign;
        }
        __finally
        {
            FTextLayout->EndUpdate();
        }

            ListItem->Height = FTextLayout->Height;
}

Прописал события для итема, итемы создаю в рантайме, и ничего :( 
Как автоматически подгонять высоту итема под текст? Что я не так сделал? 

Как мне кажется либо это событие не вызывается, либо Begin/end Update, лишние, потому как в этом режиме не весь код выполняется как обычно (практическое наблюдение) .

А запускал расчет высоты прямо в момент создания итема. Так он гарантированно выполнится. И если если предполагается возможность поворота экрана то еще на событие OnScale (или OnResize, на память не помню).

Ссылка на комментарий
  • 0

У меня используется такой код на Паскале (немного отличается от вашего):

procedure TFrmMain.CalculateItemHeight(Sender: TObject);
var
  ListItem: TListBoxItem;
  d: integer;
begin
  if Sender is TListBoxItem then
  begin
    ListItem := Sender as TListBoxItem;
    FTextLayout.BeginUpdate;
    try
      // Инициализируем текстовый слой для корректного вычисления
      // размеров отображаемого текста
      FTextLayout.Font.Assign(ListItem.Font);
      FTextLayout.VerticalAlign := ListItem.VertTextAlign;
      FTextLayout.HorizontalAlign := ListItem.TextAlign;
      FTextLayout.WordWrap := ListItem.WordWrap;
      FTextLayout.MaxSize := TPointF.Create(ListItem.Width, TTextLayout.MaxLayoutSize.Y);      
      FTextLayout.RightToLeft := false;
      FTextLayout.Text := ListItem.Text;
    finally
      FTextLayout.EndUpdate;
    end;
      d:=Round(FTextLayout.Height);
    try
      FTextLayout.Text:='m';
    finally
      FTextLayout.EndUpdate;
    end;
      d:=d+Round(FTextLayout.Height);
      ListItem.Height:=d;
  end;
end;

Попробуйте поставить процедуру CalculateItemHeight на OnApplyStyleLookup

Ссылка на комментарий
  • 0

Поставил, и на ресайз тоже. Я вроде где-то читал/слышал что в 10 добавили изменение высоты итема в свойства но в упор не нахожу такого.

22 часа назад, Rusland сказал:

try FTextLayout.Text:='m'; finally FTextLayout.EndUpdate; end;

Зачем етот код?
К сожалению не работает. У меня итем создается отдельной процедурой с пустым текстом. В другой процедуре прописывается текст.

Ссылка на комментарий
  • 0

Переделал код. В принципе работает, только немного обрезается текст сверху и снизу.
Rusland  не знаю как в делфи - в си округлять не обязательно - свойство Height - float.

Ссылка на комментарий
  • 0

Ярослав ни при чем. Там вопрос заключается в том - а на какую ширину раскидывается Layout ?

как ни странно в момент расчета Item.Width вообще 0

поэтому я беру в качестве width   ListBox.Width минус не помню наизусть, что то  типа ListBox.ItemMargins.Right , Left

Ссылка на комментарий

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...