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

Свойства стиля у TSwitch


gonzales

Вопрос

Доброго времени суток!

Подскажите, как добраться до свойств стиля компонента TSwitch. Конкретно задача в рантайме изменять цвета у переключателя. В стиле есть свойства Fill, FillOn типа TBrush, соответственно у них есть свойство Color

К сожалению не могу достучаться до них ни через StylesData, ни через FindStyleResource. Судя по всему я что-то не так делаю

ReleSwitch := TSwitch.Create(form1);
ReleSwitch.Parent := form1;
ReleSwitch.StyleLookup := 'switchstyledark';
ReleSwitch.StylesData['Fill.Color'] := TAlphaColorRec.Yellow;  //не отрабатывает
c:=ReleSwitch.StylesData['Fill.Color'].AsExtended; //возвращает 0
StyleObject := ReleSwitch.FindStyleResource('switchstyledark') //возвращает null

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

 Ярослав Бровин указывает, что необходимо явно загрузить стиль, или использовать переопределение OnApplyStyleLookup. Делал и так и так, не помогает

Если кто знает, в какую сторону копать, пните плиз

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

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

  • 0

ReleSwitch.StylesData['АГДЕКОМУ?.Fill.Color']
обязательно должен быть АГДЕКОМУ
если этот АГДЕКОМУ это кореть стиля - то поместит стиль в TLayout, а этот самый АГДЕКОМУ дать имя

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

Мда...
На такой случай мы патчим FMX.Controls.pas

procedure TStyledControl.StyleDataChanged(const Index: string; const Value: TValue);
var
  Obj: TObject;
  InstanceName, PropertyName: string;
  PropertyValue: TValue;
begin
  PropertyName := Index;
  InstanceName := GetToken(PropertyName, '.');

  if SameText(InstanceName,'self') then
    Obj:=FResourceLink
  else
    Obj := FindStyleResource(InstanceName);
  if Obj <> nil then

и тогда ReleSwitch.StylesData['self.Fill.Color']

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

Спасибо, но не сработало. ReleSwitch.StylesData['self.Fill.Color'] возвращает 0

procedure TStyledControl.StyleDataChanged(const Index: string; const Value: TValue);
var
  Obj: TObject;
  InstanceName, PropertyName: string;
  PropertyValue: TValue;
begin
  PropertyName := Index;
  InstanceName := GetToken(PropertyName, '.');

  if SameText(InstanceName,'self') then
    Obj:=FResourceLink
  else
    Obj := FindStyleResource(InstanceName);
  if Obj <> nil then
  begin
    if not PropertyName.IsEmpty then
    begin
      PropertyValue := Value;
      FindProperty(Obj, PropertyName,
        procedure (Instance: TObject; Prop: TRttiProperty)
        begin
          Prop.SetValue(Instance, PropertyValue);
        end);
    end else
      TFmxObject(Obj).Data := Value;
  end
end;

 

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

значит патченый FMX.Controls.pas не компилирует... полож его в папку проекта и явно добавь в проект

кстати сам стиль надо искать так
Style:=FMX.Types.FindStyleResource(StyleName);
а далее
TSwitchObject(Style).Fill....

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

значит патченый FMX.Controls.pas не компилирует... полож его в папку проекта и явно добавь в проект

А там гора файлов, FMX.Controls.***.pas. Если я буду для андроида такой фокус делать, нужно ли тянуть с собой FMX.Controls.Android.pas?

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

кстати сам стиль надо искать так
Style:=FMX.Types.FindStyleResource(StyleName);
а далее
TSwitchObject(Style).Fill....

Только он не знает, что такое TSwitchObject, этот фокус я тоже пробывал

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

Нашел. 

FMX.Styles.Switch

Но такой вариант работает только на Винде, на Андроид не пашет.

Style:=FMX.Types.FindStyleResource('switchstyledark');
  TSwitchObject(Style).Fill.Color:=TAlphaColorRec.Yellow;
  Switch1.StyleLookup := 'switchstyledark';

 

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

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

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

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

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

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

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

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

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

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

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