[C++\CLI + SFML] Zdarzenia zapewniające komunikację w obie strony między różnymi oknami programu
Witam!
Piszę prosty edytor do gier platformowych, który posiada kilka osobnych okien. Jedno z nich wyświetla mapę i umożliwia jej edycję, podczas gdy drugie umożliwia modyfikację dostępnych warstw mapy. W tym celu zdecydowałem
się na napisanie kilku własnych zdarzeń. Jedno z nich jest wywoływane, gdy zostanie zmieniona ilość dostępnych warstw mapy (jest to pierwsze zdarzenie własne z tego edytora, jak i również pierwsze jakie napisałem).
Cały program jest podzielony na kilka klas. Pierwsza z nich jest rdzeniem - obiekt tworzony na jej podstawie jest fundamentem programu i przechowuje jego wszystkie dane. Klasa ta nosi nazwę "Core". Kolejną klasą jest klasa
"ForDrawing" - obiekt z tej klasy jest odpowiedzialny głównie za wyświetlanie grafik i utrzymywanie głównego okna (z biblioteki SFML, wersji zgodnej z CLI), jest przechowywany w obiekcie z klasy "Core" i nosi nazwę
"drawing". Następną klasą jest klasa
"Layers" - tworzone jest na jej podstawie okno modyfikacji warstw mapy (Windows Forms), sam obiekt przechowywany jest w obiekcie z klasy
"ForDrawing" i nosi nazwę
"layerSelector". Zdarzenie znajduje się w pliku
"Layers.h". Klasy znajdują się w plikach o tych samych nazwach co klasy.
Kod kompiluje się bezbłędnie, program pada zaraz po starcie, w trakcie inicjalizacji zdarzeń. Wg. Visuala próba powiązania napisanego przeze mnie zdarzenia z funkcją, która ma być wykonana po jego wystąpieniu,
jest niemożliwa, gdyż "Odwołanie do obiektu nie zostało ustawione na wystąpienie obiektu.". Sprawdziłem powyższą sytuację - obiekt
"layerSelector" jest wg. Visuala niezdefiniowany, pomimo że jego konstruktor zostaje wywołany przed próbą powiązania zdarzeń, a program działa bez zarzutu w trybie release (jeżeli usunie się wadliwą linijkę kodu).
Oto kod:
Deklaracja Core:
main.cpp:
Core ^ core = gcnew Core;
core->loadData();
Core.h:
private:
ForDrawing ^ drawing;
System::Void addLayers();
void initializeComponents();
Core.cpp (konstruktor):
drawing = gcnew ForDrawing;
drawing->setWindow( screenDimensions );
initializeComponents();
ForDrawing.h:
Layers ^ layerSelector;
void setWindow( SFML::System::Vector2i screenDimensions );
ForDrawing.cpp (setWindow(...)):
Layers ^ layerSelector = gcnew Layers;
layerSelector->Show();
Layers.h (zdarzenie):
delegate void AddedDel();
interface struct AddI
{
public:
event AddedDel ^ E;
void addedLayers();
};
ref class EventSourceAdd
: public AddI
{
public:
virtual event AddedDel ^ E;
virtual void addedLayers()
{
E();
}
};
ref class EventReceiverAdd
{
public:
void Handler()
{
}
};
Deklaracja:
AddI ^ esAdd;
EventReceiverAdd ^ erAdd;
Stworzenie obiektów w konstruktorze:
this->esAdd = gcnew EventSourceAdd();
this->erAdd = gcnew EventReceiverAdd();
Przypisanie zdarzenia do funkcji (miejsce, w którym napotykany jest błąd. Core.cpp, initializeComponents()):
this->drawing->layerSelector->esAdd->E += gcnew MultiPurposeMapEditor::AddedDel( this, & Core::addLayers );
Siedziałem nad tym już parę godzin i nie mam pojęcia dlaczego, rzekomo, obiekt
"layerSelector" nie został zdefiniowany.
Używane środowisko: Visual Studio C++ 2015