Firemonkey TListBox.OnClick - какой элемент нажимается?
Delphi 10.2.2 mobile
Начиная с пустого мобильного проекта, я опускаю TListBox на форму. Я добавляю два элемента TListBoxItems.
procedure TForm1.ListBox1Click(Sender: TObject);
begin
ShowMessage('ListBoxItem.itemindex = ' + ListBox1.ItemIndex.ToString);
end;
Когда я нажимаю на первый элемент в Windows и Macintosh, OnClick() правильно сообщает, что индекс элемента 0 был нажат.
Когда я нажимаю на первый элемент в мобильном устройстве (iOS и Android), OnClick() сообщает об индексе элемента как -1 (не 0, как должно). Затем он продолжает выделять первый элемент.
Если я затем щелкну второй элемент в мобильном устройстве, OnClick() сообщит, что индекс элемента равен 0 (а не 1, как следует). Затем он продолжает выделять второй элемент.
Как я могу получить правильный элемент в OnClick() при нажатии на TListBox на мобильном телефоне?
1 ответ
Очевидно, что OnClick
событие запускается до ItemIndex
обновляется. Таким образом, вам придется отложить обработку до ItemIndex
имеет шанс быть обновленным первым. Вы можете:
использование
TThread.ForceQueue()
(Только 10.2 Токио +):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;
используйте короткий таймер:
procedure TForm1.ListBox1Click(Sender: TObject); begin Timer1.Enabled := True; end; procedure TForm1.Timer1Timer(Sender: TObject); begin Timer1.Enabled := False; ShowMessage('ListBoxItem.itemindex = ' + ListBox1.ItemIndex.ToString); end;