Firemonkey TListBox.OnClick - 单击了哪个项目?
Firemonkey TListBox.OnClick - which item is clicked?
Delphi 10.2.2 手机
从一个空白的移动项目开始,我在窗体上放置了一个 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() 中获取正确的项目?
很明显,OnClick
事件在 ItemIndex
更新之前被触发。因此,您将不得不延迟处理,直到 ItemIndex
有机会首先更新。您可以:
使用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;
使用短计时器:
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;
Delphi 10.2.2 手机
从一个空白的移动项目开始,我在窗体上放置了一个 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() 中获取正确的项目?
很明显,OnClick
事件在 ItemIndex
更新之前被触发。因此,您将不得不延迟处理,直到 ItemIndex
有机会首先更新。您可以:
使用
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;
使用短计时器:
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;