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 :

Passer un composant Tcombobox en parametre


Sujet :

Delphi

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2013
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2013
    Messages : 36
    Points : 27
    Points
    27
    Par défaut Passer un composant Tcombobox en parametre
    Bonjour à tous,

    J'ai besoin de votre aide. Dans mon application, lorsque je clique sur un bouton, je souhaite créer et remplir une ComboBox. Voici mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
            c:=Tcombobox.Create(self);
            c.Width := 190;
            c.Height := 28;
            c.Top:=110;
            c.Left:=24;
            c.Visible:=true;
            c.Style:=csDropDownList;
            c.Parent := Panel1;
            c.Name:='ma_combobox;
     
            actualiser_ma_combo();
    Après avoir créer ce composant, j'appel la procedure suivante qui me permet d'alimenter la combo a partir d'une base de données mais je souhaiterais passer cette combobox en paramètre. Voila mon code permettant d'actualiser ma combo :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
          ADOQuery.SQL.Clear;
          ADOQuery.SQL.Add('select * from categorie');
          ADOQuery.Open;
     
          ma_combo_a_remplir.Clear;
          while not ADOQuery.Eof do
            begin
               ma_combo_a_remplir.Items.Add(ADOQuery.FieldByName('libelle_categ').AsString);
              ADOQuery.Next;
            end;
    Comment passer un composant TCombobox en paramètre ?

    Merci à vous

  2. #2
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    Pas sur que cela soit çà que tu veuilles

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    procedure TForm1.RemplirCombobox(ACombo : TComboBox);
    begin
     ADOQuery.SQL.Clear;
     ADOQuery.SQL.Add('select * from categorie');
     ADOQuery.Open;
     
     ACombo.Clear;
     while not ADOQuery.Eof do
     begin
       ACombo .Items.Add(ADOQuery.FieldByName('libelle_categ').AsString);
       ADOQuery.Next;
     end;  
    end;
    Appel :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    RemplirCombobox(c);
    Sinon il serait peut être plus simple d'utiliser un DbLookupComboBox (il y a le nécessaire quand la delphi)
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2013
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2013
    Messages : 36
    Points : 27
    Points
    27
    Par défaut
    Si si c'est exactement ca que je veux, j'avais déjà essayer mais ca me met : TCombobox identificateur non déclaré..

  4. #4
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    Citation Envoyé par bboy_lil_mak Voir le message
    Si si c'est exactement ca que je veux, j'avais déjà essayer mais ca me met : TCombobox identificateur non déclaré..
    En gros ca veut dire qu'il ne trouve pas de liens dans les unités vers la classe TCombobox. En général pour régler ce problème :

    1- Tu positionnes le curseur sur TCombobox
    2- Tu appuies sur F1
    3- Tu cherches dans propriétés la colonne unité (ici StdCtrls)
    4- Tu ajoutes l'unité dans les uses de ton unité où tu as la fonction
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

  5. #5
    Membre expert
    Avatar de e-ric
    Homme Profil pro
    Apprenti chat, bienfaiteur de tritons et autres bestioles
    Inscrit en
    Mars 2002
    Messages
    1 550
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Apprenti chat, bienfaiteur de tritons et autres bestioles

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 550
    Points : 3 916
    Points
    3 916
    Par défaut
    Salut

    Une approche plus générale consiste à passer non pas la ComboBox mais la TStrings associée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    procedure TForm1.RemplirListe(Strs: TStrings);
    begin
     ADOQuery.SQL.Clear;
     ADOQuery.SQL.Add('select * from categorie');
     ADOQuery.Open;
     
     Strs.Clear;
     while not ADOQuery.Eof do
     begin
       Strs.Add(ADOQuery.FieldByName('libelle_categ').AsString);
       ADOQuery.Next;
     end;  
    end;
    puis à l'appel
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
      RemplirListe(c.items);
    Pour ton dernier problème, ajoutes l'unité StdCtrls dans la clause uses.
    @+

    M E N S . A G I T A T . M O L E M
    Debian 64bit, Lazarus + FPC -> n'oubliez pas de consulter les FAQ Delphi et Pascal ainsi que les cours et tutoriels Delphi et Pascal

    "La théorie, c'est quand on sait tout, mais que rien ne marche. La pratique, c'est quand tout marche, mais qu'on ne sait pas pourquoi. En informatique, la théorie et la pratique sont réunies: rien ne marche et on ne sait pas pourquoi!".
    Mais Emmanuel Kant disait aussi : "La théorie sans la pratique est inutile, la pratique sans la théorie est aveugle."

  6. #6
    Nouveau membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2013
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2013
    Messages : 36
    Points : 27
    Points
    27
    Par défaut
    Nickel ca fonctionne avec l'ajout de StdCtrls dans le uses. Merci beaucoup à vous =)

  7. #7
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 654
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 654
    Points : 5 209
    Points
    5 209
    Par défaut
    Ce qui signifie que tu n'as pas tenu compte de la remarque de e-ric car TStrings est déclaré dans "classes".

    Personnellement, je trouve que passer un composant en paramètre est déjà limite mais passer un composant en paramètre alors que tu as uniquement besoin d' une seule de ces propriétés est une pratique à bannir absolument !

  8. #8
    Membre expert
    Avatar de e-ric
    Homme Profil pro
    Apprenti chat, bienfaiteur de tritons et autres bestioles
    Inscrit en
    Mars 2002
    Messages
    1 550
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Apprenti chat, bienfaiteur de tritons et autres bestioles

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 550
    Points : 3 916
    Points
    3 916
    Par défaut
    @popo : Si je me souviens bien Classes, ainsi que quelques autres, est ajoutée automatiquement quand une fiche est créée. Cela donne un minimum de service quand on écrit du code, merci à la bienveillance des concepteurs de Delphi. bboy_lil_mak est donc innocenté, peut-être malgré lui , sur ce coup-là.Le fait que le compilo n'ai rien dit au sujet de son code de création m'interpelle plus, est-ce que ce code se trouve dans celui de la fenêtre ??

    @bboy_lil_mak : quand tu crées dynamiquement un composant, il faut t'assurer que l'unité correspondante se trouve bien dans la bonne clause uses (il y en a deux). On atteint les limites de la bidirectionnalité, pour les composants placés en conception, Delphi se charge de la mise à jour de la clause uses. Mais pour les composants créés à l'exécution, quedale, c'est pour ta pomme.
    Personnellement, je trouve que passer un composant en paramètre est déjà limite mais passer un composant en paramètre alors que tu as uniquement besoin d' une seule de ces propriétés est une pratique à bannir absolument !
    Oui, c'est une bonne approche mais dans la pratique, de nombreux développeurs ne suivent pas les canons de la programmation. Il m'arrive d'y déroger() mais c'est une question de jugement sur le problème à résoudre. Le fond prévaut sur la forme et pas de dogmatisme mais un petit effort de rigueur ne fait pas de mal.

    M E N S . A G I T A T . M O L E M
    Debian 64bit, Lazarus + FPC -> n'oubliez pas de consulter les FAQ Delphi et Pascal ainsi que les cours et tutoriels Delphi et Pascal

    "La théorie, c'est quand on sait tout, mais que rien ne marche. La pratique, c'est quand tout marche, mais qu'on ne sait pas pourquoi. En informatique, la théorie et la pratique sont réunies: rien ne marche et on ne sait pas pourquoi!".
    Mais Emmanuel Kant disait aussi : "La théorie sans la pratique est inutile, la pratique sans la théorie est aveugle."

  9. #9
    Nouveau membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2013
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2013
    Messages : 36
    Points : 27
    Points
    27
    Par défaut
    @popo : Pourquoi dis tu que le fait de passer un composant en paramètre est une pratique à banir ? Enfin dans mon cas je ne vois pas comment faire autrement. Tu me dis que je n'ai besoin que d'une seul des propriété de la Combo mais je ne vois pas pourquoi. Il me faut l'intégralité de la combo sachant que je veux pouvoir la clear et la remplir a partir non pas de ma fiche mais d'une unité reliée à cette fiche (ce qui répond a la question de e-ric).

    P.S : j'ai essayé de passer en parametre un TString mais il me marque également "identificateur non déclaré".

  10. #10
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 654
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 654
    Points : 5 209
    Points
    5 209
    Par défaut
    Citation Envoyé par bboy_lil_mak Voir le message
    @popo : Pourquoi dis tu que le fait de passer un composant en paramètre est une pratique à banir ?
    Je n'ai pas dis que passer un composant en paramètre est une pratique à bannir. Relis bien, j'ai précisé qu'il ne fallait pas le faire si tu n'utilises qu'une seule de ses propriété.

    Citation Envoyé par bboy_lil_mak Voir le message
    Enfin dans mon cas je ne vois pas comment faire autrement. Tu me dis que je n'ai besoin que d'une seul des propriété de la Combo mais je ne vois pas pourquoi. Il me faut l'intégralité de la combo sachant que je veux pouvoir la clear et la remplir a partir non pas de ma fiche
    mais d'une unité reliée à cette fiche (ce qui répond a la question de e-ric).

    P.S : j'ai essayé de passer en parametre un TString mais il me marque également "identificateur non déclaré".
    Pour faire ça tu n'a pas besoin de passer tout le composant. Comme l'a indiqué e-ric, les éléments de la liste sont stockés dans la propriété "Items" de ladite combo. Cette propriété est de type "TStrings" (ne pas oublier le "s") qui contient entre autre les méthodes suivantes :
    - clear : pour vider la liste
    - add : pour ajouter un élément dans la liste

  11. #11
    Membre émérite Avatar de edam
    Homme Profil pro
    Développeur Delphi/c++/Omnis
    Inscrit en
    Décembre 2003
    Messages
    1 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur Delphi/c++/Omnis
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 894
    Points : 2 771
    Points
    2 771
    Par défaut
    Citation Envoyé par bboy_lil_mak Voir le message
    @popo : Pourquoi dis tu que le fait de passer un composant en paramètre est une pratique à banir ?
    c'est ce que je fais pour remplir mes dbcombobox, mais aussi d'autre type de composant qui on une proprité type Tstrings,
    PAS DE DESTIN, C'EST CE QUE NOUS FAISONS

  12. #12
    Nouveau membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2013
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2013
    Messages : 36
    Points : 27
    Points
    27
    Par défaut
    Merci pour les infos c'est toujours bon à savoir.
    Cependant c'est bien "TStrings" que j'avais marqué et qui m'indiquait "identificateur non déclaré".

  13. #13
    Membre expert
    Avatar de e-ric
    Homme Profil pro
    Apprenti chat, bienfaiteur de tritons et autres bestioles
    Inscrit en
    Mars 2002
    Messages
    1 550
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Apprenti chat, bienfaiteur de tritons et autres bestioles

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 550
    Points : 3 916
    Points
    3 916
    Par défaut
    C'est toujours pas résolu ?

    M E N S . A G I T A T . M O L E M
    Debian 64bit, Lazarus + FPC -> n'oubliez pas de consulter les FAQ Delphi et Pascal ainsi que les cours et tutoriels Delphi et Pascal

    "La théorie, c'est quand on sait tout, mais que rien ne marche. La pratique, c'est quand tout marche, mais qu'on ne sait pas pourquoi. En informatique, la théorie et la pratique sont réunies: rien ne marche et on ne sait pas pourquoi!".
    Mais Emmanuel Kant disait aussi : "La théorie sans la pratique est inutile, la pratique sans la théorie est aveugle."

  14. #14
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 654
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 654
    Points : 5 209
    Points
    5 209
    Par défaut
    Je l'ai mentionné précédemment, "TStrings" est déclaré dans l'unité "Classes".

    e-ric a tout à fait raison sur le fait que cette unité est ajoutée automatiquement lorsqu'on créee une fiche. Ce n'est cependant pas le cas lorsque tu crée une unité vierge comme c'est le cas pour toi.

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

Discussions similaires

  1. Réponses: 7
    Dernier message: 16/03/2007, 20h28
  2. Réponses: 6
    Dernier message: 17/10/2006, 10h48
  3. passer une fonction dans un parametre d'une propriété de classe
    Par CAML dans le forum Général JavaScript
    Réponses: 22
    Dernier message: 06/08/2006, 20h52
  4. Etude du composant TComboBox
    Par eponette dans le forum Composants VCL
    Réponses: 1
    Dernier message: 12/08/2005, 13h37
  5. passer un tableau dynamique en parametre...
    Par annecyrond dans le forum Langage
    Réponses: 5
    Dernier message: 07/03/2003, 10h59

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