• 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);

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

11 ответов на этот вопрос

  • 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
37 минут назад, Slym сказал:

некий "сборный" контрол

Не легче ли использовать фреймы?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

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

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

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

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

Изменено пользователем dnekrasov

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

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

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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти


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

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