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

 Delphi Discussion :

Boucler sur des composants


Sujet :

Delphi

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    549
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 549
    Par défaut Boucler sur des composants
    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

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 45
    Par défaut proposition de fonction
    En gros, il te faudrait une fonction de ce 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;
    Puis un appel du genre
    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;
    J'ai bon?

  3. #3
    Expert confirmé

    Avatar de Nono40
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2002
    Messages
    8 640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2002
    Messages : 8 640
    Par défaut
    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.
    Delphi :
    La F.A.Q. , 877 réponses à vos questions !
    264 sources à consulter/télécharger !

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 45
    Par défaut
    Citation Envoyé par Nono40 Voir le message
    Ta liste ne sera jamais détruite => Fuite de mémoire.
    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:

    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;
    Et là, plus de fuite de mémoire.

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    549
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 549
    Par défaut
    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

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 45
    Par défaut
    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

    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;
    N'hésite pas à tester dans tous les sens. C'est en plantant qu'on comprend comment ça (ne) marche (pas).

    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.

  7. #7
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 086
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 086
    Par défaut
    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

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    549
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 549
    Par défaut
    merci pour vos reponses je vais me pencher dessus avec je l espere toute la reussite que j attends

  9. #9
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    549
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 549
    Par défaut
    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 :

    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;
    Pb : La classe n a pas de propriete par defaut !

    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.

  10. #10
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 086
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 086
    Par défaut


    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 !


    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));
    OU

    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;
    le Pere sera souvent une TForm, sinon voir la propriété Controls au lieu de Components !
    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

  11. #11
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    549
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 549
    Par défaut
    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....

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

Discussions similaires

  1. Réponses: 9
    Dernier message: 29/01/2007, 11h00
  2. [XSLT] boucler sur des attributs
    Par damyrid dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 30/03/2006, 10h43
  3. Boucler sur des champs texte
    Par syl2095 dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 25/11/2004, 16h15
  4. boucler sur des checkboxes
    Par El Saigneur dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 09/10/2004, 08h27
  5. [VB6] Comment boucler sur des controls d'un form ?
    Par lankviller dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 27/01/2003, 16h29

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