salut les amis
comment parcourir toutes les forms et tous les objets et tester si un objet est un label ou speedbutton,car je veux appliquer la propriété Glyph aux sppedbuttons et la propriété caption aux labels.
et merci encore
Version imprimable
salut les amis
comment parcourir toutes les forms et tous les objets et tester si un objet est un label ou speedbutton,car je veux appliquer la propriété Glyph aux sppedbuttons et la propriété caption aux labels.
et merci encore
Bonjour,
Commence par voir ceci
Bonne lecture. :])
salut,
tu as par quoi commencer ici :mouarf:
salutCitation:
Envoyé par kmaniche
j'ai fait ça:
Code:
1
2
3
4
5
6
7
8
9
10
11 if (Controls[j]->Name == section)//je vérifie si le controle trouvé est celui que je désire { if(this->Components[j]->ClassNameIs("TSpeedButton")) { (this->Components[j])->Glyph->LoadFromFile(Valeur); } else { (this->Components[j])->Caption=Valeur; } }
mais j'ai cette erreur:
'Glyph' is not a member of 'Tcomponent'
merci pour votre aide
Tu peux lister tous les composants d'une TForm en utilisant Components[i] avec i qui varie de 0 à ComponentCount.
exemple:
Attention, si tu as des composants dans un TPanel, il faudra faire la même chose dans le TPanel car les composants qui sont à l'interrieur sont aussi listés dans Panel->Components[i]Code:
1
2
3
4
5
6
7 for (i=0;i<MyForm->ComponentCount;i++) { if ( ((String)MyForm->Components[i]->ClassName())=="TLabel") alors faire..... }
Franck
Citation:
Envoyé par franckcl
salut
c'est à cette ligne de mon code que j'ai l'erreur:
this->Components[j])->Glyph->LoadFromFile(Valeur);
merci
Biensûr,
voici la solution (j'ai pas eu le temps de tester) :
Code:
1
2
3
4
5
6 for(int i = 0 ; i < Form1 -> ComponentCount ; i++) if(Form1 -> Components[i] -> ClassNameIs("TSpeedButton")) { ((TSpeedButton*)Form1 -> Components[i] -> Name) -> Glyph->LoadFromFile("chemin"); }
Voici un exemple que j'utilise pour un composant ListItems.
Tu peux remplacer Comp par Components[i] si "i" concerne le composant dont tu veux acceder à la propriété Glyph.
Nomprop est une chaine de caractère qui contient le nom de composant. (=Champ Name)
franckCode:
1
2
3
4
5
6
7
8
9
10
11
12 TListItems *TS; int i; PPropInfo PI; PI=GetPropInfo((PTypeInfo)Comp->ClassInfo() , Nomprop); if (PI!=NULL) { TS = (TListItems*)(GetOrdProp(Comp, PI)); // on peut utiliser TS comme un composant normal ShowMessage(TS->Name); }
salut et merci ,Citation:
Envoyé par kmaniche
j'ai déjà ça qui marche:
Code:((TSpeedButton *)Controls[j])->Glyph->LoadFromFile(Valeur);
mais mon probléme c'est quand ce n'est pas un tspeedbutton:
car dans ce cas j'aimerai changer la propriété caption du controle
Code:
1
2
3
4 else { (this->Components[j])->Caption=Valeur; }
merci d'avance
Bonjour,
je suis trés heureux que ça marche, toutefois il faudra penser au balise pour mettre ton code avant de poster.
Les balises de code sont accessible via l'icone # (dernière à droite).
désolé j'ai pas vu la suite du poste.
pour le problème qui reste :
Code:
1
2
3
4
5
6
7
8
9
10 for(int i = 0 ; i < Form1 -> ComponentCount ; i++) if(Form1 -> Components[i] -> ClassNameIs("TSpeedButton")) { ((TSpeedButton*)Form1 -> Components[i]) -> Glyph->LoadFromFile("chemin"); } else if(Form1 -> Components[i] -> ClassNameIs("TLabel")) { ((TLabel*)Form1 -> Components[i]) -> Caption = "coucou" ; }
salut c mon code,mais je vois pas de balises,Citation:
Envoyé par kmaniche
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14 for (int j = 0;j < ControlCount;j++)//parcours des controles de ta fiche { if (Controls[j]->Name == section)//je vérifie si le controle trouvé est celui que je désire { if(this->Components[j]->ClassNameIs("TSpeedButton")) { ((TSpeedButton *)Controls[j])->Glyph->LoadFromFile(Valeur); } else { (Controls[j])->Caption=Valeur; } } }
est c'est au niveau du "else" que j'ai le prob.
merci:merci: :merci: :merci:
Oui, il faut ajouter une autre condition aprés le else.
Supposons que tu as 2 TSpeedButton, 2 TLabel, et 3 TEdit, si tu utilise ton code tu aura une erreur parceque tu n'a pas pris en considération le TEdit car il n'y a pas de Caption pour un TEDIT.
Alors regarde le code que je tès donné.
merci kmaniche,ton code marche bien,Citation:
Envoyé par kmaniche
mais comment pourrai-je accéder aux controle qui sont dans un panel.
et merci encore
Je pense que si tu remplaces
Form1 -> Components[i]
par
Form1 -> Panel1 -> Components[i]
ça devrait marcher
salutCitation:
Envoyé par franckcl
j'ai essayé ça ,mais il n'y a pas d'erreur mais mes speedbuttons reste intactes,en plus j'ai 3 panels dans ma form.
merci pour ton aideCode:
1
2
3
4
5
6
7
8
9
10
11 if (Controls[j]->Name == section)//je vérifie si le controle trouvé est celui que je désire { if(Form1->Panel2 -> Components[j] -> ClassNameIs("TSpeedButton")) { ((TSpeedButton*)Form1 ->Panel2 -> Components[j]) -> Glyph->LoadFromFile(Valeur); } else if(Form1 -> Components[j] -> ClassNameIs("TLabel")) { ((TLabel*)Form1 -> Components[j]) -> Caption = "coucou" ; } }
Il y a peut-être un problème de mise à jour, essaye ceci:
((TSpeedButton*)Form1 ->Panel2 -> Components[j]) -> Update();
ou alors
Form1 ->Panel2->Update();
moi je vote pour :
Si c'est un panel...alors je relances ma fonction sur le panel à la place de la form
salut les amisCitation:
Envoyé par say
j'ai une form ou ily a 3panels,et dans ces panels j'ai des sppedbutton et des labels.et je veux parcourirs tous les speedbutton et labels .
c le code que j'ai: il ne donne pas d'erreur mais il n'accéde pas à mes composants.
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14 for (int j = 0;j < ControlCount;j++)//parcours des controles de ma form { if (Controls[j]->Name == "Nom speedbutton")//je vérifie si le controle trouvé est celui que je désire { if(this->Components[j]->ClassNameIs("TSpeedButton")) { ((TSpeedButton *)Controls[j])->Glyph->LoadFromFile("chemin"); } else if(this -> Components[j] -> ClassNameIs("TLabel")) { ((TLabel *)Controls[j])->Caption="blabla"; } } }
merci pour votre aide:
arf:
alors, première étape..tu t'organises pour trouver la baliser [CODE] parce que c'est chiant à lire là qd même.
et ton dernier post, il apporte quoi???
tu veux peut-etre qu'on te donne la solution directe...
il me semble d'avoir donner une piste..
C'est quoi le proto de ta fonction?
j'ai regardé les liens mais je n'ai rien trouvéCitation:
Envoyé par say
concérnant les balises ,je ne les trouves pas ces balises
tssss...la balise, quand tu rédiges le message : #
un exemple de code qui devrait rouler à peu près :
Edited : copier-coller raté..il y avait une boucle en tropCode:
1
2
3
4
5
6
7
8
9
10
11
12
13
14 MyFonctionCaptionsGlyphes(TWinControl * Sender) { for(i=0;i<Sender->ControlCount ;i++) { if((AnsiString)Sender->Controls[i]->ClassName() == "TSpeedButton") (dynamic_cast<TSpeedButton*>(Sender->Controls[i]))->Glyph->LoadFromFile("chemin"); else if((AnsiString)Sender->Controls[i]->ClassName() == "TLabel") (dynamic_cast<TLabel *>(Sender->Controls[i]))->Caption="blabla"; else if((AnsiString)Sender->Controls[i]->ClassName() == "TPanel") MyFonctionCaptionsGlyphes(Sender->Controls[i]); } }
Salut !
En premier lieu, j'ai utilisé quelques symboliques :
Ensuite j'ai déclaré deux méthodes membres pour TForm1 :Code:enum{id_none, id_label, id_panel, id_speedbutton};
Je préfère tester si l'objet hérite d'une classe précise pour avoir une vision plus large.Code:
1
2
3 public: // Déclarations de l'utilisateur void __fastcall Targets(TWinControl *WinControl); int __fastcall GetControlId(TControl *Control);
Ce se serait dommage d'ignorer des objets dérivées de la dite classe... ;)
La méthode suivante est récursive.Code:
1
2
3
4
5
6
7
8 int __fastcall TForm1::GetControlId(TControl *Control) { if(Control->InheritsFrom(__classid(TLabel))) return id_label; if(Control->InheritsFrom(__classid(TPanel))) return id_panel; if(Control->InheritsFrom(__classid(TSpeedButton))) return id_speedbutton; //... return id_none; }
On peut utiliser un switch sur la valeur renvoyée par la méthode GetControlId; on a ainsi une meilleure lisibilité de ce que l'on fait, en lieu et place d'un arbre logique avec ses if et ses else...
Pour le test, j'ai fait :Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 void __fastcall TForm1::Targets(TWinControl *WinControl) { TControl *Control; for(int j = 0; j < WinControl->ControlCount; j++) { Control = WinControl->Controls[j]; //traite d'abord les objets dont le Control est parent if(Control->InheritsFrom(__classid(TWinControl))) { Targets((TWinControl*)Control); } //puis traite le Control switch(GetControlId(Control)) { case id_label : ((TLabel*)Control)->Caption = "Found"; break; case id_panel : ((TPanel*)Control)->Caption = "Found"; break; case id_speedbutton : ((TSpeedButton*)Control)->Caption = "Found"; break; //... } } }
Ce n'est qu'un exemple !Code:
1
2
3
4 void __fastcall TForm1::BitBtn1Click(TObject *Sender) { Targets(this); // donc ici la racine n'est autre que Form1 }
A plus !
Pour rentrer les balises de code:Citation:
Envoyé par aadelfa
Lorsque tu rédiges un message, tu dois avoir un bouton "#" juste au dessus de la zone de saisie, le dernier bouton à droite.
Tu dois avoir une barre d'outils avec G I S (123) (...) etc... et le dernier outil est le "#".
Appuie dessus, cela va insérer une balise de début et une balise de fin dans ton message. Tu as juste à entrer ton code entre ces 2 balises. C'est tout.
Franck
chapeau bas...je m'incline..:lahola: :ave:
j'avais pas pensé au coup des inherits.. :mouarf:
et ben le switch, suis d'accord ..je le fais d'hab mais là c t vite fait (ce qui n'excuse rien, je te l'accorde :aie:
Citation:
Envoyé par henderson
salut
j'ai creé une application ou j'ai mise 2 panels et des controles,mais quand je l'éxécute j'ai une erreur.
expected a file name
merci pour votre aide
allo...y'a quelqu'un????
suis désolé...mais :
- sers à rien de citer tout et n'importe quoi..
- tu ne dis jamais si tu as essayé les solutions qu'on te propose
- tu ne sembles pas du tout chercher par toi même..
fais un effort stp :sm:
Citation:
Envoyé par say
tes solutions non
les autres si
merci quand même
a dieu
alors..je te signale que c'est surtout que je t'ai pas livré une solution clé main...
suis vraiment navré...merci à henderson donc.
mais reconnais que c'etait difficile de savoir où tu en étais.
bonne continuation
P.S : pense au tag :resolu: si ce n'est déjà fait merci
Salut !
expected a file name ??? :mouarf:
Y' a des jours comme ça .... où rien ne va !!!
Il suffit d'appliquer sur les 2 panels, comme je l'ai montré pour la form.
En effet, un TPanel dérive de TWinControl donc...
A plus !Code:
1
2 Targets(Panel1); Targets(Panel2);
Citation:
Envoyé par henderson
je vais essayer ça
merci
salutCitation:
Envoyé par henderson
j'ai essayé et ça marche,mais quand j'insére des images.bmp,mon programme prend du temps pour appliquer ces images.
Code:
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 TControl *Control; const char *strSection; AnsiString A; TIniFile *f; AnsiString section; strSection="english"; try { TStringList *lSections = new TStringList(); f = new TIniFile("monfichier.ini"); f->ReadSection(strSection, lSections); for(int j = 0; j < WinControl->ControlCount; j++) { for(int i=0 ; i < lSections->Count ; ++i) { section = lSections->Strings[i]; AnsiString Valeur = f->ReadString(strSection,section,"");//paramètres = Section/Clé/Valeur par défaut Control = WinControl->Controls[j]; //traite d'abord les objets dont le Control est parent if(Control->InheritsFrom(__classid(TWinControl))) { Targets((TWinControl*)Control); } //puis traite le Control switch(GetControlId(Control)) { case id_label : if (((TLabel*)Control)->Name == section) { ((TLabel *)Control)->Caption=Valeur;} break; // case id_panel : if (((TLabel*)Control)->Name == section) // { // ((TPanel*)Control)->Caption = "Found"; break; case id_speedbutton : if (((TSpeedButton*)Control)->Name == section) { ((TSpeedButton*)Control)->Glyph->LoadFromFile(Valeur);} break; //... } } } delete lSections; } __finally { delete f; } }
merci pour tout
salut et merci beaucoup anderson ainsi que tousCitation:
Envoyé par henderson
désolé d'avoir oublié de mettre :resolu:
c un peu lent mais ça marche
:merci: :merci: :merci:Code:
1
2
3
4 void __fastcall TForm1::BitBtn1Click(TObject *Sender) { Targets(Form1); }