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

Почему для моих объектов стиля сбрасываются данные при прокручивании TListBox?


Вадик05

Вопрос

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

Наткнулся на ошибку в listbox'е и не знаю как её обойти. Пишу на XE6.

Добавил в StyleBook в раздел listboxitemstyle компонент Image и Checkbox, после чего запустил приложение. Проставил чекбоксы (вручную) и загрузил картинки в Image. все сработало, но после прокрутки списка вниз и возврата к началу списка, те строки, которые были временно скрыты, изменились сами по себе (изменились Image и Checkbox).  C чекбоксами решил проблему убрав их из listboxitemstyle и указав в свойстве listbox'а showcheckboxes:=true. Что делать с Image не понятно.

 

Прошу посоветовать, как решить проблему с отображением картинок.

post-297-0-18047400-1404894418_thumb.png

post-297-0-34412600-1404894559_thumb.png

XE6 ошибка.zip

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

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

  • 0

Вообщем, обойти можно так:
Использовал строчку:

LItem.ItemData.Bitmap.Assign(Form2.Image1.Bitmap);

а компонент Image в StyleBook переименовать в icon. Но почему 1 вариант не работал как надо не ясно.

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

Это хороший вопрос. Я поясню. 

  1. TListBox может иметь большое число элементов (Items, например 1000). Однако, реально из них отображается только видимая часть (Например 50). Отсюда приходит мысль, что не следует грузить стиль всем элементам в лист боксе, поскольку это займет очень много ресурсов: как процессорного времени на загрузку, так и памяти на хранение. 
  2. При прокручивании TListBox, стили выгружаются с невидимых элементов, и загружаются для новых видимых.
  3. Каждый элемент TListBoxItem, хранит свои данные у себя (Text, IsChecked, Bitmap). 
  4. Когда стиль загружается, сам элемент TListBoxItem, устанавливает нужные данные в объекты стиля в соответствии с хранимыми данными (TextIsCheckedBitmap). 
  5. При выгрузке стиля установленные данные в объекты стиля, теряются. Если только они не были самостоятельно сохранены.
  6. Когда вы вручную самостоятельно добавляете свой объект в стиле, вы должны позаботиться о том, чтобы сохранить задаваемые данные для элементов и восстановить эти значения при очередной загрузке стиля.
  7. TStyledControl поддерживает встроенный механизм кэширования пользовательских данных через StylesData. 
  8. При использовании StylesData контрол автоматически сохраняет ваше значение в своем словаре и при смене стиля самостоятельно обновляет свойства объектов стиля в соответствии с хранимыми данными в словаре.
  9. О том, как работать с StylesData можно прочитать тут: Доступ к элементам стиля StylesData
  10. Когда вы стали использовать вариант с icon, то по сути сам TListBoxItem за вас восстановил иконку, поскольку это заложено в его базовое поведение 

P.S. Используйте StylesData.

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