Page 1 of 1

Skip - совсем запуталься

Posted: Wed Feb 18, 2009 1:27 pm
by borr_1
Прочитал об Skip в wxEvent. Понял что это что-то типа указателя на окончания действия события (Event). Но когда его надо ставить а когда нет понять не могу.

Обрабатываю событие EVT_CHAR у ComboBox типа даю вводить данные только его списка
Так вот если в указанном ниже обработчике поставить event.Srip() он работает не так - дает вводить левые буковки. Убираю Skip или ставлю Skip(false) что одно и то же, как я понял. Начинает работать так как надо.
Почему так? Какя разница? Когда вообще надо делать Skip а когда НЕ НАДО?

Code: Select all

void wxAutoComboBox::OnChar(wxKeyEvent &event)
{
        int nKeyCode = event.GetKeyCode();
        if ( !(nKeyCode == WXK_DELETE || nKeyCode == WXK_START))
        {
                wxString txtValue = GetValue();
                std::string tmp1= wx2std(txtValue);
                long start=-1, end=-1;
                GetSelection(&start, &end);
                wxString EnteredValue = txtValue.Left(start) + (wxChar)event.GetKeyCode();
                ToLower(EnteredValue);
                int Idx = -1;
                for( size_t i=0; i<this->GetCount(); i++ )
                {
                        wxString curStr = this->GetString(i);
                        ToLower(curStr);
                        if (curStr.Left(EnteredValue.Length()).CmpNoCase(EnteredValue) == 0)
                        {
                                Idx = i;
                                break;
                        }
                }
                if (Idx != -1)
                {
                        //wxWindowUpdateLocker noUpdates(this);
                        start++;
                        Freeze();
                        SetSelection(Idx);
                        SetSelection(start,GetValue().Length());
                        Thaw();
                        return;
                }
                else
                {
                   tmp1= wx2std(txtValue);
                   SetValue(txtValue);
                   SetSelection(start, end);
                   //event.Skip();
                   //event.Skip(false);//работает
                }

    }
    //event.Skip();
    //event.Skip(false);//работает
}

Re: Skip - совсем запуталься

Posted: Fri Feb 20, 2009 2:53 pm
by Kolya
Когда приходит событие, то сначала идет опрос обработчиков виджета, его родителя и далее по иерархии, и в конце обрабатывает операционная система.

Если на этом пути встречается обработчик, то он вызывается и дальнейшее следование по пути прекращается, т.е. ОС уже не получает это событие и в данном случае обработчик "кушает" буквы.

Что бы обработать событие и все таки при этом продолжить путь вызывается event.Skip().

Вызывать event.Skip(false) не имеет смысла, поскольку это и так делается перед вызовом обработчика.
event.Skip() означает вызов event.Skip(true)