В блоге уже был перевод статьи "Как загрузить пользовательские стили во время выполнения приложения" (Sarina DuPont). Эта статья от другого автора и содержит в себе достаточно полезной информации, чтобы опубликовать её здесь.
При установке RAD Studio или Delphi XE5, также устанавливаются кастомные стили, которые вы можете использовать в своих проектах. По умолчанию все эти стили лежат в папке "C:\Users\Public\Documents\RAD Studio\12.0\Styles". Помимо этих стилей, пользователи имеющие лицензию Delphi XE5 могут загрузить и использовать "премиум" стили(ID: 29598, Premium Style Pack for RAD Studio XE5 (v4 Oct 2013)). Копируем все "премиум" стили в папку "C:\Users\Public\Documents\RAD Studio\12.0\Styles", чтобы все стили были в одном месте. Теперь вместо того чтобы начинать разработку проекта с нуля воспользуемся уже существующими проектами, которые устанавливаются вместе с Delphi XE5. В папке "C:\Users\Public\Documents\RAD Studio\12.0\Samples\FireMonkeyMobile\Controls\" выберем проект "MobileControls".
Первое, что нужно сделать, это добавить все стили к этому проекту как ресурсы.

Очень важно, чтобы при добавлении стилей, идентификатор каждого ресурса точно совпадал с именем файла стиля, т.к. в коде обращение к ресурсам будет на основе их идентификаторов. Демонстрационный проект "MobileControlds" содержит основной компонент "TabControl" с несколькими вкладками. Добавляем ещё одну вкладку (правый щелчок мышкой по "TabControl1" -> Add Item -> TTabItem). Меняем свойство "Text" для новой вкладки на "style" и добавляем на неё компонент "TComboBox", который назовём "ComboBoxStyles".
Теперь код.
Для формы создаем обработчик события "OnCreate" и пишем код для заполнения "ComboBoxStyles" стилями в зависимости от платформы, под которую был скомпилирован проект. В проекте есть стили как для Android, так и для iOS.
Для "ComboBoxStyles" создаём обработчик события "OnChange", в котором загружается выбранный стиль.
Незабываем добавить "FMX.Styles" в "Uses".
Добавляем небольшую вспомогательную функцию "AddComboItem", которая добавляет элемент в "ComboBoxStyles" с заданным текстом.
uses FMX.Styles;
procedure TForm1.AddComboItem(AText: string);
var lbi: TListBoxItem;
begin
lbi := TListBoxItem.Create(ComboBoxStyle);
lbi.Parent := ComboBoxStyle;
lbi.Text := AText;
ComboBoxStyle.AddObject(lbi);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
AddComboItem('Default');
if TOSVersion.Platform = pfAndroid then
begin
AddComboItem('Diamond');
AddComboItem('Jet');
AddComboItem('Dark');
end
else if TOSVersion.Platform = pfiOS then
begin
AddComboItem('Diamond');
AddComboItem('Jet');
AddComboItem('Black');
AddComboItem('Transparent');
end;
ComboBoxStyle.ItemIndex := 0; // make sure "default" style is selected at start-up
end;
procedure TForm1.ComboBoxStyleChange(Sender: TObject);
var resname: string; style: TFMXObject;
begin
if ComboBoxStyle.ItemIndex > 0 then // first item is "default" style
begin
if TOSVersion.Platform = pfAndroid then
resname := 'Android'
else if TOSVersion.Platform = pfiOS then
resname := 'iOS';
resname := resname + ComboBoxStyle.Selected.Text;
style := TStyleManager.LoadFromResource(HInstance, resname, RT_RCDATA);
if style <> nil then
TStyleManager.SetStyle(style);
end
else
TStyleManager.SetStyle(nil); // set the "default" style
end;
Сохраняем проект. Теперь мы можем запустить этот проект на Android и iOS, чтобы увидеть стили в действии.
Вот так выглядит демо на Android. Выберите первый стиль.

Вот так выглядит демо на Android. Выберите первый стиль.

Android Diamond style:
Android Jet style:
Android Dark style:
p.s. Это вольный перевод статьи Changing FireMonkey style at runtime (Автор: Paweł Głowacki)




