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

C++Builder Discussion :

[FireMonkey ]TSwitch et la fonction FindStyleResource [Interface]


Sujet :

C++Builder

  1. #1
    Membre confirmé
    Homme Profil pro
    Consultant technique
    Inscrit en
    Juillet 2002
    Messages
    519
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consultant technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2002
    Messages : 519
    Points : 523
    Points
    523
    Par défaut [FireMonkey ]TSwitch et la fonction FindStyleResource
    Bonjour,

    J'utilise plusieurs TSwitch créés dynamiquement dans un programme et j'aimerais modifier les propriétés de certains sous-composants.
    J'ai pu le faire sans problème avec d'autres composants mais je ne trouve pas comment faire avec un TSwitch.
    En effet, j'ai pu vérifier avec le debuggeur qu'il n'y a pas d'enfant accessible (ni avec ChildrenCount, ni ControlsCount).
    Du coup, je voudrais accéder aux composants interne avec la fonction FindStyleResource.
    Par exemple, si j'essaie d'accéder à l'image de fond quand le switch est sur on :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    TFmxObject *TempObj = PSwitch->FindStyleResource("on", false);
    if (TempObj != NULL)
       {
       ...
       ...
       ...
       }
    La fonction ne trouve jamais le composant.
    Pourtant, je suis certain de la valeur à mettre dans le nom puisqu'ils sont énumérés dans la fonction ApplyStyle du switch.

    Savez-vous comment faire ?

    Merci pour votre aide.



    ps : j'utilise C++Builder XE4 et je n'ai pas ajouter de composant gérant le style à mon application.

  2. #2
    Membre chevronné
    Avatar de Crayon
    Inscrit en
    Avril 2005
    Messages
    1 811
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 811
    Points : 2 189
    Points
    2 189
    Par défaut
    Salut, si ton TSwitch utilise un style (fichier .Style) qui possède des propriétés comme celles-ci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
      object TSwitchObject
        StyleName = 'switchstyle'
        Fill.Color = xFF484848
        FillOn.Color = xFF65C8E0
        FillOn.Kind = bkSolid
        Stroke.Color = xFF1C1C1C
        Thumb.Color = xFF484848
        ThumbOn.Kind = bkNone
        ThumbStroke.Color = xFF1C1C1C
        Shape = ssRectangle
        HitTest = False
      end
    Alors ton TSwitch est un TSwitchObject et tu vas pouvoir faire ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
        Fmx::Types::TFmxObject* StyleResource = StyleBook1->Style->FindStyleResource("switchstyle");
        if(StyleResource && StyleResource->ClassNameIs("TSwitchObject"))
        {
            TSwitchObject* SwitchObject = static_cast<TSwitchObject*>(StyleResource);
            SwitchObject->FillOn->Color = TAlphaColor(claRed);
        }
    Par contre, par défaut le TSwitch est un TBitmapSwitchObject. Cet objet utilise une image pour se remplir, par exemple Windows 7style.png. Je n'ai pas trouver comment changer le look d'un contrôle de ce type.

    N'oublie pas d'inclure ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #include <FMX.Styles.Switch.hpp>
    • Plus un ordinateur possède de RAM, plus vite il peut générer un message d'erreur. - Dave Barry
    • Je n'ai pas peur des ordinateurs. J'ai peur qu'ils viennent à nous manquer. - Isaac Asimov
    • Le code source est comme une belle femme, plus on le regarde, plus on trouve des défauts. - Crayon

  3. #3
    Membre confirmé
    Homme Profil pro
    Consultant technique
    Inscrit en
    Juillet 2002
    Messages
    519
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consultant technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2002
    Messages : 519
    Points : 523
    Points
    523
    Par défaut
    Bonjour,

    Merci pour cette aide bienvenue.

    J'ai essayé de m'inspirer de ce que tu m'indiques mais cela ne fonctionne pas sur ma version.
    J'ai C++Builder XE4 et je n'ai pas trouvé le fichier "FMX.Styles.Switch.hpp" sur le disque.
    L'aide ne fait pas référence à TSwitchObject.

    En bref, je n'ai pas encore trouvé de solution sans passer par un StyleBook.
    J'ai essayé de faire une petite application de demo pour voir les différents styles et après quelques changements, il y a certains contrôles qui ne se mettent pas complètement à jour et après quelques changements supplémentaires, il y a un plantage.
    J'ai l'impression qu'il y a des fuites de mémoires dans la gestion des styles sur ma version.
    De ce fait, j'aimerais bien ne pas avoir à utiliser un StyleBook.

    J'avais vu que leTSwitch avait une image en fond pour la couleur et j'aimerai pouvoir choisir à l'exécution sa couleur sans avoir à charger un nouveau style et sans impacter les autres contrôles.
    Bref, gérer la couleur de chaque Switch à l'exécution indépendamment les uns des autres.
    Les TSwitch que j'utilise sont créés dynamiquement.

    J'avais pensé faire un composant dérivé de TSwitch mais le composant de fond est en private et on n'y a pas accès dans la classe fille.

    Pour donner un contexte, voici comment j'utilise le TSwitch actuellement.
    Je réalise une application permettant de surveiller des services qui sont gérés
    Je voudrais un ou 2 switchs à côté de ceux existants. Ils permettent d'activer certaines fonctionnalités sur les groupes de services et différencier les fonctionnalités activer en fonction de la couleur des switchs.



    Je te remercie de ton aide.

  4. #4
    Membre chevronné
    Avatar de Crayon
    Inscrit en
    Avril 2005
    Messages
    1 811
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 811
    Points : 2 189
    Points
    2 189
    Par défaut
    Citation Envoyé par gandf Voir le message
    J'ai essayé de m'inspirer de ce que tu m'indiques mais cela ne fonctionne pas sur ma version.
    J'ai C++Builder XE4 et je n'ai pas trouvé le fichier "FMX.Styles.Switch.hpp" sur le disque.
    L'aide ne fait pas référence à TSwitchObject.
    Salut, de mon coté j'ai C++Builder XE5. Essai de faire une recherche dans le dossier include pour trouver le fichier .hpp où si situe TSwitchObject.

    Sinon juste pour être certain regarde le nom du contrôle pour être certain qu'il s'agit bien d'un TSwitchObject:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        Fmx::Types::TFmxObject* StyleResource = StyleBook1->Style->FindStyleResource("switchstyle");
        String LeNom = StyleResource->ClassName();
    Ceci va chercher le style général sans utiliser de StyleBook et devrait te donner un TBitmapSwitchObject:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        Fmx::Types::TFmxObject* StyleResource = Fmx::Types::FindStyleResource("switchstyle");
        String LeNom = StyleResource->ClassName();
    Sinon je ne trouve pas vraiment comment faire ce que tu cherches.
    • Plus un ordinateur possède de RAM, plus vite il peut générer un message d'erreur. - Dave Barry
    • Je n'ai pas peur des ordinateurs. J'ai peur qu'ils viennent à nous manquer. - Isaac Asimov
    • Le code source est comme une belle femme, plus on le regarde, plus on trouve des défauts. - Crayon

  5. #5
    Membre confirmé
    Homme Profil pro
    Consultant technique
    Inscrit en
    Juillet 2002
    Messages
    519
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consultant technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2002
    Messages : 519
    Points : 523
    Points
    523
    Par défaut
    Salut,

    Je n'ai trouvé aucun fichier ayant "TSwitchObject" dans son contenu.

    Le code que tu indiques (avec le stylebook) ne trouve pas d'objet.

    Par contre, le code plus généraliste ne trouve pas un TBitmapSwitchObject mais un TLayout.
    Et j'arrive à accéder à des TSubImage via les TLayout.

    Par contre, cela risque de changer la couleur pour tous les switchs ?

    Quand j'édite le StyleBook, voici ce que j'obtiens.

    C'est un TSubImage (on) qui contient la couleur.

  6. #6
    Membre chevronné
    Avatar de Crayon
    Inscrit en
    Avril 2005
    Messages
    1 811
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 811
    Points : 2 189
    Points
    2 189
    Par défaut
    Salut, j'ai fait quelques tests sur XE2 car je l'ai d'installer sur mon PC et effectivement le style n'est pas pareil. Il utilise un TLayout comme on peut le voir dans le fichier Air.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
      object TLayout
        StyleName = 'switchstyle'
        Position.Point = '(416,514)'
        Width = 130.000000000000000000
        Height = 14.000000953674320000
        DesignVisible = False
        object TBrushObject
          StyleName = 'On'
          Brush.Color = xFF65C8E0
        end
        object TBrushObject
          StyleName = 'Off'
          Brush.Color = xFF484848
        end
    Si tu veux changer la couleur de tous les TSwitch tu peux utiliser quelque chose du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
        Fmx::Types::TFmxObject* StyleResource = Fmx::Types::FindStyleResource("switchstyle");
        if(StyleResource && StyleResource->ClassNameIs("TLayout"))
        {
            TLayout* SwitchObject = static_cast<TLayout*>(StyleResource);
            Fmx::Types::TFmxObject* StyleOn = SwitchObject->FindStyleResource("on");
            if(StyleOn && StyleOn->ClassNameIs("TBrushObject"))
            {
                TBrushObject* BrushOn = static_cast<TBrushObject*>(StyleOn);
                BrushOn->Brush->Color = claRed;
            }
        }
    Je te laisse essayer de trouver le code pour le faire pour un contrôle uniquement.
    • Plus un ordinateur possède de RAM, plus vite il peut générer un message d'erreur. - Dave Barry
    • Je n'ai pas peur des ordinateurs. J'ai peur qu'ils viennent à nous manquer. - Isaac Asimov
    • Le code source est comme une belle femme, plus on le regarde, plus on trouve des défauts. - Crayon

  7. #7
    Membre confirmé
    Homme Profil pro
    Consultant technique
    Inscrit en
    Juillet 2002
    Messages
    519
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consultant technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2002
    Messages : 519
    Points : 523
    Points
    523
    Par défaut
    Merci. Quand tu aides, c'est pas à moitier.

    Voici un morceau de code pour accéder à l'image d'un stylebook.

    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
    void __fastcall ChangeSwitchColor(TStyleBook *FStyleBook, TAlphaColor FCouleur)
    {
    for (int i = 0; i < FStyleBook->Style->ChildrenCount; i++)
        {
        Fmx::Types::TFmxObject* StyleResource = FStyleBook->Style->Children->Items[i];
        if (StyleResource && StyleResource->ClassNameIs("TLayout"))
           {
           TLayout* SwitchObject = static_cast<TLayout*>(StyleResource);
     
           Fmx::Types::TFmxObject* StyleOn = SwitchObject->FindStyleResource("on");
           if (StyleOn && StyleOn->ClassNameIs("TSubImage"))
              {
              TSubImage* SubImageOn = static_cast<TSubImage*>(StyleOn);
              ...
              ...
              ...
              }
           }
        }
    }
    il ne me reste plus qu'à l'utiliser.

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

Discussions similaires

  1. Réponses: 8
    Dernier message: 12/02/2013, 01h08
  2. Fonction API
    Par margilb dans le forum C++Builder
    Réponses: 2
    Dernier message: 08/07/2002, 11h11
  3. Implémentation des fonctions mathématiques
    Par mat.M dans le forum Mathématiques
    Réponses: 9
    Dernier message: 17/06/2002, 16h19
  4. fonction printf
    Par ydeleage dans le forum C
    Réponses: 7
    Dernier message: 30/05/2002, 11h24
  5. FOnction api specifiant la position de la souris
    Par florent dans le forum C++Builder
    Réponses: 4
    Dernier message: 15/05/2002, 20h07

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