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

Composants VCL Delphi Discussion :

Charger une combobox avec Items.AddObject


Sujet :

Composants VCL Delphi

  1. #1
    Membre confirmé

    Profil pro
    Inscrit en
    Mars 2002
    Messages
    1 184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 184
    Points : 619
    Points
    619
    Par défaut Charger une combobox avec Items.AddObject
    Bonjour,

    Je voudrais utiliser un TCombobox et la charger avec Items.AddObject pour inclure à la fois le libellé visible et le code interne correspondant

    Si je charge les informations 'en dur' ce la fonctionne très bien
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
       PO_Combo.Items.Clear;
       PO_Combo.Items.AddObject('NORD',        TObject('59'));
       PO_Combo.Items.AddObject('OISE',         TObject('60'));
    Je récupère mon code avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    function TDM.DM_ValeurCombobox(PO_Combo  : TCombobox) : String;
    Begin
       Result := '';
       if PO_Combo.ItemIndex >= 0 then begin
          Result := String(PO_Combo.Items.Objects[PO_Combo.ItemIndex]);
       end;
    End;
    Par contre si les informations proviennent d'un recordset je n'arrive pas à retrouver mes valeurs
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
      While Not QUERY_ADO.EOF do Begin
            LC_Libelle := QUERY_ADO.Fields[0].AsString;
            LC_Valeur  := QUERY_ADO.Fields[1].AsString;
            PO_Combo.Items.AddObject(LC_Libelle, TObject(LC_Valeur));
            if LC_Valeur = PC_Valeur then LN_Index := PO_Combo.Items.Count - 1;
            QUERY_ADO.Next;
      End;
    Merci de vos conseils parce que je ne vois pas très bien la différence

  2. #2
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 445
    Points
    28 445
    Par défaut
    alors, d'abord c'est très mal d'utiliser AddObject() on y stocke généralement n'importe quoi et surtout ce qu'il ne faut pas...c'est le cas de ton exemple d'ailleurs.

    tu peux associer une StringList à la combo.

    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
     
    // avec SL_Code: TStringList
    begin
      PO_Combo.Items.Clear;
      SL_Code.Clear;
      PO_Combo.Items.Add('NORD');
      SL_Code.Add('59');
      PO_Combo.Items.AddObject('OISE');
      SL_Code.Add('60');
    end;
     
    function TDM.DM_ValeurCombobox(PO_Combo  : TCombobox) : String;
    Begin
       Result := '';
       if PO_Combo.ItemIndex >= 0 then begin
          Result := SL_Code[PO_Combo.ItemIndex];
       end;
    End;
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  3. #3
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 041
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 041
    Points : 40 947
    Points
    40 947
    Billets dans le blog
    62
    Par défaut
    Bonsoir,

    Pour l'astuce (astuce dans Delphi About.Com ) concernant ces Objets il me semble qu'il faut que l'objet soit un entier
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  4. #4
    Membre confirmé

    Profil pro
    Inscrit en
    Mars 2002
    Messages
    1 184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 184
    Points : 619
    Points
    619
    Par défaut
    Merci

    L'idée d'une TStringList parallèle à la combobox est effectivement une solution
    Le problème est ensuite lorsqu'il y a beaucoup de combobox dans l'écran

    La solution de SergioMaster fonctionne même avec des chaînes

    J'ai déclaré une classe
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Type
       TLSTCOMBO = class
                       private
                           fCode : string;
                       public
                       property Code: string read fCode;
                       constructor Create(const Code : string);
                   end;
    Un constructeur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    constructor TLSTCOMBO.Create(const Code : string) ;
     begin
       fCode := Code;
     end;
    Pour charger la combobox la méthode ressemble à celle que j'utilisais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
      While Not QUERY_ADO.EOF do Begin
            LC_Libelle := QUERY_ADO.Fields[0].AsString;
            LC_Valeur  := QUERY_ADO.Fields[1].AsString;
            PO_Combo.Items.AddObject(LC_Libelle, TLSTCOMBO.Create(LC_Valeur));
            if LC_Valeur = PC_Valeur then LN_Index := PO_Combo.Items.Count - 1;
            QUERY_ADO.Next;
      End;

  5. #5
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 445
    Points
    28 445
    Par défaut
    oui, mais ce que je n'aime pas dans cette approche c'est que l'objet perd son type, et qu'il faut gérer la libération à la main de chacune de ses instances...avec le StringList on a Clear ou Free et le tour est joué.
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  6. #6
    Membre confirmé

    Profil pro
    Inscrit en
    Mars 2002
    Messages
    1 184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 184
    Points : 619
    Points
    619
    Par défaut
    qu'il faut gérer la libération à la main de chacune de ses instances
    C'est exact et, pour l'instant, je ne m'en suis pas encore occupé, j'ai voulu avancer dans le développement.
    Par contre tous les écrans de mon applications appartiennent à une classe que j'ai dérivée de TForm. Je pense donc ajouter un code dans le onQueryClose qui va lire les composants et si ce sont des combobox libérer l'object attaché à chaque item

    Je publierai le code dans ce topic

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 30/10/2013, 12h12
  2. [XL-2007] Charger une ComboBox avec des valeurs dépendants d'OptionBox
    Par brunounours dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 07/05/2012, 14h55
  3. [AC-2007] Sélectionner un item d'une combobox avec une valeur?
    Par Vhalar dans le forum VBA Access
    Réponses: 1
    Dernier message: 08/09/2011, 22h07
  4. [XL-2003] Charger une ComboBox avec des données d'une feuille 2
    Par jam92400 dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 18/10/2010, 16h50
  5. Réponses: 3
    Dernier message: 06/02/2008, 22h35

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