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 :

Changer la propriétés de plusieur composant


Sujet :

C++Builder

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 36
    Points : 34
    Points
    34
    Par défaut Changer la propriétés de plusieur composant
    Bonjour

    je souhaite changer la propriété des composants TShape de la fenetre grace a une boucle est ce possible ?

    exemple:
    ShapeBP1
    ShapeBP2

    seul le dernier chiffre change j'ai 21 composants à changer de couleur.

    Merci

  2. #2
    CGi
    CGi est déconnecté
    Expert éminent
    Avatar de CGi
    Inscrit en
    Mars 2002
    Messages
    1 030
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 1 030
    Points : 8 316
    Points
    8 316
    Par défaut
    Salut,

    Voici un lien qui décrit comment changer plusieur composant dans une boucle :http://chgi.developpez.com/tips1/#tips15
    Site : http://chgi.developpez.com

    Pourquoi faire simple quand on peut faire compliqué ? (Jacques Rouxel)

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 36
    Points : 34
    Points
    34
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
        for ( int x=0 ; x<ControlCount ; x++)
             if ((AnsiString)Controls[x]->ClassName() == "TShape" )
                      ((TShape*)Controls[x])->Brush->Color = clRed;
    }
    j'ai un problème car il ne rentre jamais dans la boucle if pourtant il y a des composant de type TShape dans la fiche

  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
    Salut, est-ce que les TShape sont directement sur ta Form ou il sont dans un TPanel ou autre container?
    • 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
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 36
    Points : 34
    Points
    34
    Par défaut
    Oui effectivement les TShape se trouve dans un TGroupBox

    As tu une solution au problème ?

    Merci

  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
    Si tes TShape sont toujours dans un TPanel tu peux utiliser ce code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
        for ( int n=0 ; n<ControlCount ; n++)
        {
             if (Controls[n]->ClassName() == "TPanel" )
             {
                for ( int x=0 ; x<dynamic_cast<TPanel *>(Controls[n])->ControlCount ; x++)
                {
                     if ((AnsiString)Controls[x]->ClassName() == "TShape" )
                              ((TShape*)Controls[x])->Brush->Color = clRed;
                }
             }
        }
    • 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 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
    Oups je voulais mettre un TGroupBox:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
        for ( int n=0 ; n<ControlCount ; n++)
        {
             if (Controls[n]->ClassName() == "TGroupBox" )
             {
                for ( int x=0 ; x<dynamic_cast<TGroupBox *>(Controls[n])->ControlCount ; x++)
                {
                     if ((AnsiString)Controls[x]->ClassName() == "TShape" )
                              ((TShape*)Controls[x])->Brush->Color = clRed;
                }
             }
        }
    • 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

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 36
    Points : 34
    Points
    34
    Par défaut
    merci pour ton aide

    j'ai l'erreur suivante :
    operator == 'non implémenté dans le type 'ShortString' pour les arguments de type 'char *'


    a la ligne suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if ((Controls[n]->ClassName()) == "TGroupBox" )

  9. #9
    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
    Essais ceci, j'ai ajouter un casting en AnsiString:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
        for ( int n=0 ; n<ControlCount ; n++)
        {
             if ((AnsiString)Controls[n]->ClassName() == "TGroupBox" )
             {
                for ( int x=0 ; x<dynamic_cast<TGroupBox *>(Controls[n])->ControlCount ; x++)
                {
                     if ((AnsiString)Controls[x]->ClassName() == "TShape" )
                              ((TShape*)Controls[x])->Brush->Color = clRed;
                }
             }
        }
    • 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

  10. #10
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 36
    Points : 34
    Points
    34
    Par défaut
    je n'ai aucune erreur de compilation mais lorsque je clique sur le bouton le programme plante et j'ai le message suivant:

    une classe d'exception EListError avec le message 'Indice de liste hors limites (5)' Processus stoppé

  11. #11
    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
    Est-ce que tu as essayer de mettre un Point d'arrêt (Break point) au début du code pour voir ou le problème survient?
    • 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

  12. #12
    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
    J'ai trouvé le problème:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
        for ( int n=0 ; n<ControlCount ; n++)
        {
             if ((AnsiString)Controls[n]->ClassName() == "TGroupBox" )
             {
                TGroupBox *GroupBox = dynamic_cast<TGroupBox *>(Controls[n]);
                for ( int x=0 ; x<GroupBox->ControlCount ; x++)
                {
                     if ((AnsiString)GroupBox->Controls[x]->ClassName() == "TShape" )
                              ((TShape*)GroupBox->Controls[x])->Brush->Color = clRed;
                }
             }
        }
    • 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

  13. #13
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 36
    Points : 34
    Points
    34
    Par défaut
    Merci pour ton aide cela fonctionne très bien

  14. #14
    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
    Pour les exceptions on peut utiliser la propriété Name ou Tag, voici un exemple:
    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
        for ( int n=0 ; n<ControlCount ; n++)
        {
             if ((AnsiString)Controls[n]->ClassName() == "TGroupBox" )
             {
                TGroupBox *GroupBox = dynamic_cast<TGroupBox *>(Controls[n]);
                for ( int x=0 ; x<GroupBox->ControlCount ; x++)
                {
                     if ((AnsiString)GroupBox->Controls[x]->ClassName() == "TShape" )
                     {  // On peut utiliser la propriété Name ou Tag pour les exceptions
                        if((AnsiString)GroupBox->Controls[x]->Name == "Shape1")
                            ((TShape*)GroupBox->Controls[x])->Brush->Color = clBlue;
                        else
                            ((TShape*)GroupBox->Controls[x])->Brush->Color = clRed;
                     }
                }
             }
        }
    Tag peut permettre de faire des groupes ce qui peut être utile.
    • 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

  15. #15
    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
    À la place d'utiliser Controls tu peux utiliser Components, il ne tiens pas compte des parents (container), il regarde tous les composants d'un TForm. Je met le code au cas ou tu aimerais mieux cette façon:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
        for ( int x=0 ; x<ComponentCount ; x++)
        {
             if ((AnsiString)Components[x]->ClassName() == "TShape" )
             {  // On peut utiliser la propriété Name ou Tag pour les exceptions
                if((AnsiString)Components[x]->Name == "Shape1")
                    ((TShape*)Components[x])->Brush->Color = clBlue;
                else
                    ((TShape*)Components[x])->Brush->Color = clRed;
             }
        }
    Voici une petite description tiré de l'aide:
    Use Components to access any of the components owned by this component, such as the components owned by a form. The Components property is most useful when referring to owned components by number rather than name. It is also used internally for iterative processing of all owned components.
    • 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

  16. #16
    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
    J'ai encore une petite amélioration à apporter à mon dernier message. À la place d'utiliser
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ClassName() == "TShape"
    On peut tout simplement utilsier:
    Voici ce que sa donne:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
        for ( int x=0 ; x<ComponentCount ; x++)
        {
             if (Components[x]->ClassNameIs("TShape"))
             {  // On peut utiliser la propriété Name ou Tag pour les exceptions
                if((AnsiString)Components[x]->Name == "Shape1")
                    ((TShape*)Components[x])->Brush->Color = clBlue;
                else
                    ((TShape*)Components[x])->Brush->Color = clRed;
             }
        }
    • 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

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 21/09/2012, 22h38
  2. [C#] Une seule méthode pour plusieurs composants
    Par niPrM dans le forum Windows Forms
    Réponses: 8
    Dernier message: 01/06/2004, 14h41
  3. recopie des propriétés d'un composant
    Par pitounette dans le forum C++Builder
    Réponses: 2
    Dernier message: 20/02/2004, 10h40
  4. Réponses: 10
    Dernier message: 19/02/2004, 12h58
  5. Réponses: 4
    Dernier message: 06/11/2003, 10h37

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