Witam wszystkich forumowiczów i nie tylko :).
Kiedy zaczynałem uczyć się C++ wszystko wydawało się łatwe i przyjemne. Program uruchamiał się w konsoli, nie trzeba było się martwić o buttony, zdarzenie okna i inne tego typu rzeczy- wystarczył
std::cout. lub
printf i byłem zadowolonym, że program działa i wyświetla mi tekst (bajer, nie?). Kiedy aplikacje konsolowe zaczęły nie być wystarczające zacząłem uczyć się tworzyć programy z użyciem GUI. Na pierwszy ogień poszło WinAPI.Wszystko było ok, dopóki nie zacząłem przywiązywać wagi to estetyki kodu (nie mówię, że wcześniej nie przywiązywałem) oraz nie zacząłem posługiwać się programowaniem obiektowym. Tu zaczęły się schody... i po pewnym czasie stanąłem przed (jak dla mnie) nie łatwym zadaniem jakim jest połączenie GUI z... np. bazą danych, czy czymkolwiek poza GUI. Heh..., oczywiście mówię tu o ładnym, estetycznym oraz czytelnym kodzie- bez zmiennych globalnych itp.
Posłużę się przykładem. Mamy oto taką klasę okna (oraz "kontrolek"):
class cControls
{
HWND hButton;
public:
bool InitControls( void );
};
class cWindow
: public cControls
{
HWND hMainWindow;
public:
bool InitWindow( void );
};
Przymknijmy oko na szczegóły- to tylko
przykład.
Ok, mamy więc tą klasę- tworzy się nam ładne okno oraz wyświetlają kontrolki itp. Przyszedł czas na stworzenie kasy obsługującą bazę danych:
struct sPerson
{
std::string name;
int age;
std::string address;
std::string town;
};
class cDate
{
sPerson somePerson;
public:
InitDate( void );
};
Przymknijmy oko na szczegóły- to tylko
przykład.
Kod sprawuje się pięknie, dane się wczytują szybko i bezszelestnie. Teraz tylko trzeba wyświetlić te dane w oknie (np. na liście (List-View))... Ups... co teraz? Mamy dwie niezależne od siebie klasy. Różniące się od siebie (powiedzmy) wszystkim. Gdyby nie procedura okna (WndProc) to jeszcze by to dało radę jakoś oprogramować. Jednak musimy mieć dostęp do danych w tej procedurze odbierając zdarzenie wysyłane do okna.
O co mi chodzi?
Mając button w oknie "Usuń" będziemy chcieli, aby po jego wciśnięciu usunął się zaznaczony na liście rekord. Zdarzenia od listy odbieramy w WndProc. Musimy tam wywołać jakąś funkcję, która odczyta zaznaczony element na liście oraz usunie nam te dane ze (np.) struktury..
Zmienne globalne? Funkcje globalne? Nie wygląda to za pięknie.
Dlatego prosiłbym Was o wypowiedź i opinię w tej sprawie. Macie może jakieś swoje sprawdzone sposoby, metody na
połączenie GUI z "innymi klasami".
Problem nie tyczy się tylko WinAPI, więc każdy może zabrać głos :).