- 0
tips and tricks Что не так с FindStyleResource и что делать.
-
Похожий контент
-
- 2 ответа
- 3 013 просмотра
-
FindStyleResource Где можно найти структуру StyleLookup для объектов, чтобы можно было использовать в FindStyleResource?
От max7ka,
- 2 ответа
- 2 729 просмотров
-
- 2 ответа
- 2 134 просмотра
-
- 4 ответа
- 3 627 просмотров
-
- 1 ответ
- 2 606 просмотров
-
- 4 ответа
- 4 187 просмотров
-
-
Последние посетители 0 пользователей онлайн
- Ни одного зарегистрированного пользователя не просматривает данную страницу
Вопрос
Error
ЧАВО:
Опишу "багофичу" на которую я наткнулся.
Предположим что вы пишете свой компонент, наследуемый от TStyledControl (или любого другого компонента, который происходит от TStyledControl), для доступа к элементам стиля обычно используют FindStyleResource('ИмяРесурса') (есть вариант в виде FindStyleResource<Класс>('ИмяРесурса', Переменная)) , например компонент TImageControl получает Image так:
procedure TImageControl.ApplyStyle; begin inherited; if FindStyleResource<TImage>('image', FImage) then UpdateImage; end;И FindStyleResource работает отлично, пока в дереве стиля искомый объект лежит на НЕ TStyledControl-ах, то есть FindStyleResource будет успешно находить объект, который расположен на TRectangle, но не найдет его же, но на TPanel!
Пример:
Код, в процедуре ApplyStyle:
procedure TEsImageSelection.ApplyStyle; var T: TControl; begin inherited ApplyStyle; if FindStyleResource<TControl>('selection', T) then ShowMessage('"selection" founded!'); end;Что делает данный код? - При нахождении стилевого объекта выдает соответствующее сообщение.
Рассмотрим стиль:
Как видите в варианте A, "Selection" лежит на НЕ наследнике TStyledControl. Запустив программу можно убедиться что FindStyleResource<TControl>('selection', T) найдет объект "Selection".
В варианте B, при запуске можно с удивлением обнаружить что FindStyleResource<TControl>('selection', T) не находит объект "Selection"!
Почему так?
Судя по исходникам поиск во вложенных TStyledControl-ах сломан специально, дабы не всплывали еще большие глюки\проблемы.(но я не изучал вопрос очень подробно, во внутренний код работы с загрузкой и поиском стилей - кромешный ад, с наслаиванием истории Fire-Monkey разных лет).
Как можно обойти проблему?
Я нашел следующее решение:
(Однако я совершенно не уверен в отсутствии побочных эффектов, возможно @Brovin Yaroslav сможет прокомментировать его?)
Данный код находит искомый стилевой объект, в отличии от FindStyleResource.
procedure TEsImageSelection.ApplyStyle; var T: TControl; begin inherited ApplyStyle; T := nil; EnumObjects( function (Obj: TFmxObject): TEnumProcResult begin if Obj.StyleName.ToLower = 'selection' then begin T := TControl(Obj); Result := TEnumProcResult.Stop; end else Result := TEnumProcResult.Continue; end); if T <> nil then ShowMessage('"selection" founded!'); end;Процедура-замена FindStyleResource, работает как ожидается:
Изменено пользователем Error6 ответов на этот вопрос
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.