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

Вопросы

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

Подскажите, как добраться до свойств стиля компонента 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

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

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


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

image.thumb.png.e9d403d6f10b4973499411c65dbbf58f.png

Я положил стиль в TLayout, но теперь сам Switch перестал работать, не фурычит IsChecked, соответственно на мышку тоже не отрабатывает))

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


Ссылка на сообщение
Поделиться на другие сайты
  • 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

поставил Breakpoint на процедуру TStyledControl.StyleDataChanged.

Так он вообще в нее не заходит((

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


Ссылка на сообщение
Поделиться на другие сайты
  • 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

Не ну черным по белому FMX.Controls.pas - один файл...
и сначала попробуй FMX.Types.FindStyleResource(StyleName); как выше... может будет достаточно

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


Ссылка на сообщение
Поделиться на другие сайты
  • 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';

 

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


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

 

1 час назад, Slym сказал:

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

Тоже не сработало(( 

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


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

Работает только в одном случае, если стиль TSwitchObject положить в Layout. Но пропадает свойство IsChecked, компонент становится неработоспособен.

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


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

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

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

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

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

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

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

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

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


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

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

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