WxWidgets тот же обработчик для множества кнопок/элементов управления

У меня есть система управления с большим количеством вкладок. Каждый из них с множеством кнопок и текстовых элементов управления. Я хотел бы иметь один обработчик событий, который выполняет один и тот же код, но для разных текстовых элементов управления.

Например, 10 текстовых элементов управления имеют значения IP. Вместо 10 событий и 10 обработчиков я хочу использовать одну и ту же функцию обработчика событий, но они должны указывать на объект генерации каждого события:

void anyname::OnCheckIP(wxCommandEvent& event)
{
   // code to check IP value for the caller text control
}

Как мне это сделать? ¿Возможно ли восстановить указатель вызывающего объекта внутри обработчика событий?


person DarkZeros    schedule 01.03.2012    source источник


Ответы (1)


Вы можете создать подкласс используемого элемента управления, перехватить сгенерированное событие и вызвать метод для обработки события в новом классе. Затем вы используете этот новый элемент управления для всех виджетов, которым нужен один и тот же обработчик.

Предположим, у вас много wxTextCtrls.

class cMyCommonTextCtrl : public wxTextCtrl
{
   int myID;
public:
    cMyCommonTextCtrl( int ID, ... )
    : wxTextCtrl( ... ),
    , myID( ID )
    ...
  {
    bind(  wxEVT_TEXT_ENTER, &cMyCommonTextCtrl::OnCheckIP, this, myID );
    ...
  }
    void OnCheckIP( wxCommandEvent& )
    {
        // handle text, using myID attribute to distinguish which one
    }
};
person ravenspoint    schedule 01.03.2012
comment
Спасибо, а как отличить каждого по ID? Нужно ли делать переключатель/кейс? Если бы существовал getobject(ID), было бы здорово! - person DarkZeros; 01.03.2012
comment
Обычным способом сделать это будет оператор switch. Вы можете добавить метод getobject(), если хотите, но если он используется только внутри OnCheckIP, в этом нет необходимости. - person ravenspoint; 01.03.2012