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

Slym

Пользователи
  • Постов

    180
  • Зарегистрирован

  • Посещение

  • Победитель дней

    39

Сообщения, опубликованные Slym

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

      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 

  2. Контрол создается в рантайме - и логика подключается тоже...
    а по поводу легче - мне нужен именно 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 возвращает, ну не загрузился еще стиль...

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

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

     

  4. 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

  5. На форме лежит 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;

     

×
×
  • Создать...