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

[Dyskusja] Projektowanie aplikacji GUI

Ostatnio zmodyfikowano 2010-07-03 23:16
Autor Wiadomość
malan
Temat założony przez niniejszego użytkownika
[Dyskusja] Projektowanie aplikacji GUI
» 2010-07-03 23:04:10
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"):
C/C++
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:
C/C++
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 :).
P-18575
lenrokskate
» 2010-07-03 23:07:53
może po prostu trzeba przeciążyć odpowiedni operator, albo napisać metodę która odpowiednio przekaże te dane
P-18577
malan
Temat założony przez niniejszego użytkownika
» 2010-07-03 23:11:57
Jakby to powiedział jeden z forumowiczów:
Jakim cudem klasa odpowiedzialna za okna, kontrolki, zdarzenia ma dane z pliku? Widzisz tu gdzieś powiązanie?
P-18578
DejaVu
» 2010-07-03 23:16:53
Można to zrobić np. tak:
C/C++
class CTwojeOkno
    : public CWindow
{
protected:
    CTwojaBaza & m_baza;
public:
    CTwojeOkno( CTwojaBaza & baza )
        : CWindow()
        , m_baza( baza )
    {
    }
    virtual bool InitWindow()
    {
        if( !__super::InitWindow() )
             return false;
       
        m_baza.wczytajDane( "plik.db" );
        return true;
    }
};
Oczywiście to tylko jedna z możliwości.

PS. Metody powinny być wirtualne w klasach bazowych jeżeli chcesz, aby:
C/C++
CWindow * pWindow = new CTwojeOkno;
pWindow->InitWindow(); //... ten wiersz zadziałał prawidłowo, tj. wywołał metodę klasy CTwojeOkno, a nie CWindow.
P-18579
« 1 »
  Strona 1 z 1