Bonjour
J ai plusieurs checkBox que j aimerais tester dans une boucle for mais je ne sais pas comment nommer ces composants pour y parvenir
Merci de votre aide
Bonjour
J ai plusieurs checkBox que j aimerais tester dans une boucle for mais je ne sais pas comment nommer ces composants pour y parvenir
Merci de votre aide
En gros, il te faudrait une fonction de ce genre?
Puis un appel du genre
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 function ListeComposants(Pere : TWinControl; TypeVoulu:TClass):TComponentList; var NumComp: integer; Composant : TComponent; procedure AddList(Dest,source:TObjectList); var i : integer; begin for i := 0 to source.Count-1 do Dest.Add(source[i]); end; begin result := TComponentList.Create(false); For NumComp := 0 to Pere.ComponentCount-1 do begin Composant := Pere.Components[NumComp]; if Composant is TWinControl then //Si le composant actuel est en conteneur, on cherche recursivement les comosant voulu AddList(Result,ListeComposants(TWinControl(Composant), TypeVoulu)); if Composant is TypeVoulu then Result.Add(Composant); end; //next NumComp end;
J'ai bon?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 procedure TForm1.Button1Click(Sender: TObject); var liste : TComponentList; i : integer; begin Liste := ListeComposants(self,TCheckBox); for i := 0 to Liste.Count-1 do showMessage(TCheckBox)(Liste[i]).Caption); end;
Ta liste ne sera jamais détruite => Fuite de mémoire.
D'autre part le test récursif n'est utilie qu'en cas de création dynamique avec un Owner différent de la fiche. Delphi place le Owner sur la fiche systématiquement.
Eh! T'a vu l'heure de mon post
Effectivement, en supposant qu'on n'a pas créé les composant dinamiquement ou que les composant créé dynamiquement on tous le même Owner, ça se simplifie en:
Et là, plus de fuite de mémoire.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 function ListeComposants(Pere : TWinControl; TypeVoulu:TClass):TComponentList; var NumComp: integer; begin result := TComponentList.Create(false); For NumComp := 0 to Pere.ComponentCount-1 do begin if Pere.Components[NumComp] is TypeVoulu then Result.Add(Pere.Components[NumComp]); end; //next NumComp end;
ok merci pour ces reposes toutefois j aurais besoin de quelques precisions.
Cette boucle implique que les composents soient crees à la suite non ?
J imaginais qu il etait possible de les nommer comme tableau, par exemple
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 For J:=1 to 7 do begin if compo[J].checked = true then ...le traitement... end
Ca implique...pas grand chose. Mais évidement, ce n'est pas sur que cela fasse ce que tu veut.
Tous les composants créé dans une fiche Form1 sont dans la liste "Form1.Components" (dans les cas simple, du moins). La procédure que j'ai écrite permet de "filtrer" les composants d'un type précis. Par exemple TCheckbox.
Evidemment, l'ordinateur n'étant pas télépathe, il ne te donne pas "ce que tu veut", il te donne simplement tous les composants concernés et dans l'ordre de leur création. Si tu veut autre chose, à toi de filtrer ou réorganiser à partir de la liste de composants obtenus.
Le résultat est une liste et non un tableau, mais ça s'utilise de manière similaire.
Le seul problème est que les élément de la liste sont supposé être de type TComponent. Donc "MaListe[i].Checked" va planté parce que la propriété "TComponent.checked" n'existe pas.
Mais puisque tu sais que ce composant sera effectivement un TCheckBox, tu peut transtyper l'objet et taper un truc de ce genre
N'hésite pas à tester dans tous les sens. C'est en plantant qu'on comprend comment ça (ne) marche (pas).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 var MonCheckBox : TCheckBox; MaListe : TComponentList; begin ... For J:=0 to Liste.count-1 do begin MonCheckbox := TCheckBox(MaListe[j]); //MonCheckBox et MaListe[j] sont le même objet, mais Delphi sais que MonCheckbox est un TCheckBox if MonCheckbox[J].checked then ... le traitement ... end;
Une façon élégante de contourné ce désagrément serait de créer une classe TCheckBoxList dérivant de TComponentList, mais là, il faut que je m'en aille.![]()
Tu peux le faire par un Tableau :
un SetLength, et tu fais tes Create, c'est idem à TObjectList de Madlozoz
c'est pareil ceci, un booléen n'a pas besoin d'être comparé ...
Code : Sélectionner tout - Visualiser dans une fenêtre à part if compo[J].checked = true then
Code : Sélectionner tout - Visualiser dans une fenêtre à part if compo[J].checked then
Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !![]()
Attention Troll Méchant !
"Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
L'ignorance n'excuse pas la médiocrité !
L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
Il faut avoir le courage de se tromper et d'apprendre de ses erreurs
merci pour vos reponses je vais me pencher dessus avec je l espere toute la reussite que j attends
Je fais remonter ce post parce que je rencontre un pb
J ai 4 richedit sur mon form (Rich1, Rich2..Rich4)
J ai modifié le code comme suit :
Pb : La classe n a pas de propriete par defaut !
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 function TForm1.ListeComposants(Pere: TWinControl; TypeVoulu: TClass): TComponentList; var Rich : TRichEdit; MaListe : TComponentList; j : integer; begin For J:=0 to 3 do begin Rich := TRichEdit(MaListe[j]); Rich[j].lines.add(inttostr(j)); end; end;
Avec le checkbox, pas de pb mais là ça coince. Pourqoui les proprietes des checkbox sont prises en compte et pas là et est il possible d y remedier ?
merci pour votre aide.
Quel est le problème ?
Rich est un Edit, pas un Tableau ! Au bout de 18 mois, tu ne maitrise par mieux les objets Delphi, c'est inquiétant !
ou
Code : Sélectionner tout - Visualiser dans une fenêtre à part Rich.lines.add(inttostr(j));
OU
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 For J:=0 to 3 do Rich := TRichEdit(MaListe[j]).lines.add(inttostr(j));
le Pere sera souvent une TForm, sinon voir la propriété Controls au lieu de Components !
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 function TForm1.ListeComposants(Pere: TWinControl; TypeVoulu: TClass): TComponentList; var j : integer; begin Result := TComponentList.Create(); for j := 0 to Pere.ComponentCount - 1 do if Pere.Components[j] is TypeVoulu then Result.Add(Pere.Components[j]); end;
Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !![]()
Attention Troll Méchant !
"Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
L'ignorance n'excuse pas la médiocrité !
L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
Il faut avoir le courage de se tromper et d'apprendre de ses erreurs
je te remercie pou te reponse et oui, c est vrai, je ne maitrise pas dutout le concept objet d une maniere générale. En théorie, pas de pb mais des lors ou il faut passer à la pratique....
C etait si simple avec le basic amstrad....
Partager