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

Вопросы

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

Возникла проблема с обновлением 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 эмодзи.

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

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

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


  • Похожий контент

    • От Malstream
      Недавно решил написать небольшое приложение под андроид, которое будет в удобном виде показывать расписание моего ВУЗа (они нам передают 20 летний привет в виде экселя), ну и задно изучить FMX.
      Написал за пару дней парсер, все более менее работает. Встал вопрос - какими компонентами все это удобно и красиво отобразить? Перечитал кучу инфы по стандартным компонентам и, кажется, они мне не подойдут
      Для того чтобы было понятно, чего именно я хочу - набросал схему. Границы для наглядности. 
      Каким компонентом это можно реализовать? Если все-таки коробочные тоже годятся, то ткните лицом куда читать :)
      Заранее спасибо.

    • От Mars M
      Второй день голову ломаю, без помощи не обойтись 
      Делаю компонент, что то типа таблицы, нужно добавлять колонки и что бы они отображались в редакторе как вложенные в основной компонент.
      Вот как например у стринггрида

      Нужно разумеется не для красоты а что бы редактировать их свойства.
      Если можно пример в виде кода или хоть в какую сторону смотреть.
    • От Вячеслав
      Добрый день, форумчане! Столкнулся со следующей задачей: 
      Имеется TListBox с 32 итемами, задаются в DesignTime. В некоторых ситуациях требуется убрать половину, оставить только первые 16 итемов. Я делаю лишние невидимыми, но при этом область прокрутки листбокса остается прежней и излишне большой. В связи с этим вопрос: можно ли как-то ограничить область прокрутки? 
      XE7, Windows.
    • От x11
      Можно ли во время работы программы вызвать Items editor, который я вызываю во время дизайна приложения?
      Или свой лисапет создавать?
    • От x11
      Процедура добавления Item
       
      procedure TfmEditObject.AddPhoto(Image: TBitmap); Var item: TListBoxItem; imageV: TImageViewer; begin item := TListBoxItem.Create(lbPhotos); item.parent := lbPhotos; item.text := ''; item.Width := lbPhotos.Width; item.PopupMenu := PopupMenu1; imageV := TImageViewer.Create(lbPhotos); imageV.HitTest := False; imageV.Parent := item; imageV.Align := TAlignLayout.Client; imageV.Bitmap.Assign(image); item.SetFocus; end; У popupmenu есть 2 пункта, привязанных к Action.
       
      Gestures срабатывает на "long tap"
      procedure TfmEditObject.lbPhotosGesture(Sender: TObject; const EventInfo: TGestureEventInfo; var Handled: Boolean); var c: IControl; ListBox: TListBox; lbxPoint: TPointF; ListBoxItem: TListBoxItem; begin if EventInfo.GestureID = igiLongTap then if (sender is TListBox) and assigned(TListBox(sender).Selected) then begin c := ObjectAtPoint(EventInfo.Location); if Assigned(c) then if Assigned(c.GetObject) then if c.GetObject is TListBox then begin ListBox := TListBox(c.GetObject); lbxPoint := ListBox.AbsoluteToLocal(EventInfo.Location); ListBoxItem := ListBox.ItemByPoint(lbxPoint.X, lbxPoint.Y); if Assigned(ListBoxItem) then PopupMenu1.Popup(lbxPoint.X, lbxPoint.Y); Handled := True; end; end; end;  
      Ставил точку останова, видно, что до строки "PopupMenu1.Popup(lbxPoint.X, lbxPoint.Y);" доходит.
      Если программа работает на Windows, то меню отображается по правой кнопке мышки, а на андроид устройстве меню не отображается по Long Tap.
       
      Как видно из кода, то меню прикручивается к ListBoxItem, а непосредственно к TListBox меню прикрутил в дизайне.
    • От x11
      Хочу реализовать прокрутку фото с помощью TListBox.
      Пока что в дизайне добавил пару Item и кинул на них TImageViewer, ну и картинку туда вставил.
      В свойстве TListStyle указал Horizontal. На Windows не листается мышкой влево/вправо, но есть хотя бы полоса прокрутки внизу.
      На андроид-устройстве и не листается, и полосы прокрутки нет вообще.
      Это связано с этим вопросом http://fire-monkey.ru/topic/4301-выводотображение-нескольких-картинок-на-форме
    • От dim
      сейчас модно показывать аватарки круглыми, можно ли на XE10 у timage это сделать?
      не могу вспомнить, но вроде где-то  наталкивался, что толи настройками, толи стилями это делается легко
    • От x11
      Посмотрел это видео
       
      https://youtu.be/iM9lamNwmtc?t=20m51s
       
      Там же просто копипастинг. Чтобы подключить ещё 2-5-10 стилей, нужно заниматься копипастой. Именовать/переименовывать.
      Разве так можно?
      А нельзя как-то автоматизировать процесс добавления стилей в список, где их может выбирать пользователь в процессе работы?
    • От x11
      В свойстве TListBox.ListStyle установил значение Horizontal. Список поменял вид.
      Теперь ставлю Vertical, но ничего не происходит.
      Как вернуть стиль списка обратно к вертикальному?
    • От Euvene
      Добрый день, возникла такая проблемка: при добавлении в ListBoxItem компонента TEdit если поставить ему TControlType::Platform он вылазит за пределы ListBox но при Styled все норм, кто нибудь сталкивался и как с этим бороться?


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

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

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