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;
    
Другие вопросы по тегам