Changer le style actif d'un projet FireMonkey en cours d'utilisation

On a désormais des thèmes clairs et sombres sur les interfaces utilisateurs des systèmes d'exploitations. A nous de faire de même dans nos logiciels et applications mobiles.

Dans FireMonkey il nous suffit d'utiliser des TStyleBook et d'activer le bon au démarrage du programme pour impacter toutes les fiches ouvertes sur la même session d'utilisation.

Dans certains cas le thème imposé ne convient pas aux utilisateurs et on veut pouvoir leur en proposer plusieurs. J'avais déjà évoqué le sujet en juillet 2022 suite à des tests menés sur Twitch. Le hic c'est que ça ne couvre pas tous les cas et ne fonctionnait pas sur toutes les plateformes.

Après de nombreux essais il s'avère que ce code source est plus susceptible de fonctionner mais il n'impacte que la fiche principale, pas les fiches secondaires donc autant dire qu'il ne sert pas à grand chose de plus.

{$IFNDEF MSWINDOWS}
      // All platforms except Windows
      TStyleManager.SetStyle(dm.StyleBook1.Style.clone(dm));
{$ELSE}
      // Only for Windows
      TStyleManager.SetStyle(dm.StyleBook1.Style.clone(nil));
{$ENDIF}

Une autre solution (temporaire) est disponible : le clonage du TStyleBook à utiliser au lieu de cloner le style lui-même. Dans ce cas toutes les fiches du projet (déjà ouvertes ou à ouvrir) sont impactées par défaut comme on le voulait au départ.

var
  StyleBook: TStyleBook;
begin
  if UseDarkTheme then
    StyleBook := sbDark.clone(nil) as TStyleBook
  else
    StyleBook := sbLight.clone(nil) as TStyleBook;

  TStyleManager.SetStyle(StyleBook.Style);
end;

Le hic, c'est que le TStyleBook ainsi créé ne peut pas être supprimé proprement si on change de thème entre temps. Plusieurs tickets de signalement d'anomalie, de réflexion et de demande de changement sont ouverts auprès d'Embarcadero sur ce point précis. Quand ils auront été clôturés j'adapterai le code suivant pour en tenir compte.

C'est cette dernière solution que j'ai mise en place dans le projet FMX Tools Starter Kit et qui est donc utilisée dans tous mes logiciels basés dessus à partir de maintenant. Quand la solution officielle sera connue, elle sera implémentée dans le starter kit et ne demandera pas de code supplémentaire dans tous les logiciels qui s'en servent. Il suffira juste d'une recompilation. Bon plan pour gagner du temps dans les années à venir même si ce projet m'en aura pris beaucoup depuis un an.


Mug carte postale SydneyMug Toucan DX dans la baie de Rio