wxListCtrl с несколькими выборками дает неверный результат

#c #wxwidgets

#c #wxwidgets

Вопрос:

Я использую Code::Blocks 20.3, wxWidgets 3.1.4 и MinGW 17.1 на компьютере с Windows 10 Pro.

Я использую ListCtrl (режим wxLC_REPORT) в качестве селектора критериев для сервера SQL. Задаваясь вопросом, почему мой код иногда выдает неправильные результаты, я создал небольшое тестовое приложение. Просто чтобы посмотреть, что происходит.

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

Код:

Я создал ListControl с 4 элементами (Алишия, Беатрис, Кэтрин, Даниэлла) с 3 событиями (OnSelected, OnDeSelected, OnFocused) и функцией вывода.

 void ListCtrlFrame::OutputToConsole()
{
    long itemIndex = -1;
    while((itemIndex = m_listCtrl1->GetNextItem(itemIndex, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED)) != wxNOT_FOUND)
    {
        std::cout << "OUTPUT: "<< m_listCtrl1->GetItemText(itemIndex) << std::endl;
    }
}

void ListCtrlFrame::m_listCtrl1OnListItemSelected( wxListEventamp; event )
{
    ListStateSelected = m_listCtrl1->GetItemState(event.m_itemIndex, wxLIST_STATE_SELECTED); // 4
    std::cout << ListStateSelected << " Selected: " << m_listCtrl1->GetItemText(event.m_itemIndex) << std::endl;
}

void ListCtrlFrame::m_listCtrl1OnListItemDeselected( wxListEventamp; event )
{
    ListStateDeSelected = m_listCtrl1->GetItemState(event.m_itemIndex, wxLIST_STATE_DONTCARE ); // 0
    std::cout << ListStateDeSelected << " DeSelected: " << m_listCtrl1->GetItemText(event.m_itemIndex) << std::endl;
}

void ListCtrlFrame::m_listCtrl1OnListItemFocused( wxListEventamp; event )
{
    ListStateFocused = m_listCtrl1->GetItemState(event.m_itemIndex, wxLIST_STATE_FOCUSED ); // 2
    std::cout << ListStateFocused << " Focused: " << m_listCtrl1->GetItemText(event.m_itemIndex) << std::endl;
    OutputToConsole();
}
  

Тест:

 Click on Alyshia -> Output is OK (1 item)
Ctrl   Click on Beatrice -> Output is OK (2 items)
Ctrl   Click on Catherine -> Output is OK (3 items)
then:
Click on (in selected state) Beatrice -> Output is Wrong (3 instead of 1 item)
What happens is that the Output is generated before the deselection of the others (see below)
  

Вывод:

 2 Focused: Alyshia
OUTPUT: Alyshia
4 Selected: Alyshia

4 Selected: Beatrice
2 Focused: Beatrice
OUTPUT: Alyshia
OUTPUT: Beatrice

4 Selected: Catherine
2 Focused: Catherine
OUTPUT: Alyshia
OUTPUT: Beatrice
OUTPUT: Catherine

2 Focused: Beatrice
OUTPUT: Alyshia
OUTPUT: Beatrice
OUTPUT: Catherine
0 DeSelected: Alyshia
0 DeSelected: Catherine
  

Комментарии:

1. у вас есть доступ к другой версии Windows? Можете ли вы протестировать там? Можете ли вы собрать и запустить listctrl образец, предоставленный с wxWidgets? (в будущем — нет необходимости создавать образец, просто запустите тот, который поставляется с библиотекой) Можете ли вы воспроизвести его там?

2. Я создал образец ListCtrl. Он ведет себя точно так же.

3. (после этого сначала фокусируется, 2 раза выбирается.) Извините, поблизости нет другой версии Windows :-(.

4. КСТАТИ: Моя версия Windows 10 — 1909 18363.1016

5. возможно, вы захотите отправить электронное письмо wx-пользователям, чтобы подтвердить, что это ошибка, прежде чем официально регистрировать ее в trac.wxwidgets.org . Когда вы это сделаете — объясните, как увидеть проблему в примере. Вам нужно будет зарегистрироваться, чтобы отправить это электронное письмо.