#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 . Когда вы это сделаете — объясните, как увидеть проблему в примере. Вам нужно будет зарегистрироваться, чтобы отправить это электронное письмо.