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
Version imprimable
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
Salut,
Voici un lien qui décrit comment changer plusieur composant dans une boucle :http://chgi.developpez.com/tips1/#tips15
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 ficheCode:
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; }
Salut, est-ce que les TShape sont directement sur ta Form ou il sont dans un TPanel ou autre container?
Oui effectivement les TShape se trouve dans un TGroupBox
As tu une solution au problème ?
Merci
Si tes TShape sont toujours dans un TPanel tu peux utiliser ce code:
Code:
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; } } }
Oups je voulais mettre un TGroupBox:
Code:
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; } } }
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:if ((Controls[n]->ClassName()) == "TGroupBox" )
Essais ceci, j'ai ajouter un casting en AnsiString:
Code:
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; } } }
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é
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?
J'ai trouvé le problème:
Code:
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; } } }
Merci pour ton aide cela fonctionne très bien
Pour les exceptions on peut utiliser la propriété Name ou Tag, voici un exemple:
Tag peut permettre de faire des groupes ce qui peut être utile.Code:
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; } } } }
À 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:
Voici une petite description tiré de l'aide:Code:
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; } }
Citation:
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.
J'ai encore une petite amélioration à apporter à mon dernier message. À la place d'utiliser
On peut tout simplement utilsier:Code:ClassName() == "TShape"
Voici ce que sa donne:Code:ClassNameIs("TShape")
Code:
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; } }