NiceFox Temat założony przez niniejszego użytkownika |
Publiczne dziedziczenie » 2016-02-08 18:28:51 Zakopałem się. Napisałem dużo kodu i nie wiem jak z tego wyjść. Chciałem do comboBoxa: zrobić przesłać obiekt jako argument i działać na nim, ale niestety tak niemożna : void CTabOne::OnCbnSetfocusCombo1(*mapGuard), co zrobić żeby obiekt był widoczny w tej funkcji ? Mam sporo referencji do tej klasy. Myslalem coś w rodzaju powiązania obiektu oryginałow mapGuard z kontenerem. MapGuard * mapGuard = new MapGuard;
class MapGuard : public map < string, vector < Guard > > { public: MapGuard() { } ~MapGuard() { }; };
void CTabOne::OnCbnSetfocusCombo1() { }
|
|
mateczek |
» 2016-02-08 21:59:31 Rozumiem, że dostępu do klasy CTabOne aby zmodyfikować konstruktor tak by przyjął wskaźnik na twój obiekt nie możesz?? A Czy dziedziczenie po CTabOne również nie wchodzi w rachubę?? Znaczy czy możesz stworzyć klasę dziedziczącą po CTabOne?? Czy to jest obiekt dodany przez graficzny designer?? No i zasadnicze pytanie czy "mapGuard" musi być w funkcji main?? Czy obiekt "mapGuard" może być zdefiniowany wewnątrz klasy okna ??Tej klasy której to klasy składową jest funkcja void CTabOne::OnCbnSetfocusCombo1()?? W QT (ja się bawie właśnie w QT)jest wspaniały mechanizm sygnałów i slotów, Mechanizm który umożliwia takie łączenie obiektów bez ingerencji w ich strukturę. Ja tam na visualu się nie znam!!! Ale można poszukać czegoś podobnego (sygnały i sloty). trochę of-top ale może pokażę jak taki mechanizm działa w QT https://www.youtube.com/watch?v=bxmdI4O3TGotutaj mam obiekt "stos" który steruje przyciskiem z automatu!!! |
|
NiceFox Temat założony przez niniejszego użytkownika |
» 2016-02-09 11:17:39 Nie mogę konstruktora zmodyfikować, bo obiekt nie jest dostępny globalnie. CTabOne jest dodane przez graficzy desinger. mapGuard musi być w funkcji main, nie może być utworzony w klasie okna. ( za dużo referencji jest do tego obiektu ) :(
|
|
darko202 |
» 2016-02-09 12:53:49 wydaje się , że to o czym piszesz jest możliwe musimy tylko spojrzeć na ten problem zgodnie z zasadami " w klasie możesz mieć dostęp tylko do elementów klasy i dostęp w postaci tzw. zaprzyjaźnienia http://cpp0x.pl/kursy/Programowanie-obiektowe-C++/Podstawy/Przyjazn/501" to drugie wiąże się z modyfikacja klasy, a tego jak piszesz nie można ale :) jak to jest możliwe, że możemy przekazywać informacje, pomiędzy różnymi elementami w programie popatrzmy na http://programowanie.cal.pl/cyfbar/combo.htmlvoid __fastcall TForm1::Button1Click( TObject * Sender ) { Label1->Caption = ComboBox1->Items->Strings[ 2 ]; }
jeśli nie widać już rozwiązania to odpowiedzmy sobie na pytanie czym jest TForm1 podobnie trzeba zrobić w Twoim przypadku. niestety nie do końca czuję struktury Twojego projektu, ale cos podobnego musi istnieć, ewentualnie jeśli nie to możesz coś takiego zrealizować. np. poprzez utworzenie własnej klasy zawierającej combobox i CTabOne ...NowaKlasa... { MapGuard * mapGuard... comboBox... .... NowaKlasa::CTabOne::OnCbnSetfocusCombo1() { } ... }
gdyby mapGuard by l tworzony gdzieś indziej to jest wskaźnik i takie cos można łatwo przekazać do nowej klasy np. w jej konstruktorze. |
|
NiceFox Temat założony przez niniejszego użytkownika |
» 2016-02-09 14:47:02 Zrobiłem tak z tą różnicą że dodałem 2-gi konstruktor do klasy. W BEGIN_MESSAGE_MAP jest błąd bo afx_msg void OnCbnSetfocusCombo1(MapGuard *mapGuard); nie może przyjmować argumentów extern MapGuard * mapGuard;
class CTabOne : public CDialogEx { DECLARE_DYNAMIC( CTabOne ) public : CTabOne( CWnd * pParent = NULL ); CTabOne( MapGuard & mapGuard, CWnd * pParent = NULL ); virtual ~CTabOne(); enum { IDD = IDD_TAB_ONE }; protected: virtual void DoDataExchange( CDataExchange * pDX ); DECLARE_MESSAGE_MAP() public : afx_msg void OnCbnSetfocusCombo1( MapGuard * mapGuard ); };
IMPLEMENT_DYNAMIC( CTabOne, CDialogEx )
CTabOne::CTabOne( CWnd * pParent ) : CDialogEx( CTabOne::IDD, pParent ) { }
CTabOne::CTabOne( MapGuard & mapGuard, CWnd * pParent ) : CDialogEx( CTabOne::IDD, pParent ) { }
CTabOne::~CTabOne() { }
void CTabOne::DoDataExchange( CDataExchange * pDX ) { CDialogEx::DoDataExchange( pDX ); }
BEGIN_MESSAGE_MAP( CTabOne, CDialogEx )
ON_CBN_SETFOCUS( IDC_COMBO1, & CTabOne::OnCbnSetfocusCombo1 ) END_MESSAGE_MAP()
void CTabOne::OnCbnSetfocusCombo1( MapGuard * mapGuard ) { }
Zrobiłem to w ten sposób dodając do classy TabOne funkcje sendMap : void CTabOne::OnCbnSetfocusCombo1() { // TODO: Add your control notification handler code here MapGuard TmapGuard = CTabOne::sendMap(*mapGuard); }
MapGuard CTabOne::sendMap(MapGuard &mapGuard) { return (mapGuard); }
Nie wiem czy to jest eleganckie rozwiązanie. |
|
darko202 |
» 2016-02-10 08:42:51 1. >> Nie wiem czy to jest eleganckie rozwiązanie. problemem nie jest elegancja :) ale zastanów się jaki podstawowy błąd popełniasz ? { deklarujemy funkcje void void CTabOne::OnCbnSetfocusCombo1() { ... a w niej deklarujemy zmienna lokalna, kt ó ra ginie po wyjsciu z metody ewidentnie nie mozemy nic zrobic z tym w innym miejscu ... }
czy jest to dobrze : wydaje się że nie. 2. Wracajac do wcześniejszej wypowiedzi musisz opanować podstawowy problem tzn. zakres widoczności zmiennych do tego sprowadza się to co napisałem wczesniej. 3. >> tu błąd BEGIN_MESSAGE_MAP( CTabOne, CDialogEx )
ON_CBN_SETFOCUS( IDC_COMBO1, & CTabOne::OnCbnSetfocusCombo1 ) END_MESSAGE_MAP()
nie napisałeś jaki :( ale poszukajmy w dokumentacji https://msdn.microsoft.com/pl-pl/library/9x1t4dy1.aspxskładnia w porządku BEGIN_MESSAGE_MAP( theClass , baseClass )
teraz linia błędu - patrzę na DECLARE_MESSAGE_MAP i ON_CBN_SETFOCUS https://msdn.microsoft.com/pl-pl/library/08ea0k43.aspxMap entry Function prototype ON_CBN_SETFOCUS( <id>, <memberFxn> ) afx_msg void memberFxn( ); z https://msdn.microsoft.com/en-us/library/x2waazz1.aspxON_WM_SETFOCUS( ) afx_msg void OnSetFocus( CWnd* ); z https://msdn.microsoft.com/en-us/library/abt9e73h.aspxz http://forums.codeguru.com/showthread.php?388521-CComboBoxExON_CBN_SETFOCUS is a macro which maps CBN_SETFOCUS notification. This notification is sent through WM_COMMAND messagee to parent window when the combo box receives the focus. dochodzę do strony https://msdn.microsoft.com/en-us/library/0x0cx6b1.aspxBEGIN_MESSAGE_MAP( CMyDoc, CDocument ) ON_COMMAND( ID_MYCMD, & CMyDoc::OnMyCommand ) END_MESSAGE_MAP()
BEGIN_MESSAGE_MAP( CTabOne, CDialogEx )
ON_CBN_SETFOCUS( IDC_COMBO1, & CTabOne::OnCbnSetfocusCombo1 ) END_MESSAGE_MAP()
widoczna różnica czy IDC_COMBO1 jest ID_MYCMD ? jeśli tak to składnia wygląda na zgodną jeśli nie to tu masz problem trudno mi coś więcej napisać. ponieważ nie używałem tych konstrukcji - to nie mam więcej pomysłów |
|
NiceFox Temat założony przez niniejszego użytkownika |
» 2016-02-10 22:18:48 Do void CTabOne::OnCbnSetfocusCombo1() wrzucam funkcje, która daje oryginał kontenera, który już nie ginie lokalnie. Lepiej było kontener deklarować globalnie, a nie wrzucać do klasy przez dziedziczenie, ale już jest za późno na zmiany. Co do błędu to chodzi o to że nie mogę dać argumentu w void CTabOne::OnCbnSetfocusCombo1() , jak wrzucam argumenty to oczywiście błąd wyskoczy. Tych linków wyżej jeszcze nie zdążyłem przerobić. void CTabOne::OnCbnSetfocusCombo1() { MapGuard TmapGuard = CTabOne::sendMap( * mapGuard ); }
MapGuard CTabOne::sendMap( MapGuard & mapGuard ) { return( mapGuard ); }
|
|
« 1 » |