IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Composants FMX Delphi Discussion :

Changer de Style au runtime


Sujet :

Composants FMX Delphi

  1. #1
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 800
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 800
    Billets dans le blog
    65
    Par défaut Changer de Style au runtime
    Bonjour,

    j'ai recensé au moins 5 manières de changer de style à l'exécution (dans ce programme j'utilise Light.style et Dark.style)
    Nom : Capture.png
Affichages : 225
Taille : 24,3 Ko
    Si sous windows c'est opérationnel sous Android ça coince, les trois premières manières fonctionnent (encore qu'il faille se méfier de la casse en ce qui concerne les noms de fichiers et même de ressource!)
    mais dès qu'il s'agit de cloner le style

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    procedure TForm1.rbStyleManagerChange(Sender: TObject);
    begin
    if rbStyleManager.IsChecked then
     begin
      sassurerusestylemanageroff;
      var aStyleBook: TStyleBook := nil;
       aStyleBook:=TStyleBook(FindComponent(ComboBox1.Items[Combobox1.ItemIndex]));  // Light ou Dark
        if aStyleBook<>nil then
         begin
          // Clone le style
           {$IFDEF ANDROID}
                  // TStyleManager.SetStyle(astylebook.Style.Clone(nil));
                  TStyleManager.SetStyle(astylebook.Style);
           {$ELSE}
            TStyleManager.SetStyle(aStyleBook.Style.Clone(nil));
           {$ENDIF}
            inmemo('StyleManagerChange');
         end;
        TStyleManager.UpdateScenes;
     end;
    end;
     
    procedure TForm1.rbTstylebookUseManagerChange(Sender: TObject);
    begin
    if rbTstylebookUseManager.IsChecked then
     begin
      // TStyleManager.RemoveStyleFromGlobalPool(TStyleManager.ActiveStyle(nil));
     
       case combobox1.ItemIndex of
         1 : begin
               Light.UseStyleManager:=False;
               Dark.UseStyleManager:=True;
           {$IFDEF ANDROID}
             // TStyleManager.SetStyle(dark.Style.Clone(nil)); 
             TStyleManager.SetStyle(dark.Style);
           {$ELSE}
            TStyleManager.SetStyle(dark.Style.Clone(nil));
           {$ENDIF}
         end
         else begin
            Dark.UseStyleManager:=False;
            Light.UseStyleManager:=true;
           {$IFDEF ANDROID}
              TStyleManager.SetStyle(Light.Style.clone(nil));
           {$ELSE}
            TStyleManager.SetStyle(Light.Style.Clone(nil));
           {$ENDIF}
         end;
       end;
       inmemo('StyleBookUseManager');
       TStyleManager.UpdateScenes;
     end;
    end;

    sous Android, que ce soit Style.clone(self) ou style.clone(nil) c'est la douche froide
    Si je ne clone pas, alors cela fonctionne une fois mais pas deux
    Nom : Capture.png
Affichages : 224
Taille : 43,5 Ko
    enfin le mémo reste affiché mais le reste ne semble pas se redessiner.
    Après une semaine de galère, je me résouds donc à vous jeter un appel.

    Si quelqu'un veut s'essayer à l'ensemble (si en plus vous avez un mac et un iphone) je serais heureux d'avoir un retour donc je vous soumet les sources
    P.S. vous serez peut-être quand même obligé de changer les ressources
    Fichiers attachés Fichiers attachés

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 91
    Par défaut
    Nom : Screenshot_20250225_095318.jpg
Affichages : 186
Taille : 328,8 Ko
    voilà ce que j'ai sur un samsung s10 android 12

  3. #3
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 800
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 800
    Billets dans le blog
    65
    Par défaut
    Merci d'avoir testé.

    Aucune erreur en repassant de Black à Light plusieurs fois selon chaque option ? C'est encore plus ennuyeux alors car cela voudrait dire que cela dépend des appareils !

    J'ai, du coup, utilisé une tablette récente (Lenovo) j'ai toujours les mêmes soucis pour les deux dernières options (que ce soit en mode PC ou non). Avantage du mode PC, on peut arrêter l'application plus facilement.

    Concernant Android, ma conclusion serait qu'utiliser la propriété Stylebook de la forme est la plus sûre, en évitant le TStyleManager.
    Cela peut convenir puisqu'il n'y a pas de notion forme "enfant" (show ou showmodal), mais désormais il y a cette notion de double fenêtre (split screen scenario) qui me titille.
    Je n'ai jamais testé, j'ai lu quelque part dans une note de release que Delphi 12 prenait ça en charge mais ne suis pas allé plus loin sur cet embranchement.

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 91
    Par défaut
    Aucune erreur en repassant de Black à Light plusieurs fois selon chaque option ?
    Ben oui pas d'erreur mais aujourd'hui je reteste et la pas d'erreur, l'affichage est là mais si passe je en dark il reste toujours en ligth Nom : Screenshot_20250227_105209.jpg
Affichages : 170
Taille : 494,7 Ko

  5. #5
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 800
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 800
    Billets dans le blog
    65
    Par défaut
    Hier et ce matin, j'ai décidé de tester sous Linux en fait j'avais la même erreur de comportement lors de l'utilisation de Clone. En fait j'ai l'impression que SetStyle, excepté pour Windows pose vraiment problème

    hier, j'en étais là
    Nom : Capture.png
Affichages : 152
Taille : 126,4 Ko
    en constatant qu'une fenêtre enfant se modifiait si je chargeais une ressource ou un fichier

    Aujourd'hui j'ai écrit un truc qui ne me plait pas mais fonctionne, j'utilise en fait la propriété Stylebook des formes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
     
    procedure TForm1.updatechildforms;
    begin
    // mets à jour les formes enfants
    {$IFDEF LINUX}
    for var c in Children do
      if C is TForm then
       begin
         memo1.lines.add('forme détectée');
         TForm(c).StyleBook:=Stylebook;
       end;
    {$ENDIF}
    end;
     
    procedure TForm1.rbStyleManagerChange(Sender: TObject);
    var child : TFmxObject;
    begin
    if rbStyleManager.IsChecked then
     begin
      sassurerusestylemanageroff;
     // var aStyleBook: TStyleBook := nil;
      var aStyleBook:=TStyleBook(FindComponent(ComboBox1.Items[Combobox1.ItemIndex]));
        if aStyleBook<>nil then
         begin
           // Clone le style
           {$IF Defined(ANDROID) OR Defined(LINUX)}
                  SetStyleBook(astylebook);
                  aStylebook.UseStyleManager:=true;
               {$IFDEF LINUX}
               //    TStyleManager.UpdateScenes;
                  updatechildforms;
                {$ENDIF}
           {$ELSE}
            TStyleManager.SetStyle(aStyleBook.Style);
           {$ENDIF}
            inmemo('StyleManagerChange');
         end;
        TStyleManager.UpdateScenes;
     end;
    end;
     
    procedure TForm1.rbTstylebookUseManagerChange(Sender: TObject);
    //var astyle : TFMXObject;
    begin
    if rbTstylebookUseManager.IsChecked then
     begin
        {$IFDEF ANDROID}
           {$ENDIF}
          case combobox1.ItemIndex of
         1 : begin
               Light.UseStyleManager:=False;
               Dark.UseStyleManager:=True;
               SetStyleBook(dark);
            {$IF Defined(ANDROID) OR Defined(LINUX)} // SetStylebook(dark);
              updatechildforms;
            {$ELSE}
            TStyleManager.SetStyle(dark.Style.Clone(Self));
            {$IFEND}
         end
         else begin
            Dark.UseStyleManager:=False;
            Light.UseStyleManager:=true;
    //        aStyle:=Light.Style;
            SetStyleBook(light);
            {$IF Defined(ANDROID) OR Defined(LINUX)}
                       updatechildforms;
    //          SetStylebook(Light);
            {$ELSE}
            TStyleManager.SetStyle(Light.Style.Clone(Self));
            {$IFEND}
         end;
       end;
       {$IFDEF ANDROID} //SetStyle();
       {$ENDIF}
     
       inmemo('StyleBookUseManager');
       TStyleManager.UpdateScenes;
     end;
    end;
    NB. j'ai découvert l'instruction SetStyleBook(untstylebook) équivalent de StyleBook:=unstylebook c'est le seul point positif que je relève pour l'instant

    Nom : Capture.png
Affichages : 148
Taille : 181,2 Ko
    Encore un petit réglage à faire lors de la création d'une nouvelle forme, mais sauf la frustration, cela fonctionne.

    Bien sûr, sur Android, pas de fenêtre "enfants" donc pas ce souci

  6. #6
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 800
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 800
    Billets dans le blog
    65
    Par défaut et pourtant !
    Il y a 3 ans (avec Delphi Alexandria) j'avais écrit un programme (un peu plus complexe côté stockage des styles dans des DataModules)
    vous pourrez le trouver dans mon dépôt https://github.com/Serge-Girard/Light_Dark_side, j'avais prévu d'en faire une entrée dans mon blog mais c'est toujours resté à l'état de brouillon
    un petit oiseau m'a suggéré de le tester, en D12 et ça fonctionne
    Nom : Capture.png
Affichages : 141
Taille : 97,6 Ko
    et même, moi qui croyais qu'un show d'une form enfant n'était pas possible (l'utilisation du bouton Child window me prouve le contraire)
    Nom : Capture d’écran 2025-02-28 171413.png
Affichages : 136
Taille : 35,1 Ko

  7. #7
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 800
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 800
    Billets dans le blog
    65
    Par défaut
    Pourquoi ce dernier programme fonctionnait ? Parce que j'utilisais la propriété StyleBook de la fiche.
    En supprimant tout appel à cette assignation (ou toute utilisation de SetStyleBook(unTstylebook)) même planton qu'au début de la discussion.

    Après de vaines tentatives, le fameux "appel à un ami" du jeu "Qui va gagner des millions ?" a porté ses fruits :
    - Il s'agit certainement d'un bogue Delphi (signalé) ou alors d'une grosse incompréhension (manque de documentation précise, de commentaires dans le code source etc...)
    - Chacun de notre côté nous avons quand même insisté, résultat : deux codes différents, deux manières différentes mais fonctionnelles.

    Je vous dévoilerai la mienne via un nouveau tutoriel

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 7
    Dernier message: 19/12/2022, 13h36
  2. [Windows] Changer de style au runtime
    Par SergioMaster dans le forum Composants FMX
    Réponses: 6
    Dernier message: 28/02/2020, 11h36
  3. Changer le style en JavaScript [besoin d'aide]
    Par maximenet dans le forum Général JavaScript
    Réponses: 11
    Dernier message: 13/09/2005, 18h21
  4. Changer plusieur style avec des IDs différents?
    Par YanK dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 02/07/2005, 15h33
  5. Changer le style d'une cellule
    Par LE NEINDRE dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 29/06/2005, 17h18

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo