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

MFC Discussion :

CComboxBox et SetItemData


Sujet :

MFC

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2011
    Messages : 47
    Points : 50
    Points
    50
    Par défaut CComboxBox et SetItemData
    Bonjour,

    Je veux créer une liste déroulante avec 2 choix possibles: Blanc et Noir

    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
    17
    18
    19
     
     
     const char *  tableau_Choix[]= {"blanc", "noir"};
     
     std::vector<std::string> vect_Choix;  ;  	vect_Choix.push_back("blanc");   vect_Choix.push_back("noir");
     
     
    m_CouleurCombo = (CComboBox*) GetDlgItem(IDC_COMBO1);
     
    l_Index = m_CouleurCombo->AddString(_T("Blanc"))
     m_CouleurCombo ->SetItemData(l_Index,(DWORD_PTR)m_tableauChoix[0])
     
    l_Index = m_CouleurCombo->AddString(_T("Noir"))
     m_CouleurCombo ->SetItemData(l_Index,(DWORD_PTR)vect_Choix[0].c_str())
     
     
     
    l_Index = m_CouleurCombo->AddString(_T("Noir"))
     m_CouleurCombo ->SetItemData(l_Index, 2eme paramètre)

    la question:

    Qu'est ce que je dois mettre dans le 2eme paramètre de la fonction SetItemData ?

    1/ tableau_Choix[0] tableau_Choix[1] ou
    2/ 0 ou 1 ou
    3/ si j'utilise le Vect_Choix à la place de tableau_Choix (DWORD_PTR)vect_Choix[0].c_str()

    Sinon à vrais dire je n'ai pas bien compris l'utilité de ce 2eme paramètre ? il doit être la chaine de caractère qui doit être affichée dans la liste déroulante,
    ou la position de cette chaine dans le tableau qu'on doit le créer avant (tableau_choix) ou ... ?

    Quelqu'un peut me donner plus d'explication svp

    Merci

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 073
    Points : 12 119
    Points
    12 119
    Par défaut
    http://msdn.microsoft.com/fr-fr/library/0ekb53ey.aspx

    Tu comptes te trimballer ces chaines de caractères "à la mode camembert" encore longtemps ?
    Tu fais comment quand tu devras faire une version multilingue ?

    On n'utilise pas des chaines de caractères dans le code business mais des identifiants correspondants.

    Et comment qu'on fait le lien entre le choix de l'utilisateur et ces identifiants ?

    Bin oui, avec l'entier 32 bits mis dans "ItemData", qui lui ne sera pas fonction ni de la langue ni d'un tri quelconque pour l'ergonomie de l'IHM.

  3. #3
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2011
    Messages : 47
    Points : 50
    Points
    50
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     l_Index = m_CouleurCombo->AddString(_T("Blanc"))
     m_CouleurCombo ->SetItemData(l_Index,  LE ID );
    En fait si j'ai bien compris le Index représente le classement de l'item ajouté dans le comboBox
    le 2 eme paramètre de SetItemData représente le ID de l'item

    alors le problème je vois pas la relation entre le ID et l'item (chaine de caractère) ? à quoi et comment va nous servir la combinaison (index, ID) ?
    par exemple si je veux récupérer la chaine de caractère de l'item sélectionné sans utiliser GetLBText comment je peux le faire en utilisant ID et GetItemData ?

    peux-tu me compléter ces 2 lignes: (pour le cas de 2 items par exemple blanc noir )

    1- Alimenter le comboBox :
    AddString ...
    SetItemData ...

    2-Récupérer la chaine de caractère de l'item sélectionné actuellement en utilisant le GetItemData :

    GetItemData...
    ...


    Merci

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 073
    Points : 12 119
    Points
    12 119
    Par défaut
    L'index est le numéro d'affichage dans la liste des choses à afficher, ce n'est pas une constante au cours du temps.
    Dans une comboBox triée par exemple, si vous ajoutez une chaine qui lexicalement est au début, tout se décale.
    L'index va de 0 au nombre de chaines à afficher -1.

    Les chaines en dûrs c'est mal.

    Si vous faites correctement votre architecture, vous n'aurez pas "Noir" et "Blanc" qui vont se balader dans toute votre application.
    Vous aurez des constantes pour traiter ce cas.
    Et la constante sera de type int car c'est bien plus simple pour les comparaisons.
    Et vous allez la mettre où cette constantes ?

    Si vous n'avez plus de chaine en dur mais des fichiers de ressources pour gérer les différentes langues, vous n'aurez quasiment plus besoin de la string mais que de l'ItemDate.

    1-
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    String str = MyLoadRessourcesFromNimporteNawak(BLACK);
    l_Index = m_CouleurCombo->AddString(str);
    m_CouleurCombo ->SetItemData(l_Index,BLACK);
    ...
    2- Cela n'a aucun sens, vous ne travaillez jamais avec une chaine mais avec une constante (si on utilise que la dropdownlist)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if-(m_CouleurCombo->GetItemData(m_CouleurCombo->GetCurSel())==BLACK){...} // Attention code non robuste
    Si vous voulez toujours avoir le texte pour continuer à avoir des chaines en dure :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    m_CouleurCombo->GetLBText(m_CouleurCombo->GetCurSel(),str) // Attention code non robuste
    http://msdn.microsoft.com/fr-fr/library/zcy9kze7.aspx

  5. #5
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Euh, je ne crois pas que la combobox inclue de quoi retrouver la string à afficher directement à partir de l'ItemData, si?
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  6. #6
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2011
    Messages : 47
    Points : 50
    Points
    50
    Par défaut
    En fait ce que je cherche à comprendre c'est la combinaison ( constantes , chaine en dûr) ex: (BLACK, "noir"), je veux savoir comment on les déclare et dans quel fichier exactement ?
    On utilise des enum + structure où ...? J'aimerai bien voir un exemple si c'est possible !

    Mercii

  7. #7
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 073
    Points : 12 119
    Points
    12 119
    Par défaut
    Dans un programme correctement écrit, il n'y a pas de constantes chaînes en dur.

    La méthode la plus répandue pour stocker du texte localisable en MFC, c'est dans des dll de ressources.
    https://support.microsoft.com/kb/198...?wa=wsignin1.0

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

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