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

У меня не получается обновить высоту своего класса итема для TListBox


kvantum

Вопрос

Здравствуйте ! 

 

Во вложении - тестовое приложение, иллюстрирующее суть проблемы.

 

Есть пользовательский элемент списка 

TCustomListBoxItem = class(TListBoxItem)

, содержащий:

  1. Изображение,
  2. Наименование даты
  3. Текстовое описание непостоянной длинны.

В зависимости от длинны описания меняется высота TCustomListBoxItem.

 

Метод TCustomListBoxItem.SyncChildSizes вычисляет высоту элемента списка в зависимости от содержимого и вызывается из обработчиков TCustomListBoxItem.OnResize и TCustomListBoxItem.OnApplyStyleLookup.

 

Форма приложения содержит две вкладки, вторая из которых содержит сам список и две кнопки для его пополнения и очистки. Первая вкладка содержит только две кнопки, наследующие обработчики кнопок второй вкладки.

 

Суть проблемы

  • Если нажать кнопку "Добавить" на первой вкладке и активировать список на второй вкладке - его элементы (TCustomListBoxItem) будут "навалены" один на другой.
  • Если нажать кнопку "Добавить" на второй вкладке, которая содержит сам список - элементы в нем отображаются корректно.

Скриншоты во вложении.

post-1-0-33177000-1407267498_thumb.jpgpost-1-0-88452300-1407267498_thumb.jpgpost-1-0-38772700-1407267499_thumb.jpg

 

Прошу помочь разобраться.

List Test.zip

Изменено пользователем Brovin Yaroslav
Ссылка на комментарий

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

  • 0
  • Администраторы

При добавлении своих итемов загрузите стиль принудительно:

procedure TTabbedForm.AddItem;
var
  Item: TCustomListBoxItem;
begin
  Item:=TCustomListBoxItem.Create(ListBox1, 100);
  Item.AssignBitmap(ImageControl1.Bitmap);
  Item.MainText := DateToStr(Now);
  Item.DetailText := 'Note';
  ListBox1.AddObject(Item);
  Item.ApplyStyleLookup; // <-- форсируем загрузку стиля
end;

Если стиль грузить не хотите, то можно принудительно вызывать метод для выравнивания всех итемов: 

ListBox.RealignContent; 

Но этот метод нужно вызвать после того, как стили всех видимых итемов были загружены.

 

P.S. При создании своих итемов не вешайте внутри них на свои же события OnResize и OnApplyStyleLookup обработчики. При таком подходе любой пользователь вашего класса, повесив свой обработчик полностью сломает логику работы ваших итемов. Вместо этого используйте специальные виртуальные методы базового класса:

procedure ApplyStyle; override;
procedure Resize; override;
Ссылка на комментарий
Гость
Эта тема закрыта для публикации ответов.
×
×
  • Создать...