Page 1 of 1

Почему после SetValidator() для wxPanel имеем validator.GetWindow()==0 ?

Posted: Sat Apr 01, 2017 6:43 am
by Chedman
Использую wxWidgets 2.8.12, компилятор MinGW 4.9.2, ОС Windows 7

Code: Select all

    wxPanel* panel=new wxPanel(this);

    wxMessageBox(wxString::Format(wxT("%p"),panel));

    int val;
    wxGenericValidator validator(&val);

    panel->SetValidator(validator);
/// Почему после SetValidator() для wxPanel имеем validator.GetWindow()==0
    wxMessageBox(wxString::Format(wxT("%p"), validator.GetWindow()));

    validator.SetWindow(panel);

    wxMessageBox(wxString::Format(wxT("%p"), validator.GetWindow()));


Re: Почему после SetValidator() для wxPanel имеем validator.GetWindow()==0 ?

Posted: Sat Apr 01, 2017 11:58 am
by T-Rex
Так задумано. Всегда есть возможность посмотреть на реализацию

Code: Select all

#if wxUSE_VALIDATORS
// ----------------------------------------------------------------------------
// validators
// ----------------------------------------------------------------------------
void wxWindowBase::SetValidator(const wxValidator& validator)
{
    if ( m_windowValidator )
        delete m_windowValidator;

    m_windowValidator = (wxValidator *)validator.Clone();

    if ( m_windowValidator )
        m_windowValidator->SetWindow(this);
}
#endif // wxUSE_VALIDATORS
Для работы с валидатором контрола вон метод есть.

Re: Почему после SetValidator() для wxPanel имеем validator.GetWindow()==0 ?

Posted: Sun Apr 02, 2017 4:10 am
by Chedman
Спасибо, забыл, что validator, ничего и не знает об окнах, так как для окон создается своя копия валидаторов, в данном случае копия validator.
На самом деле мной решалась задача создания контролов в конструкторе копирования валидатора, но теперь понятно, что это нельзя сделать в нем, так как m_validatorWindow, задается после полной отработки конструктора копирования.

Re: Почему после SetValidator() для wxPanel имеем validator.GetWindow()==0 ?

Posted: Mon Apr 03, 2017 2:06 pm
by ONEEYEMAN
It is documented - therefore it is a feature. ;-)