Вопрос, поднятый пользователем, касается проблемы с отслеживанием индекса выбранного элемента в компоненте TListBox при использовании Delphi 10.2.2 для разработки мобильных приложений. Проблема заключается в том, что при клике на элемент в мобильной версии (iOS и Android) метод OnClick отображает некорректный индекс элемента, в то время как в Windows и Macintosh все работает правильно.
Подробное описание проблемы
Разработчики столкнулись с несоответствием между индексом элемента, выбранного пользователем, и значением, возвращаемым событием OnClick компонента TListBox в мобильной версии приложения. В коде обработчика события OnClick используется свойство ItemIndex, которое должно отображать индекс выбранного элемента, но в мобильной версии вместо корректного индекса возвращается -1 для первого элемента и 0 для второго, что является ошибкой.
Пример кода
procedure TForm1.ListBox1Click(Sender: TObject);
begin
ShowMessage('ListBoxItem.itemindex = ' + ListBox1.ItemIndex.ToString);
end;
Предложенные решения
Использование TThread.ForceQueue() (доступно начиная с версии 10.2 Tokyo и выше):
procedure TForm1.ListBox1Click(Sender: TObject);
begin
TThread.ForceQueue(nil,
procedure
begin
ShowMessage('ListBoxItem.itemindex = ' + ListBox1.ItemIndex.ToString);
end
);
end;
Использование TThread.Queue():
procedure TForm1.ListBox1Click(Sender: TObject);
begin
TThread.CreateAnonymousThread(
procedure
begin
TThread.Queue(nil,
procedure
begin
ShowMessage('ListBoxItem.itemindex = ' + ListBox1.ItemIndex.ToString);
end
);
end
).Start;
end;
Пользователи обсуждали возможность использования события OnChange вместо OnClick, так как оно вызывается после обновления свойства ItemIndex. Однако, указывается, что OnChange может быть вызван и при программном добавлении элементов, что не всегда желательно. Также упоминается проблема с сохранением выделения элемента после очистки списка.
Подтвержденное решение
Проблема заключается в том, что событие OnClick обрабатывается раньше, чем свойство ItemIndex обновляется. Чтобы получить корректный индекс, необходимо отложить обработку события до тех пор, пока свойство ItemIndex не обновится. Предложенные методы с использованием потоков или таймера позволяют добиться корректной работы компонента TListBox в мобильных приложениях.
Заключение
Разработчикам, столкнувшимся с данной проблемой, рекомендуется использовать один из предложенных методов для корректного определения индекса выбранного элемента в мобильных приложениях, созданных с использованием Delphi 10.2.2. При этом стоит учитывать, что проблема может быть связана с багом в библиотеке, который следует сообщить разработчикам Embarcadero.
*Примечание: В данном ответе использованы примеры кода на Object Pascal, которые демонстрируют использование потоков и таймеров для решения проблемы с индексацией элементов в TListBox.
Пользователи столкнулись с ошибкой в компоненте `TListBox` в Delphi 10.2.2 при разработке мобильных приложений, когда событие клика возвращает некорректный индекс выбранного элемента на платформах iOS и Android, в отличие от корректной работы на Windows
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.