Обработка событий в заданном порядке - PullRequest
0 голосов
/ 28 октября 2018

Справочная информация : в Excel, когда вы выполняете вырезку для выделенного блока, значения не перемещаются, пока вы не вставите.После обрезки, если происходит какое-либо событие (не все, кроме большинства), кроме вставки, блок перемещается , а не .

Я пытаюсь реализовать ту же идею.У меня есть 2 функции:

void MyFrame::OnCut(wxCommandEvent& evt);
void MyFrame::OnPaste(wxCommandEvent& evt);

Также определены следующие события:

wxDEFINE_EVENT(CUT_EVENT, wxCommandEvent);
wxDEFINE_EVENT(PASTE_EVENT, wxCommandEvent);

Код в OnCut структурирован в 2 блока.1-й блок должен выполняться при вызове cut, 2-й блок должен выполняться при вызове Paste.

void MyFrame::OnCut(wxCommandEvent& evt)
{
    if (evt.GetEventType() != PASTE_EVENT){

         m_CutEventCalled = true;
         //Some code here

    }

     if (evt.GetEventType() == PASTE_EVENT)

        //Some code here
        m_CutEventCalled = false;

    }

}


void MyFrame::OnPaste(wxCommandEvent& evt)
{
    //Some other code 
    if(m_CutEventCalled){
        wxCommandEvent PasteEvent;
        PasteEvent.SetEventType(PASTE_EVENT);
        PasteEvent.SetEventObject(this);
        Bind(PASTE_EVENT, &MyFrame::OnCut, this);
        wxPostEvent(this, PasteEvent);
    }
}

События вырезания и вставки могут запускаться с клавиатуры, например Ctrl + X, ContextMenu или из RibbonButtons..

Пока что это хорошо работает, если событие Cut равно сразу , за которым следует событие вставки.Тем не менее, я хочу, чтобы m_CutEventCalled=false происходило какое-то другое событие между вырезкой и вставкой, скажем, пользователь передумал и без вставки после вырезки вместо этого запустил событие копирования.

bool MyFrame::ProcessEvent(wxEvent & evt)
{
    static wxEvent* s_lastEvent = NULL;

    if (&evt == s_lastEvent)
        return false;

    int evtID = evt.GetId();

    //if this part of the code exists the whole thing doesnt work
    //otherwise it only works cut immediately followed by paste
    if (evtID != ID_PASTE && evtID != ID_CUT)
        m_CutEventCalled = false;


    return wxMDIChildFrame::ProcessEvent(evt);
}

Моей идеей было любое событие сИдентификаторы, отличные от ID_PASTE и ID_CUT, должны сбрасывать m_CutEventCalled=false.Однако пока что безуспешно.Я предполагаю, что это как-то связано с ProcessEvent.

Другими словами, как я могу узнать, что событие any, отличное от события вставки, произошло после события вырезания.Одним из решений было бы то, что я могу поместить m_CutEventCalled=false во все другие обработчики событий, но это не кажется элегантным решением.

Любые идеи приветствуются.

1 Ответ

0 голосов
/ 28 октября 2018

Это очень странный подход к решению проблемы. Вам абсолютно не нужно вмешиваться в обработку событий, потому что совершенно не имеет значения, следует ли событие «вставка» сразу же после «вырезания» или нет (на самом деле, спойлер: никогда не будет, всегда будут некоторые промежуточные события) между любыми такими событиями, сгенерированными пользователем).

Вам просто нужно запомнить «вырезанные» данные в вашем OnCut(), а затем скопировать и удалить их, если они успешно скопированы, в ваш OnPaste().

...