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

C++Builder Discussion :

ComboBox utilisant Names et Values


Sujet :

C++Builder

  1. #1
    Membre éclairé
    Homme Profil pro
    Consultant technique
    Inscrit en
    Juillet 2002
    Messages
    519
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

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

    Informations forums :
    Inscription : Juillet 2002
    Messages : 519
    Par défaut ComboBox utilisant Names et Values
    Bonjour,

    J'ai essayé d'utiliser les names/values des TStrings * en suivants les instructions de la faq : http://cpp.developpez.com/faq/bcb/?p...glistclevaleur

    Avec le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Form7->ComboBox1->Items->Add(IBQueryDivers->FieldByName("Nom_de_la_societe")->AsString + Form7->ComboBox1->Items->NameValueSeparator + IBQueryDivers->FieldByName("Numero_de_client")->AsString);
    Et cela affiche "société=1" dans la combobox. Hors, je veux afficher "Société" et pouvoir rectrouver son ID par le Values.

    Une idée?

    Merci

  2. #2
    Membre éclairé
    Homme Profil pro
    Consultant technique
    Inscrit en
    Juillet 2002
    Messages
    519
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

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

    Informations forums :
    Inscription : Juillet 2002
    Messages : 519
    Par défaut
    J'ai essayé le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Form7->ComboBox1->Items->Clear();
    int indextemp = Form7->ComboBox1->Items->Add("");
    Form7->ComboBox1->Items->Values[indextemp] = "0";
    for (int I = 0; I < IBQueryDivers->RecordCount; I++)
        {
        indextemp = Form7->ComboBox1->Items->Add(IBQueryDivers->FieldByName("Nom_de_la_societe")->AsString);
        Form7->ComboBox1->Items->Values[indextemp] = IBQueryDivers->FieldByName("Numero_de_client")->AsString;
        IBQueryDivers->Next();
        }
    Et cela me donne le résultat suivant :
    j'ai mis le contenu entre guillemet mais pour bien voir qu'il y a un champs vide. Ils n'apparaissent pas dans le TComboBox.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ""
    "0=0"
    "société"
    "2=1"

  3. #3
    Membre émérite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2005
    Messages
    401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Seine Maritime (Haute Normandie)

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 401
    Par défaut
    Hello,

    La propriété Values de TStrings prend un AnsiString en argument.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    for (int I = 0; I < IBQueryDivers->RecordCount; I++)
        {
        AnsiString nomSociete = IBQueryDivers->FieldByName("Nom_de_la_societe")->AsString;
        Form7->ComboBox1->Items->Add(nomSociete);
        Form7->ComboBox1->Items->Values[nomSociete] = IBQueryDivers->FieldByName("Numero_de_client")->AsString;
        IBQueryDivers->Next();
        }
    Sinon sous Builder 2007, il y a ValueFromIndex:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    for (int I = 0; I < IBQueryDivers->RecordCount; I++)
        {
        indextemp = Form7->ComboBox1->Items->Add(IBQueryDivers->FieldByName("Nom_de_la_societe")->AsString);
        Form7->ComboBox1->Items->ValueFromIndex[indextemp] = IBQueryDivers->FieldByName("Numero_de_client")->AsString;
        IBQueryDivers->Next();
        }
    Si le but est de stocker le numéro de client dans un coin, tu peux utiliser la propriété Objets de TStrings...

  4. #4
    Membre éclairé
    Homme Profil pro
    Consultant technique
    Inscrit en
    Juillet 2002
    Messages
    519
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

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

    Informations forums :
    Inscription : Juillet 2002
    Messages : 519
    Par défaut
    Merci

    Mais ça ne fonctionne pas. J'ai enlevé l'ajout de la ligne vide pour voir ce que donne la boucle.

    Avec le 1er code que tu proposes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    "société"
    "société=1
    Et le 2ème :
    Je ne voulais pas utiliser d'objet juste pour stocker un chiffre alors qu'une fonctionne existe déja pour ça.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    for (int I = 0; I < IBQueryDivers->RecordCount; I++)
        {
        AnsiString nomSociete = IBQueryDivers->FieldByName("Nom_de_la_societe")->AsString;
        Form7->ComboBox1->Items->Add(nomSociete);
        Form7->ComboBox1->Items->Values[nomSociete] = (AnsiString)IBQueryDivers->FieldByName("Numero_de_client")->AsString;
        IBQueryDivers->Next();
        }
    Jai aussi essayé avec en les modifiant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    for (int I = 0; I < IBQueryDivers->RecordCount; I++)
        {
        indextemp = Form7->ComboBox1->Items->Add((AnsiString)IBQueryDivers->FieldByName("Nom_de_la_societe")->AsString);
        Form7->ComboBox1->Items->ValueFromIndex[indextemp] = (AnsiString)IBQueryDivers->FieldByName("Numero_de_client")->AsString;
        IBQueryDivers->Next();
        }

  5. #5
    Membre éclairé
    Homme Profil pro
    Consultant technique
    Inscrit en
    Juillet 2002
    Messages
    519
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

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

    Informations forums :
    Inscription : Juillet 2002
    Messages : 519
    Par défaut
    Petite précision :
    J'ai fait du pas à pas sur le for et il passe une seule fois dans la boucle. Normal puisqu'il y a une seule société dans ma bdd de test.

  6. #6
    Membre émérite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2005
    Messages
    401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Seine Maritime (Haute Normandie)

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 401
    Par défaut
    ok, mea cupla, je n'avais pas testé le code !

    Pour la 1ère solution, faut virer ->Add():
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    for (int I = 0; I < IBQueryDivers->RecordCount; I++)
        {
        AnsiString nomSociete = IBQueryDivers->FieldByName("Nom_de_la_societe")->AsString;
        Form7->ComboBox1->Items->Values[nomSociete] = (AnsiString)IBQueryDivers->FieldByName("Numero_de_client")->AsString;
        IBQueryDivers->Next();
        }
    Pour la 2ème solution, qui n'apporte pas grand chose, pour que ça marche mieux: (utiliser Values et Names impose d'avoir le séparateur '=')
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    indextemp = Form7->ComboBox1->Items->Add(nomSociete)->AsString + "=");
    Form7->ComboBox1->Items->ValueFromIndex[indextemp] = numeroClient;
    Sinon, pour les objets, c'est juste une manière détournée de stocké un ID entier:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    stringListe->Objects[i] = (TObject*)IDClient;
    IDClient = (int)stringListe->Objects[i];

  7. #7
    Membre éclairé
    Homme Profil pro
    Consultant technique
    Inscrit en
    Juillet 2002
    Messages
    519
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

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

    Informations forums :
    Inscription : Juillet 2002
    Messages : 519
    Par défaut
    La 1ère solution ne fonctionne toujours pas. J'obtiens :
    Pour la 2ème solution, je ne comprend pas la logique puisque indextemp est le numéro retourné par la fonction Add et tu veux lui attribuer un AnsiString? Et du coup obtenir exactement la même chose que pour la 1ère solution.

    En fait, le ComboBox n'a pas l'air de gérer le couple Names/Values.

  8. #8
    Membre émérite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2005
    Messages
    401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Seine Maritime (Haute Normandie)

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 401
    Par défaut
    La 1ère solution correspond à ce que l'on est en droit d'attendre de Values/Names, mais en effet ce n'est peut-être pas de ça que tu as besoin !!

    Pour la 2ème solution, quand tu appelles ValueFromIndex, il va rechercher le n-ème élément dans la liste en vérifiant qu'il est bien de la forme "X=". Si le séparateur = est absent, il te rajoute une ligne "=valeur"... cf le fichier source Classes.pas...

    Au final, tu vas peut-être te retrouver à utiliser Objects...

  9. #9
    Membre éclairé
    Homme Profil pro
    Consultant technique
    Inscrit en
    Juillet 2002
    Messages
    519
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

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

    Informations forums :
    Inscription : Juillet 2002
    Messages : 519
    Par défaut
    Effectivement, je n'avais pas compris les choses comme ça.

    Et tout fonctionne avec un objet.

    .h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    class TIndexPerso : public TObject
    {
    public:
            int index;
    };
    .cpp
    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
    for (int i = 0; i < Form7->ComboBox1->Items->Count; i++)
        {
        if (Form7->ComboBox1->Items->Objects[i] != NULL)
           {
           delete Form7->ComboBox1->Items->Objects[i];
           }
        }
    Form7->ComboBox1->Items->Clear();
    TIndexPerso *indexpersovide = new TIndexPerso();
    indexpersovide->index = 0;
    int indextemp;
    Form7->ComboBox1->Items->Add("");
    Form7->ComboBox1->Items->Objects[0] = indexpersovide;
    for (int I = 0; I < IBQueryDivers->RecordCount; I++)
        {
        TIndexPerso *indexpersovide = new TIndexPerso();
        indexpersovide->index = IBQueryDivers->FieldByName("Numero_de_client")->AsInteger;
        indextemp = Form7->ComboBox1->Items->Add(IBQueryDivers->FieldByName("Nom_de_la_societe")->AsString);
        Form7->ComboBox1->Items->Objects[indextemp] = indexpersovide;
        IBQueryDivers->Next();
        }
    Et dans le OnClose de la Form :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    for (int i = 0; i < Form7->ComboBox1->Items->Count; i++)
        {
        if (Form7->ComboBox1->Items->Objects[i] != NULL)
           {
           delete Form7->ComboBox1->Items->Objects[i];
           }
        }
    Merci pour tout

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

Discussions similaires

  1. [RegEx] preg_match dans formulaire pour recupérer les name et value
    Par natsou_k dans le forum Langage
    Réponses: 6
    Dernier message: 19/04/2010, 20h52
  2. [SBI BIRT] Erreur de transformation quand Birt utilise Allow Multiples values
    Par atee dans le forum SpagoBI
    Réponses: 1
    Dernier message: 23/04/2009, 17h09
  3. Remplir une comboBox avec name et id
    Par Phenomenium dans le forum Ext JS / Sencha
    Réponses: 2
    Dernier message: 01/07/2008, 11h12
  4. Utilisation du Row Value Constructor
    Par Antoun dans le forum SQL
    Réponses: 7
    Dernier message: 31/07/2007, 16h20
  5. [ACCESS] utilisation de Top Value
    Par Arko76 dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 30/03/2007, 19h33

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