Dynamiczna obsługa zdarzeń wxWidgets

0

Witam,
obecnie uczę się biblioteki wxWidget z książki autorstwa Janusza Ganczarskiego oraz Mariusza Owczarka. Korzystam z Code::Block 16.01, kompilator gcc 4.9.2, wxWidget 2.8.12. Nie korzystam z IDE opisanego w tej książce, a preferuje projektowanie poprzez wprowadzanie kodu niż korzystanie z wxSmith'a. Problem napotkałem w czwartym rozdziale dokładnie przykład 4.2. gdzie mamy trzy kontrolki, może lepiej przedstawię to w formie kodu:

#include "wx/wxprec.h"
#ifndef WX_PRECOMP
#include "wx/wx.h"
#endif // WX_PRECOMP

class Aplik : public wxApp
{
public:
    virtual bool OnInit();
};

class Window : public wxFrame
{
public:
    wxPanel* WxPanel1;
    wxButton* Przycisk1;
    wxCheckBox* Wybor1;
    wxTextCtrl* WxMemo1;


    Window(const wxString& title, const wxPoint& pos, const wxSize& size,
           long style = wxDEFAULT_FRAME_STYLE);
private:
    DECLARE_EVENT_TABLE()
    void OnClose(wxCloseEvent& event);
    void CreateGUIControls();
    void CheckBox_checked(wxCommandEvent& event);
    void CheckBox_clear(wxCommandEvent& event);
    void CheckBox1Click(wxCommandEvent& event);

};


IMPLEMENT_APP(Aplik);
BEGIN_EVENT_TABLE(Window, wxFrame)
END_EVENT_TABLE()

bool Aplik::OnInit()
{
    Window* MainWindow = new Window(_T("Moj Program"), wxPoint(50, 50),
                                    wxSize(400, 400),
                                    wxCAPTION|wxSYSTEM_MENU|wxCLOSE_BOX);
    MainWindow->Show(TRUE);
    return TRUE;
}

Window::Window(const wxString& title, const wxPoint& pos, const wxSize& size,
           long style) : wxFrame(NULL, -1, title, pos, size, style)
{
    WxPanel1 = new wxPanel(this, 1, wxPoint(0,0), wxSize(300, 300));
    WxPanel1->SetFont(wxFont(8, wxSWISS, wxNORMAL, wxNORMAL, false, wxT("Tahoma")));

    Przycisk1 = new wxButton(WxPanel1, 2, wxT("Przycisk1"), wxPoint(10, 50),
                             wxSize(60,30), wxNO_BORDER);
    Wybor1 = new wxCheckBox(WxPanel1, 3, wxT("Wybor1"), wxPoint(10, 80),
                            wxSize(140,20), 0, wxDefaultValidator, wxT("Wybor1"));
    WxMemo1 = new wxTextCtrl(WxPanel1, 4, wxT(""), wxPoint(10, 100), wxSize(250, 100),
                             wxTE_MULTILINE, wxDefaultValidator, wxT("WxMemo1"));
    WxMemo1->SetMaxLength(0);
    WxMemo1->SetFocus();
    WxMemo1->SetInsertionPointEnd();
    WxMemo1->SetFont(wxFont(8, wxSWISS, wxNORMAL, wxNORMAL, false, wxT("Tahoma")));
    CreateGUIControls();
}

void Window::CheckBox_checked(wxCommandEvent& event)
{
    WxMemo1->AppendText(wxT("Obsluga zdarzen przycisku - pole zaznaczone\n"));
}
void Window::CheckBox_clear(wxCommandEvent& event)
{
    WxMemo1->AppendText(wxT("Obsluga zdarzen przycisku - pole czyste\n"));
}

void Window::CheckBox1Click(wxCommandEvent& event)
{
    if(Wybor1->GetValue() == true)
    {
        Disconnect(2);
        Connect(2, wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(Window::CheckBox_checked));
    }
    if(Wybor1->GetValue() == false)
    {
        Disconnect(2);
        Connect(2, wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(Window::CheckBox_clear));
    }
}

void Window::CreateGUIControls()
{
    Connect(2, wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(Window::CheckBox_clear));
}

Po zaznaczeniu pola checkbox powinien wyświetlić się inny tekst, natomiast ciągle wyświetla się ten sam, niezależnie od tego czy pole jest zaznaczone czy też nie. Próbowałem zrobić to inaczej czyli:

void Window::CreateGUIControls()
{
    //Connect(2, wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(Window::CheckBox_clear));
    if(Wybor1->GetValue() == true)
    {
        Disconnect(2);
        Connect(2, wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(Window::CheckBox_checked));
    }
    if(Wybor1->GetValue() == false)
    {
        Disconnect(2);
        Connect(2, wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(Window::CheckBox_clear));
    }
}

W funkcję kontrolek włożyłem treść innej funkcji ale nadal nic. Problem tkwi w czymś innym i przyznam, że po dwóch dniach prób stoję w miejscu dlatego prosiłbym o radę lub rozwiązanie.

0

Nie programuje w tym języku, ale chciałem poznać z ciekawości odpowiedzi na takie pytania. Dlaczego Ty i wielu Tobie podobnych ma problem, aby wkleić kod w konkretne tagi koloryzujące. Natomiast tagi wątku zbędnie nie "obfuskować"? :/

Wiem, że offtopic. Ale to temat na prace badawcze dla niektórych, dlaczego tutaj musi panować zasada w stylu "na czytelność ch... kładę, bo Moderacja i tak za mnie da radę" :/

Sorry, ale po może około tysięcznym postcie w Newbie, w którym trzeba poprawiać to samo w końcu wprost zapytam. I ani się nie żalę, ani się nie chwalę, robię swoje, ale zaczeła mnie ciekawić motywacja piszących content w beznadziejny sposób utrudniający sprawną odpowiedź do Was.

0

Może doprecyzuj. Tekst ma się zmieniać po kliknięciu w button, czy checkbox? Po co jest tam metoda CheckBox1Click? Nie widzę, żebyś ją przypisał do jakiegoś konkretnego zdarzenia.

0
0x666 napisał(a):

Może doprecyzuj. Tekst ma się zmieniać po kliknięciu w button, czy checkbox? Po co jest tam metoda CheckBox1Click? Nie widzę, żebyś ją przypisał do jakiegoś konkretnego zdarzenia.

Witam. Zgadza się trochę niejasno to zapisałem. Jeżeli pole checkbox nie jest zaznaczone, a klikniemy w przycisk powinien wyświetlać się napis Obsluga zdarzen przycisku - pole czyste\n. Natomiast jeżeli je zaznaczymy i klikniemy przycisk powinno pojawić się zdanie Obsluga zdarzen przycisku - pole zaznaczone\n.

0

Po kolejnej analizie przyznam, że odnalazłem błąd w swoim toku rozumowania.

IMPLEMENT_APP(Aplik);
BEGIN_EVENT_TABLE(Window, wxFrame)
EVT_CHECKBOX(3, Window::CheckBox1Click)
END_EVENT_TABLE()

Nie było tego w pierwotnym kodzie ponieważ próbowałem już, ale trochę inaczej i nie udało się, dlatego zrezygnowałem z tablicy zdarzeń. Powyższy kod jest właściwy natomiast ja we wcześniejszych próbach nie odnosiłem się do CHECKBOX'a a** BUTTONA** i dlatego wyświetlało mi jedynie zdanie Obsluga zdarzen przycisku - pole czyste. Dziękuję za zainteresowanie i pomoc.

1 użytkowników online, w tym zalogowanych: 0, gości: 1