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

Это русская секция форума wxWidjets. В этой секции вы можете обсуждать любые вопросы, связанные с wxWidgets на вашем родном языке.
Post Reply
borr_1
Super wx Problem Solver
Super wx Problem Solver
Posts: 362
Joined: Wed Mar 07, 2007 8:10 am
Location: Russia, Shakhty

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

Post by borr_1 » Wed Feb 18, 2009 1:27 pm

Прочитал об 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);//работает
}

Kolya
Experienced Solver
Experienced Solver
Posts: 85
Joined: Mon Dec 11, 2006 11:35 am
Location: /dev/null

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

Post by Kolya » Fri Feb 20, 2009 2:53 pm

Когда приходит событие, то сначала идет опрос обработчиков виджета, его родителя и далее по иерархии, и в конце обрабатывает операционная система.

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

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

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

Post Reply