Slym
-
Постов
180 -
Зарегистрирован
-
Посещение
-
Победитель дней
39
Сообщения, опубликованные Slym
-
-
Контрол создается в рантайме - и логика подключается тоже...
а по поводу легче - мне нужен именно 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 возвращает, ну не загрузился еще стиль...
-
Насколько корректно использование такой конструкции? А именно создание контролов клонированием стиля
какие подводные камни имеются? по идее так меньше памяти расходуется... или нет?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);
-
procedure TForm1.MyApplyStyleLookup(Sender: TObject); var Style:TFmxObject; begin Style:=StyleBook1.Style.FindStyleResource(TStyledControl(Sender).StyleLookup); if Style is TText then begin TText(Style).textSettings.Font.Size:=TText(Style).textSettings.Font.Size+10; if Style.Tag=-1 then exit; Style.Tag:=-1; TStyledControl(Sender).NeedStyleLookup; TStyledControl(Sender).ApplyStyleLookup; end; end; procedure TForm1.FormShow(Sender: TObject); var i:integer; begin for i:=0 to ComponentCount-1 do begin if Components[i] is TStyledControl then with TStyledControl(Components[i]) do begin OnApplyStyleLookup:=MyApplyStyleLookup; NeedStyleLookup; ApplyStyleLookup; end; end; end;
Вот такая вот "партянка" получается... тройной, мать его, лукап стиля: До FormShow, вовремя FormShow и после OnApplyStyleLookup
-
На форме лежит StyleBook со стилем MyButtonStyle и кнопка которой этот стиль применяется.
Хотелось бы до отображения контролов пробежаться по StyleBook и поменять размеры под текущий экран... но стилей внутри StyleBook нет... до первого обращения к стилю по имени...
procedure TForm1.Button2Click(Sender: TObject); begin StyleBook1.GetStyle(nil).FindStyleResource('XXX');//<F0.ChildrenCount - таки после этого один стиль находится и угадайте его имя :) FormShow(nil); end; procedure TForm1.FormShow(Sender: TObject); var F0,f1:TFmxObject; begin Memo1.Lines.Clear; Memo1.Lines.Add('Lets go!'); F0:=StyleBook1.GetStyle(nil); if F0.ChildrenCount=0 then exit;//<F0.ChildrenCount - таки равен нулю for f1 IN F0.Children do Memo1.Lines.Add(f1.StyleName); end;
Это наблюдается под андроид, на винде работает как ожидается
такое впечатление что под андроид экономятся ресурсы и стили парсятся по мере обращения
типа как тут:
но ответ не подходит, т.к. не известно какие контролы будут, и привязывать каждому контролу OnApplyStyleLookup тоже не вариант
даже если ловить OnApplyStyleLookup всеравно StyleBook пустой.... действует только FindStyleResource
procedure TForm1.Button1ApplyStyleLookup(Sender: TObject); begin FormShow(nil); end;
Создание контролов клонированием стиля
в Стили
Опубликовано
создайте стиль
в дереве стиля не увидите text, и StylesData['text.text']:='Hello world!'; - ничего не отобразит... т.к. ScrollBox - "фиктивный" контейнер, реальный контейнер ScrollBox.ContentLayout