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

Проблема с обновлением картинки в Item'e


Вопрос

  • Модераторы

Доброго времени суток!

Возникла проблема с обновлением Itemом. Суть проблемы в текстовом варианте

Чуток изменил стиль TListBox'a, listboxstyle, сам добавил прозрачность, т.к. не понравился родной стиль из-за отступов по краям. Затем добавляю айтемы со стилем listboxitembottomdetail (по памяти) здесь все прекрасно, проблема в том что при нажатии на айтем должна показываться картинка у выбранного айтема, но она показывается только если проскролить айтем за пределы видимости и снова вернуть. Какой метод вызвать чтобы обновить отрисовку?

Пробовал и применение стиля айтему и всему ListBoxy и Repaint и RecalcContent ничего не помогло

Видео прилагаю, смотрите на 16 айтем

https://youtu.be/HNmDq079Ywg

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

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

  • 0

Как я понимаю - если Вы переопределили стиль, то теперь Вы сами отвечаете за перерисовку компонента (ListBoxItem).

Следовательно Вам нужно:

- для каждого добавляемого Item'а переназначить обработчик события OnApplyStyleLookup

- в новом обработчике "перерисовывать" те элементы, которые Вы создали сами или которыми хотите управлять "нестандартно".

Поэтому Вы должны проверить в обработчике - выделен ли Item, и если да - перерисовать картинку.

 

Думаю так...

 

P.S. Можно при клике на итем вызывать для него событие ApplyStyle. (чтобы вызвать Ваш собственный обработчик)

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

Как я понимаю - если Вы переопределили стиль, то теперь Вы сами отвечаете за перерисовку компонента (ListBoxItem).

Следовательно Вам нужно:

- для каждого добавляемого Item'а переназначить обработчик события OnApplyStyleLookup

- в новом обработчике "перерисовывать" те элементы, которые Вы создали сами или которыми хотите управлять "нестандартно".

Поэтому Вы должны проверить в обработчике - выделен ли Item, и если да - перерисовать картинку.

 

Думаю так...

 

P.S. Можно при клике на итем вызывать для него событие ApplyStyle. (чтобы вызвать Ваш собственный обработчик)

переназначать не нужно, по крайней мере в предыдущей версии (написанной на XE6) программы я ничего подобного не делал

вот такой стиль использовал

Screenshot_2014-04-27-00-34-03.png

 

использовал все что можно знаю, Repaint, RealignContent, ApplyStyleLookup и для Item'a и для всего TListBox

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

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

Вы бы код уже привели наконец, а лучше минимальный проект.

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

Вот проект минимальный, со всеми настройками стилей и загрузкой картинки из деплоя

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

Если у вас XE8, то вы можете смело использовать ImageList. Только что попробовал в вашем проекте вместо  

ItemData.Bitmap.Assign(btmpPlay);

сделать 

ImageIndex := 0;

И все прекрасно работает.

 

ну и 

ApplyStyleLookup 

лишнее

Изменено пользователем xenon54
Ссылка на комментарий
  • 0

Это я пробовал на винде, т.к. нет возможности попробовать на ведре. Там все работет. Попробуйте сами с ImageList'ом в винде на своем проекте, и если у вас не будут появляться картинки, знач вы просто что-то не так делаете.

Изменено пользователем xenon54
Ссылка на комментарий
  • 0

Ну, в винде у меня и ваш первоначальный вариант не работал, тоже нужно было скролить чтобы появилась картинка.

Изменено пользователем xenon54
Ссылка на комментарий
  • 0
  • Модераторы

у меня в винде с ImageList'ом работало и до этого, при чем все как нужно

а в андроиде не получалось сделать, поэтому я и пошел другим способом через загрузку в стиль картинки, но тут тоже образовалась проблема

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

У меня была похожая проблема, когда нужно было перерисовать итем при выделении. И ApplyStyleLookup изначально не помогал, т. к. при вызове этого метода внутри идет проверка, нужно ли обновлять стиль. И чтобы "убедить" итем, что ему нужно перерисоваться перед ApplyStyleLookup я вызывал метод NeedApplyStyleLookup

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

вот решение проблемы

      StylesData['icon'] := Tvalue.From<TBitmap>(btmpPlay);
      StylesData['icon.visible'] := true;
      ItemData.Bitmap.Assign(btmpPlay);

почему именно так?

StylesData[] - отображает мгновенно изменения, но при скролинге теряется картинка

ItemData.Bitmap - сохраняет в стиль и в будущем показывает её при скролинге

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

У меня была похожая проблема, когда нужно было перерисовать итем при выделении. И ApplyStyleLookup изначально не помогал, т. к. при вызове этого метода внутри идет проверка, нужно ли обновлять стиль. И чтобы "убедить" итем, что ему нужно перерисоваться перед ApplyStyleLookup я вызывал метод NeedApplyStyleLookup

тоже работает, но заметил странность. не всегда "успевает" отрисовать Item.

спасибо за решение, но я уже нашел своё. пока оно меня устраивает

Ссылка на комментарий
  • 0
В 30.04.2015 в 14:06, ZuBy сказал:

спасибо за решение, но я уже нашел своё. пока оно меня устраивает

Можно поинтересоваться какое? Мне что-то ни NeedStyleLookup ни ApplyStyleLookup не помогает... Итемы перерисовываются некорректно...

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

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

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

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

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

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

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

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

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

×
×
  • Создать...