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 :

Comment mettre un CString dans le champ lParam d'une CListCtrl


Sujet :

MFC

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 90
    Par défaut Comment mettre un CString dans le champ lParam d'une CListCtrl
    Bonjour,

    J'ai créé une CListCtrl et je souhaiterai que lorsque nous selectionnons une ligne dans cette CListCtrl puis que nous cliquons sur un bouton, un paramètre de type CString soit récupéré afin de poursuivre le traitement.

    Pour cela, j'utilise la méthode SetItemData, cependant je ne trouve pas comment passer un paramètre de type CString par le biais de cette méthode...

    J'aurais donc besoin d'un ptit coup de main pour trouver comment faire

    Merci d'avance!

  2. #2
    Membre chevronné
    Avatar de PetitPapaNoël
    Développeur informatique
    Inscrit en
    Septembre 2006
    Messages
    559
    Détails du profil
    Informations personnelles :
    Âge : 49

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 559
    Par défaut
    Bonjour,

    A mon avis, il n'est pas possible de passer directement un CString à la méthode SetItemData. Par contre, il est possible de lui passer l'adresse d'une variable de type CString, sous forme de pointeur.
    La méthode est évoquée dans la FAQ.

    Une autre méthode, moins élégante mais tout aussi efficace, consisterait à ajouter une colonne de largeur nulle (donc invisible pour l'utilisateur) dans laquelle seraient stockées les données (celles que tu cherches à stocker avec la méthode SetItemData). Celles ci seraient ensuite facilement accessibles via la méthode GetItemText.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 90
    Par défaut
    Pas bête la méthode du champ caché, c'est la méthode qui me semble le plus facil pour moi mais j'aimerai faire quelquechose de plus propre en utilisant le SetItemData.

    Par contre, n'étant pas trop à l'aise avec les pointeurs et adresses, je n'arrive pas à utiliser le bon code pour récupérer mon paramètre...

    mon code pour "setter" ma valeur et la "getter" ensuite est le suivant:

    Valorisation du paramètre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    m_ListForm.SetItemData(lvItem.iItem,(long)(LPCTSTR) typeFormulaire->_code);
    Récupération du paramètre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    CString newTypeForm;
    newTypeForm = (CString) (m_ListForm.GetItemData((int)m_ListForm.GetFirstSelectedItemPosition()-1));

  4. #4
    Membre chevronné
    Avatar de PetitPapaNoël
    Développeur informatique
    Inscrit en
    Septembre 2006
    Messages
    559
    Détails du profil
    Informations personnelles :
    Âge : 49

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 559
    Par défaut
    Pour bien faire, et pour éviter les fuites mémoire, il faut gérer tes pointeurs comme des membres protégés de ta fenêtre. Étant donné que tu travailles sur une grille, je suppose que le mieux serait de faire une liste de pointeurs sur des CString :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    CArray<CString*, CString*> m_pListe;
    Mais la simplicité voudrait plutôt que tu gères directement tes données dans un CStringArray tout simple, plutôt que te t'embêter avec des pointeurs et SetItemData...
    Si tu travaillais directement sur des pointeurs et que tu n'avais pas besoin de les créer, ce serait différent. Par exemple, si typeFormulaire était un pointeur sur un objet plutôt qu'une variable, tu pourrais carrément faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    m_ListForm.SetItemData(lvItem.iItem, reinterpret_cast<DWORD_PTR> (typeFormulaire));
    Ensuite, au moment de récupérer tes données, tu ferais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    CTypeFormulaire *pTypeFormulaire = reinterpret_cast<CTypeFormulaire*> (m_ListForm.GetItemData(position));

  5. #5
    Membre chevronné
    Avatar de PetitPapaNoël
    Développeur informatique
    Inscrit en
    Septembre 2006
    Messages
    559
    Détails du profil
    Informations personnelles :
    Âge : 49

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 559
    Par défaut
    Sinon, si tu veux quand même travailler avec SetItemData et des pointeurs, il y a une autre solution...
    Valorisation du paramètre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    CString *pCode = reinterpret_cast<CString*> (m_ListForm.GetItemData(lvItem.iItem));
     
    if (pCode)
    	delete pCode;
     
    pCode = new CString(typeFormulaire->_code);
     
    m_ListForm.SetItemData(lvItem.iItem, reinterpret_cast<DWORD_PTR> (pCode));
    Récupération du paramètre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    CString *pNewTypeForm = reinterpret_cast<CString*> (m_ListForm.GetItemData(position));
    Dans ce cas, il ne faut pas oublier de libérer la mémoire des pointeurs sur les CString au moment de la destruction de la fenêtre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    for (int i = 0 ; i < m_ListForm.GetItemCount() ; i++)
    {
    	CString *pCode = reinterpret_cast<CString*> (m_ListForm.GetItemData(i));
     
    	if (pCode)
    		delete pCode;
    }

  6. #6
    Membre chevronné
    Avatar de PetitPapaNoël
    Développeur informatique
    Inscrit en
    Septembre 2006
    Messages
    559
    Détails du profil
    Informations personnelles :
    Âge : 49

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 559
    Par défaut
    En ce qui me concerne, soit je travaille avec des pointeurs et dans ce cas j'utilise SetItemData, soit je gère une liste en parallèle dans une variable membre protégée de la classe associée à la fenêtre.

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

Discussions similaires

  1. Réponses: 12
    Dernier message: 12/05/2014, 10h31
  2. Réponses: 2
    Dernier message: 23/05/2012, 23h23
  3. Réponses: 13
    Dernier message: 03/10/2007, 11h25
  4. Réponses: 13
    Dernier message: 26/08/2005, 16h34
  5. Comment insérer un espace dans un champ
    Par davyd dans le forum Langage SQL
    Réponses: 4
    Dernier message: 22/03/2005, 10h00

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