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 :

compter les composants d'un TForm


Sujet :

Delphi

  1. #1
    Membre actif Avatar de Speed41
    Homme Profil pro
    Inscrit en
    Novembre 2002
    Messages
    718
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 718
    Points : 210
    Points
    210
    Par défaut compter les composants d'un TForm
    Bonjour,

    Je voudrais vérifier tous les composant d'un TForm. Facile me direz vous ben oui depuis une unité de mon programme mais là c'est plus compliqué pour moi. J'ai créé un objet qui doit compter tous les objets du TForm le supportant et ben je n'y arrive pas.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for i:=0 to componentcount-1 do
    ne prends pas tous les composants du Form

    Même avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for i:=0 to parent.componentcount-1 do
    Voir éventuellement compter uniquement les objets de son parent.

    Quand je fais appel à components[i] (i=0 ou i=1) j'ai toujours une erreur d'index hors limite alors que componentcount=5 mais j'ai 9 objets alors Grrrrr et


    Merci de votre aide

  2. #2
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Points : 3 263
    Points
    3 263
    Par défaut
    Salut,

    J'ai créé un objet qui doit compter tous les objets du TForm le supportant
    Avant de faire for i:=0 to componentcount-1 do ...
    T'as peut-être oublié de faire un with MaFormLeSupportant do begin
    ... sinon faudrait montrer le code de l'objet que tu as créé.

    A+.
    N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  3. #3
    Membre expérimenté
    Avatar de retwas
    Homme Profil pro
    Développeur Java/Delphi
    Inscrit en
    Mars 2010
    Messages
    698
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Java/Delphi
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 698
    Points : 1 608
    Points
    1 608
    Billets dans le blog
    4
    Par défaut
    Comme l'indique Gilbert, un with ou

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for i := 0 to TMaForm.ComponentCount- 1

  4. #4
    Membre actif Avatar de Speed41
    Homme Profil pro
    Inscrit en
    Novembre 2002
    Messages
    718
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 718
    Points : 210
    Points
    210
    Par défaut
    Heu comment dire, c'est un objet donc je ne connais pas le nom du TForm qui contient mon objet qui celui ci peut être dans un TPanel un Tscrollbox voir les deux et même d'autres objets. Je ne sais pas tout cela par avance car ce n'est pas une unité de mon programme mais un objet à part entière.

    Sauf si c'est moi qui ne comprends pas mais ça ne fonctionne pas

    Merci de votre aide

  5. #5
    Membre actif Avatar de Speed41
    Homme Profil pro
    Inscrit en
    Novembre 2002
    Messages
    718
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 718
    Points : 210
    Points
    210
    Par défaut
    oups voici le code

    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
    procedure Tligne.Calcul_ligne;
    Var table : array of integer;
        i, n, x1,x2, xx1, xx2, nb : integer;
    begin
      table:=nil;
      n:=0;
      for i:=0 to componentcount-1 do
          if (parent.components[i] is tLigne) and
             ((parent.components[i] as Tligne).parent = parent) then
             begin
               table[n]:=i;
               inc(n);
             end;
      nb:=1;
      if n>0 then
         begin

  6. #6
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 858
    Points : 11 300
    Points
    11 300
    Billets dans le blog
    6
    Par défaut
    Il faut peut-être récupérer les parents depuis ton objet, en remontant dans la hiérarchie, jusqu'à arriver à une fiche, et de là, repartir en sens inverse :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    pere:=self;
    while not(Parent is TForm)
    do pere:=self.Parent;
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  7. #7
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 696
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 696
    Points : 13 135
    Points
    13 135
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    for i := 0 to Parent.ControlCount -1 do
      if (Parent.Controls[i] is tLigne) then
      begin
        ...
      end;

  8. #8
    Membre actif Avatar de Speed41
    Homme Profil pro
    Inscrit en
    Novembre 2002
    Messages
    718
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 718
    Points : 210
    Points
    210
    Par défaut
    Heu désolé tourlourou mais ça tourne en rond et ça n'aboutit à rien

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    pere:=self;
    while not(Parent is TForm) do
            pere:=self.Parent;
    Tu déclare comment Pere ?

  9. #9
    Membre actif Avatar de Speed41
    Homme Profil pro
    Inscrit en
    Novembre 2002
    Messages
    718
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 718
    Points : 210
    Points
    210
    Par défaut
    Je viens de tester ça

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Var table : array of integer;
        i, n, x1,x2, xx1, xx2, nb : integer;
        pere : TControl;
    begin
      table:=nil;
      pere:=self.parent;
      showmessage(pere.name);
      n:=0;
      for i:=0 to pere.componentcount-1 do
          ...
    Il s'affiche bien le nom du parent de mon objet mais il ne compte aucun composant avec pere.componentcount. Pourquoi, à votre avis ?

  10. #10
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 696
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 696
    Points : 13 135
    Points
    13 135
    Par défaut
    Components est la liste des composants dont l'objet est propriétaire, visuels ou non (leurs Owner = Self).
    Controls est la liste des contrôles visuels enfants (leurs Parent = Self).

    Tu mélanges les deux

  11. #11
    Membre actif Avatar de Speed41
    Homme Profil pro
    Inscrit en
    Novembre 2002
    Messages
    718
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 718
    Points : 210
    Points
    210
    Par défaut
    Oui je confond les deux

    Alors dans mon exemple pourquoi quand j'écris
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Var table : array of integer;
        i, n, x1,x2, xx1, xx2, nb : integer;
        pere : TControl;
    begin
      table:=nil;
      pere:=self.parent;
      showmessage(pere.name);
      n:=0;
      for i:=0 to pere.ControlCount-1 do
    j'ai 'erreur "[Erreur] Chrono_Periode.pas(336): Identificateur non déclaré : 'ControlCount'" sur la dernière ligne ?


    Je suis un tout petit peu complètement perdu

  12. #12
    Membre actif Avatar de Speed41
    Homme Profil pro
    Inscrit en
    Novembre 2002
    Messages
    718
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 718
    Points : 210
    Points
    210
    Par défaut
    En déclarant pere comme TWincontrol, ça marche

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Var table : array [0..255] of integer;
        i, n, x1,x2, xx1, xx2, nb : integer;
        pere : TWinControl;
    begin
      pere:=self.parent;
      showmessage(pere.name);
      n:=0;
      for i:=0 to pere.ControlCount-2 do

    pfff pas facile tout ça.

    Ai-je juste ?

  13. #13
    Membre actif Avatar de Speed41
    Homme Profil pro
    Inscrit en
    Novembre 2002
    Messages
    718
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 718
    Points : 210
    Points
    210
    Par défaut
    Pour éviter la déclaration et une variable

    Voici le code final

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Var table : array of integer;
        i, n, x1,x2, xx1, xx2, nb : integer;
    begin
      n:=0;
      for i:=0 to (self.parent).ControlCount-1 do
          if (parent.controls[i] is tligne) then
             begin

    Ca marche, c'est déjà ça.

    Grand merci pour votre aide (je vais mieux regarder TControl et Tcomponent)

  14. #14
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Points : 3 263
    Points
    3 263
    Par défaut
    Bonjour,

    J'ai pas compris pourquoi il faut passer par le parent, car en faisant comme suit j'ai un accès direct aux composants tEdit placés sur ma Tform nommée frmEquas6 (frmEquas6 est le nom de la var du type tForm en non le nom du type) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    procedure LibererChampsResultats;
    var       i : integer;
    begin     with frmEquas6 do
              begin i:=0;
                    repeat if (components[i] is tEdit)
                           and ((components[i] as tEdit).tag=4) then
                           begin (components[i] as tEdit).free;
                                 ChampsResultatsExistent:=False;
                                 .... 
                           end else inc(i);  
                    until i>=ComponentCount;
              end;
    end;
    A+.
    N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  15. #15
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Points : 3 263
    Points
    3 263
    Par défaut
    Re-bonjour,

    A propos de
    Speed41 : Heu comment dire, c'est un objet donc je ne connais pas le nom du TForm ...
    A l'instant où tu fais appel à ton objet il suffit de lui passer en paramètre le nom de la var qui désigne le tForm qui contient les components cibles.

    A+.
    N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  16. #16
    Membre actif Avatar de Speed41
    Homme Profil pro
    Inscrit en
    Novembre 2002
    Messages
    718
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 718
    Points : 210
    Points
    210
    Par défaut
    Ca marchait (un truc un peu pareil) mais depuis mon unité dans mon programme mais quand j'ai créé un objet ça fonctionnait plus. Il comptait les objets dans mon objet et ce n'est pas ce que je voulais. Voilà pourquoi je passe par son parent

  17. #17
    Membre expérimenté Avatar de guillemouze
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    876
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 876
    Points : 1 448
    Points
    1 448
    Par défaut
    Citation Envoyé par Gilbert Geyer Voir le message
    Re-bonjour,

    A propos de
    A l'instant où tu fais appel à ton objet il suffit de lui passer en paramètre le nom de la var qui désigne le tForm qui contient les components cibles.

    A+.
    ... mais tu y perd en flexibilité. L'interet de faire ce qu'il a fait, c'est que peu importe ou tu place ton composant,tu peux lister tes copains qui ont le même parent, que ce soit une form, un panel, ...

    Le plus clair serait peut être de faire une fonction spécifique pour ca :
    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 Tligne.GetVoisins: TComponentList;
    begin
      Result := TComponentList.Create(False);
      for i := 0 to parent.ControlCount-1 do
          if (parent.Controls[i] is tLigne) then
            Result.Add(parent.Controls[i]);
    end;
     
    //et ta fonction
    procedure Tligne.Calcul_ligne;
    Var voisins: TComponentList; 
        i, n, x1,x2, xx1, xx2, nb : integer;
    begin
      voisins := Self.GetVoisins;
     
      nb:=1;
      if voisins.Count>0 then
         begin
           //et utiliser TLigne(Voisins[i]).XXX
    ...
      voisins.Free;

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

Discussions similaires

  1. [Swing] Mettre une police à tous les composants
    Par MrEddy dans le forum AWT/Swing
    Réponses: 2
    Dernier message: 02/05/2004, 15h21
  2. [C#] Compter les lignes d'un DataSet
    Par alexischmit dans le forum ASP.NET
    Réponses: 13
    Dernier message: 26/04/2004, 15h17
  3. Compter les valeurs d'un tableau
    Par leeloo076 dans le forum ASP
    Réponses: 6
    Dernier message: 30/03/2004, 13h29
  4. Envoie d'un message a TOUS les composant d'une form
    Par chddv dans le forum Composants VCL
    Réponses: 7
    Dernier message: 15/09/2003, 09h47
  5. Les composants : ATL, DLL, COM, OCX, ...
    Par Pucpood dans le forum Windows
    Réponses: 3
    Dernier message: 04/07/2003, 10h03

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