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

Псевдонаследование стилей через StyleLookup


Ra72

Вопрос

Уважаемые эксперты!

Этот - http://fire-monkey.ru/topic/529-android-sozdanie-stilia-knopki-s-ikonkoi-problema/?p=12301 вопрос мною задан не зря.

Если создать шаблон стиля, а затем "наследовать" его через свойство StyleLookup через StyledControl, то мною не было обнаружено как получить доступ к объектам шаблона через свойство StylesData.

Представляю сокращенно файл стиля:

object TStyleContainer
  object TLayout
    StyleName = 'layout1style'
    ...
    object TText
      StyleName = 'text1style'
      ...
    end
  end
  object TPanel
    StyleName = 'panel1style'
    ...
    StyleLookup = 'layout1style'
  end
end

Следующий код работает, если панели на форме присвоить StyleLookup = layout1style и не работает, если StyleLookup = panel1style

procedure TForm1.PanelApplyStyleLookup(Sender: TObject);
begin
  if not (Sender is TPanel) then
    Exit;
  TPanel(Sender).StylesData['text1style'] := TValue.From('Test');
end;

При этом компоненты от "базового" стиля выводятся, что наглядно показывает цвет панели в проекте.
Ниже прикрепляю архив проекта.
TestStyle.zip

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

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

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

Интересный пример. Ситуация заключается в том, что OnApplyStyleLookup вызывает до того, как загрузятся стили для объектов внутри стилей. То есть по факту в вашем примере получается, что вначале грузится

  1. Panel1 со стилем "panel1style"
  2. Вызывается OnApplyStyleLookup
  3. Грузится стиль "layout1style"
  4. Отрисовка формы
  5. Догружается вложенный стиль в panel1style

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

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

P.S. По кнопке работает, но это не вариант. Резюмируем тогда, что архитектурно не правильно делать такое наследование, или архитектуру надо поправить.

А есть какое-нибудь событие, которое гарантированно наступает после применения всех стилей у контрола?

Ссылка на комментарий
  • 0
  • Администраторы
  1. С ходу не могу вам сказать. Дело в том, что стиль грузится обычно при первой отрисовке либо, когда пользователь форсирует загрузку стиля до отрисовки через ApplyStyleLookup. Это сделано для ускорения запуска приложения и экономии памяти за счет не выделенных ресурсов на стили контролов, которые еще не видны.
  2. Наследование стилей можно использовать.
  3. Пока я вижу только повесить обработчик onApplyStyleLookup на внутренний объект стиля, которые использует другой стиль. Не так изящно, но пока это решение.
Ссылка на комментарий

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

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

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

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

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

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

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

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

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

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