代码之家  ›  专栏  ›  技术社区  ›  Mike at Bookup

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

  •  2
  • Mike at Bookup  · 技术社区  · 6 年前

    Delphi 10.2.2移动

    从一个空白的移动项目开始,我在表单上放置了一个TListBox。我添加了两个TListBoxItems。

    procedure TForm1.ListBox1Click(Sender: TObject);
    begin
      ShowMessage('ListBoxItem.itemindex = ' + ListBox1.ItemIndex.ToString);
    end;
    

    当我在Windows和Macintosh中单击第一个项目时,OnClick()会正确报告已单击项目索引0。

    当我在mobile(iOS和Android)中单击第一个项目时,OnClick()将项目索引报告为-1(而不是应该的0)。然后突出显示第一项。

    如果单击mobile中的第二个项目,OnClick()会将项目索引报告为0(而不是应该的1)。然后突出显示第二项。

    在mobile上单击TListBox时,如何在OnClick()中获取正确的项目?

    1 回复  |  直到 6 年前
        1
  •  4
  •   Remy Lebeau    6 年前

    显然 OnClick 事件在 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;