[ MikeLDN @ 23.09.2006. 12:46 ] @
Da li je moguce napraviti funkcionalnost: template <typename T> class CMyDialog: public CDialog { ...... }; |
[ MikeLDN @ 23.09.2006. 12:46 ] @
[ NrmMyth @ 23.09.2006. 16:37 ] @
Ne vidim zasto nebi moglo.
[ djalfirevic @ 23.09.2006. 18:07 ] @
Apsolutno.
[ MikeLDN @ 24.09.2006. 00:01 ] @
problem sa makroima BEGIN_MESSAGE_MAP
kako ih formulisati i gde staviti? [ kiklop74 @ 24.09.2006. 00:44 ] @
Nece to tako moci. Microsoft je tako dizajnirao te MFC klase da je templatizacija prakticno neizvodiva ako se koriste message mape i sl.
Sta fali klasicnom nasledjivanju? [ MikeLDN @ 24.09.2006. 09:17 ] @
imam ceo niz templatizovanih algoritama i treba da prosledim tip u dijalog, ili mozda neki factory?
[ kiklop74 @ 24.09.2006. 15:15 ] @
Ajde malo to bolje objasni sa nekim pseudo kodom. Sta tacno zelis da uradis?
[ MikeLDN @ 24.09.2006. 15:38 ] @
OK.
Dakle neka je dialog npr dijalog za proracun i prikaz rezultata nekakvih objekata. Objekti su slicni i koriste zajednicke template f-je koje se staraju da urade obradu kako treba (gde je bilo potrebno uradjena je specijalizacija). Rezultat je da npr: template <typename T> void ProracunajNesto(T element) {...} radi kako treba za ProracunajNesto<klasa1> i za ProracunajNesto<klasa2> ..itd. Najintuitivnije bi bilo da u trenutku kad se kreira dijalog i kad znam za koj tip objekta je pozvan pozovem: CMyDialog<klasa1> dlg; dlg.DoModal(); ali ovo ne moze zbog MFC makroa vezanih za CDialog. Sledece sam probao sa Loki typelist-ama TYPELIST_n<klasa1,klasa2...> i to radi ok ako ti treba instanca preko konstantnog indexa ProracunajNesto<TYPELIST.TypeAt(1)> (sintaksa za indexirani pristup je malo drugacija ali to je ideja...) medjutim nece raditi sa promenljivim tipa CMyDialog.n_indexTipaZaKojiJePozvanOvajDijalog Izguglao sam neke varijante sa pravljenjem svog BEGIN_MESSAGE_MAP makroa ( http://www.codeguru.com/cpp/cp...c/templates/article.php/c4099/ ) ali to mi nesto ne mirise... Any idea? [ kiklop74 @ 24.09.2006. 19:17 ] @
Najbolje onda da imas neku vrstu template proxy klase iz koje ces puniti i pozivati dijalog. Nesto kao ovo:
Code: #pragma once ///Najbolje je definisati te objekte da imaju neki abstraktni interfejs class baseType { public: baseType() {} virtual void TransferTo(CEdit &ctrl) {} virtual void TransferTo(CListBox &ctrl) {} ///Dodati druge po zelji virtual CString ToString(void) {return CString();} }; class tip1 : public baseType { public: tip1() {} virtual void TransferTo(CEdit &ctrl) {ctrl.SetWindowText(m_string);} virtual void TransferTo(CListBox &ctrl) {ctrl.AddString(m_string);} virtual void TransferTo(CListCtrl &ctrl) {///itd.} virtual CString ToString(void) {return m_string;} ///Dodaj ovde ostale metode specificne za klasu private: CString m_string; }; template <class T, class dialogType> class proxyCaller { public: proxyCaller() {} ~proxyCaller() {} int DoShowModal(void) { ///Ovde treba implementirati punjenje dijaloga ///Dakle sve kontrole treba da budu u DoDataExchange ///Sve klase (tip T) koje ces da koristis ///je pozeljno da imaju iste metode za transfer podataka ///u zeljenu kontrolu Proracunajnesto(obj1); ProracunajNesto(obj2); dialogType dlg; //vrednosti mozes da postavljas ovako dlg.m_editbox1.SetWindowText(obj1.ToString()); dlg.m_editbox2.SetWindowText(obj2.ToString()); ///ili ovako obj1.TransferTo(dlg.m_editbox1); obj2.TransferTo(dlg.m_editbox2); return dlg.DoModal(); } private: T obj1; T obj2; }; class MyDialog : public CDialog { public: MyDialog(CWnd* pParent = NULL): CDialog(IDD_MYDIALOG, pParent) { } enum {IDD_MYDIALOG} CEdit m_editbox1; CEdit m_editbox2; protected: virtual void DoDataExchange(CDataExchange* pDX){ CDialog::DoDataExchange(pDX); DDX_Control(pDX, IDC_EDIT1, m_editbox1); DDX_Control(pDX, IDC_EDIT1, m_editbox2); } DECLARE_MESSAGE_MAP() }; [ MikeLDN @ 24.09.2006. 20:52 ] @
thnx,
mislim da ce moci tako, jedino sto cu sav dzumbus sa kontrolama spakovati u neki objekat pa cu njega da vozim kroz kod [ Dragi Tata @ 24.09.2006. 22:19 ] @
[ nikoladsp @ 29.09.2006. 08:21 ] @
dali bi ti odgovarao WTL?on se ponasa po svojoj prirodi kao sablon?moze i ATL, ali je WTL zgodan wrapper oko ATL i ima sve moje simpatije:brz je, jednostavan,kod je solidno brz,a nije zamuljan i bagovit kao MFC
Copyright (C) 2001-2025 by www.elitesecurity.org. All rights reserved.
|