Bonjour,
Je travaille sous Borland Developer Studio 2006 et je souhaite utiliser cette magnifique invention que sont les "smart pointers", et spécialement le shared_ptr de la librairie BOOST. Tout se passe bien dans mes classes métier mais je coince quand je souhaite peupler une TListView avec les objets contenus dans un std::vector< shared_ptr<...> >. Au moment de peupler mon TListView, je dois associer un objet à la propriété Data de chaque TListItem, et cet objet doit avoir un type générique "void*". Ensuite, quand je veux récupérer l'objet associé à un TListItem sur lequel l'utilisateur vient de cliquer, je ne sais pas comment procéder pour convertir de void* vers shared_ptr<...>.
Exemple : j'ai un classe CPersonne qui décrit une personne (nom et prénom). J'ai un singleton qui permet de gérer une espèce de carnet d'adresses contenant des personnes. En gros, j'ai les donc les instructions suivantes dans mon code :
Quand je veux peupler la TListView avec les personnes du singleton, je fais :
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
22
23
24 class CPersonne { private: std::string _Nom; std::string _Prenom; public: ... }; typedef boost::shared_ptr<CPersonne> TPersonne; typedef std::vector<TPersonne> TListePersonnes; class CGestionnairePersonnes { private: TListePersonnes _ListePersonnes; public: unsigned int GetNbPersonnes() {return _ListePersonnes.size();} TPersonne GetPersonne(int i) {return _ListePersonnes.at(i);} ... }
C'est l'instruction en rouge qui, selon moi, permet de convertir le shared_ptr en un void* acceptable par la TListView.
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 ListViewPersonnes->Items->BeginUpdate(); ListViewPersonnes->Items->Clear(); for (unsigned int i = 0; i < PERSONNES.GetNbPersonnes(); i++) { TListItem* item = ListViewPersonnes->Items->Add(); TPersonne personne = PERSONNES.GetPersonne(i); item->Data = boost::shared_ptr<void>(personne).get(); item->Caption = personne->GetPrenom().c_str(); item->SubItems->Add(personne->GetNom().c_str()); } ListViewPersonnes->Items->EndUpdate();
Ensuite, je ne sais pas comment reconvertir ce void* en TPersonne pour pouvoir l'exploiter, par exemple lors de la sélection d'un TListItem :
Quelqu'un a une idée ? A base de shared_ptr<void>, static_pointer_cast, ou tout autre chose ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 void __fastcall TFormMain::ListViewPersonnesSelectItem(TObject *Sender, TListItem *Item, bool Selected) { TPersonne p = ???????? Item->Data ?????; }
Merci !
Partager