Firemonkey TListBox.OnClick - 单击哪个项目?

时间:2018-02-15 18:05:29

标签: delphi firemonkey tlistbox

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)。然后继续突出显示第二项。

如何在移动设备上点击TListBox时,如何在OnClick()中获取正确的项目?

1 个答案:

答案 0 :(得分:4)

显然,在更新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;