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

Создание контролов клонированием стиля


Slym

Вопрос

Насколько корректно использование такой конструкции? А именно создание контролов клонированием стиля
какие подводные камни имеются? по идее так меньше памяти расходуется... или нет?

FmxObject:=FindStyleResource('ScreenFogStyle');
if not (FmxObject is TControl) then exit;
MainControl:=TControl(FmxObject.Clone(nil));
MainControl.Align := TAlignLayout.Contents;
MainControl.OnClick := OnCancelClick;
Form.AddObject(MainControl);

 

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

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

  • 0

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

Кстати, копию стиля легче получить так

MainControl := FindStyleResource('ScreenFogStyle', True);

 

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

Контрол создается в рантайме - и логика подключается тоже...
а по поводу легче - мне нужен именно TControl чтоб OnClick был, поэтому перед клонированием проверяется тип...

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

для примера возьмем MessageBox
основная сложность - скрол текста если не влезло... в стиле брошенный скрол намертво съедает чаилдов и StylesData не может до них добраться...
хотел попробовать в рантайме скрол вставить в Layout 'content', а оно

 MessageBoxCtrl:=TPanel.Create(MainControl);
 MessageBoxCtrl.Align := TAlignLayout.Center;
 MessageBoxCtrl.StyleLookup:='MessageBoxStyle';
 MessageBoxCtrl.ApplyStyleLookup
 Fog.AddObject(MessageBoxCtrl);

  MessageBoxCtrl.FindStyleResource<TLayout>('content') - nil возвращает, ну не загрузился еще стиль...

Изменено пользователем Slym
Ссылка на комментарий
  • 0
1 час назад, Slym сказал:

для примера возьмем MessageBox

Чёт я вообще ничего не понял... Что такое "скрол" и куда он "бросается". Что означает "намертво съедает чаилдов". StylesData чего и куда не может добраться? На каком этапе Вы выполняете указанный вами код? Из чего состоит "MessageBoxStyle". Что означает "ну не загрузился еще стиль" - вы не подгрузили его в проекте или предполагаете, то он еще не применился к контролу?

 

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

создайте стиль

  object TLayout
    StyleName = 'MessageBoxStyle'
    Align = Center
    object TRectangle
      StyleName = 'background'
      Align = Contents
      Fill.Color = claWhite
    end
    object TLayout
      StyleName = 'buttons'
      Align = Bottom
      object TButton
        StyleName = 'btOk'
        Align = Client
        ModalResult = 1
      end
    end
    object TPresentedScrollBox
      StyleName = 'content'
      Align = Client
      object TText
        StyleName = 'text'
        Align = Client
      end
    end      
  end

в дереве стиля не увидите text, и StylesData['text.text']:='Hello world!'; - ничего не отобразит... т.к. ScrollBox - "фиктивный" контейнер, реальный контейнер ScrollBox.ContentLayout 

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

О как! Вы решили создать стиль для всего ОКНА! Стили для этого не предназначены. 

18 минут назад, Slym сказал:

в дереве стиля не увидите text, и StylesData['text.text']:='Hello world!'; - ничего не отобразит... т.к. ScrollBox - "фиктивный" контейнер, реальный контейнер ScrollBox.ContentLayout

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

 

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

Иначе: ScrollBox не подходит для работы в стиле...

Это не все окно, а некий "сборный" контрол. Вы посмотрите как TEdit сделан и прочие контролы... аналогично - куча TLayout-ов и прочей ГУИстики... так что "не подходит" - не засчитано...

Ссылка на комментарий
  • 0
9 минут назад, Slym сказал:

Вы посмотрите как TEdit сделан и прочие контролы... аналогично - куча TLayout-ов и прочей ГУИстики... 

Вот только все они наследованы не от TStyledControl. Очень редко можно встретить в стиле что-то заранее стилизованное.

30 минут назад, Slym сказал:

так что "не подходит" - не засчитано

Не подходит StyleData - кто Вам мешает работать с FindStyleResource

32 минуты назад, Slym сказал:

ScrollBox не подходит для работы в стиле...

Сделать можно все что угодно - вот только насколько оно будет обосновано и стоит ли оно затраченного времени - решать Вам

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

Лет 15 назад меня заставили написать один сборный контрол (как я ни старался убедить что фрейм лучше - не прокатило) - до сих пор - как вспомню, так вздрогну

16 минут назад, Slym сказал:

но хз, надо еще подумать

Чё тут думать - ТРЯСТИ НАДО :)

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

вот точно  - фреймы лучше

даже когда все опять поменяется внутри FMX фреймы останутся нетронутыми, а логика их работы не меняется от времен VCL

 

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

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

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

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

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

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

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

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

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

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

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