Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Publiczne dziedziczenie

Ostatnio zmodyfikowano 2016-02-10 22:18
Autor Wiadomość
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.


C/C++
//main.cpp
MapGuard * mapGuard = new MapGuard;


C/C++
// mapGuard.h
class MapGuard
    : public map < string, vector < Guard > >
{
public:
    MapGuard() { }
    ~MapGuard() { };
};

C/C++
//tabOne.cpp
void CTabOne::OnCbnSetfocusCombo1()
{
    // TODO: Add your control notification handler code here
    //----- a tu chciałbym działać na *mapGuard
}
P-144604
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=bxmdI4O3TGo
tutaj mam obiekt "stos" który steruje przyciskiem z automatu!!!
P-144618
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 ) :(
P-144627
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.html

C/C++
void __fastcall TForm1::Button1Click( TObject * Sender )
{
    Label1->Caption = ComboBox1->Items->Strings[ 2 ]; // Odczytano drugą pozycję z listy licząc od zera.
}
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

C/C++
...NowaKlasa...
{
    MapGuard * mapGuard...
    comboBox...
   
    ....
    NowaKlasa::CTabOne::OnCbnSetfocusCombo1()
    {
        // TODO: Add your control notification handler code here
        //----- a tu chciałbym działać na *mapGuard
    }
   
    // tu chyba już nie ma problemu z dostępem do mapGuard
    ...
}


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.

P-144628
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
C/C++
// TabOne.h
extern MapGuard * mapGuard;
// CTabOne dialog

class CTabOne
    : public CDialogEx
{
    DECLARE_DYNAMIC( CTabOne )
   
    public
: CTabOne( CWnd * pParent = NULL ); // standard constructor
    CTabOne( MapGuard & mapGuard, CWnd * pParent = NULL ); // mój constructor
    virtual ~CTabOne();
   
    // Dialog Data
    enum { IDD = IDD_TAB_ONE };
   
protected:
    virtual void DoDataExchange( CDataExchange * pDX ); // DDX/DDV support
   
    DECLARE_MESSAGE_MAP()
    public
: afx_msg void OnCbnSetfocusCombo1( MapGuard * mapGuard ); // nie przyjmuje argumentów !!!
};

C/C++
// TabOne.cpp

// CTabOne dialog

IMPLEMENT_DYNAMIC( CTabOne, CDialogEx )

CTabOne::CTabOne( CWnd * pParent /*=NULL*/ )
    : CDialogEx( CTabOne::IDD, pParent )
{
   
}

CTabOne::CTabOne( MapGuard & mapGuard, CWnd * pParent /*=NULL*/ )
    : 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 ) // tu błąd
END_MESSAGE_MAP()


// CTabOne message handlers



void CTabOne::OnCbnSetfocusCombo1( MapGuard * mapGuard )
{
    // TODO: Add your control notification handler code her
   
   
}


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.
P-144636
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 ?

C/C++
{
    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

C/C++
BEGIN_MESSAGE_MAP( CTabOne, CDialogEx )

ON_CBN_SETFOCUS( IDC_COMBO1, & CTabOne::OnCbnSetfocusCombo1 ) // tu błąd
END_MESSAGE_MAP()

nie napisałeś jaki :(

ale poszukajmy w dokumentacji
https://msdn.microsoft.com​/pl-pl/library/9x1t4dy1.aspx

składnia w porządku
C/C++
BEGIN_MESSAGE_MAP(
theClass
,
baseClass )

/*
Parametry

theClass
Specifies the name of the class whose message map this is.
baseClass
Specifies the name of the base class of theClass.
*/


teraz linia błędu - patrzę na
DECLARE_MESSAGE_MAP i ON_CBN_SETFOCUS
https://msdn.microsoft.com​/pl-pl/library/08ea0k43.aspx


Map entry                              Function prototype
ON_CBN_SETFOCUS( <id>, <memberFxn> )   afx_msg void memberFxn( );
 
z
https://msdn.microsoft.com​/en-us/library/x2waazz1.aspx


ON_WM_SETFOCUS( ) afx_msg void OnSetFocus( CWnd* );
z
https://msdn.microsoft.com​/en-us/library/abt9e73h.aspx

z
http://forums.codeguru.com​/showthread.php​?388521-CComboBoxEx
ON_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.aspx

C/C++
BEGIN_MESSAGE_MAP( CMyDoc, CDocument )
ON_COMMAND( ID_MYCMD, & CMyDoc::OnMyCommand )
END_MESSAGE_MAP()

//Twój kod

BEGIN_MESSAGE_MAP( CTabOne, CDialogEx )

ON_CBN_SETFOCUS( IDC_COMBO1, & CTabOne::OnCbnSetfocusCombo1 ) // tu błąd
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




P-144674
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ć.

C/C++
void CTabOne::OnCbnSetfocusCombo1()
{
    // TODO: Add your control notification handler code here
    MapGuard TmapGuard = CTabOne::sendMap( * mapGuard );
}

MapGuard CTabOne::sendMap( MapGuard & mapGuard )
{
    return( mapGuard );
}
P-144720
« 1 »
  Strona 1 z 1