Delphi Firemonkey TListView.selected在OnItemChange中始终为零

Delphi Firemonkey TListView.selected在OnItemChange中始终为零,listview,delphi,firemonkey,Listview,Delphi,Firemonkey,Firemonkey应用程序、Windows和MacOS目标 我需要知道当用户用光标键滚动或用鼠标单击listview项目时选择了什么项目 我可以通过onItemClick事件对鼠标单击作出反应,这很好,当我使用光标键移动选择时,也会触发OnItemChange事件,但listview的selected属性在该事件中始终保持为零 这是一只虫子还是我错过了什么 当用户使用控件中的光标键时,如何知道选择了什么项目?您使用的事件错误。OnItemChange事件是一个 更改项目列表后发生的事件 。您是

Firemonkey应用程序、Windows和MacOS目标

我需要知道当用户用光标键滚动或用鼠标单击listview项目时选择了什么项目

我可以通过onItemClick事件对鼠标单击作出反应,这很好,当我使用光标键移动选择时,也会触发OnItemChange事件,但listview的selected属性在该事件中始终保持为零

这是一只虫子还是我错过了什么


当用户使用控件中的光标键时,如何知道选择了什么项目?

您使用的事件错误。
OnItemChange
事件是一个

更改项目列表后发生的事件

。您是否更改了项目列表?不,你没有

您要查找的是
OnChange
事件:

当用户选择其他项导致ItemIndex属性更改时发生。 编写OnChange事件处理程序以响应ItemIndex属性的更改。OnChange允许在成功更改列表后进行响应


请看。

我真的不明白他们的反对票是真的吗???对我来说。然而,我决定更新我的答案,并试图让它更清楚

首先:您需要意识到OnChange事件并不是唯一可以在上执行此操作的事件。真正的问题是为什么
GetSelected
getter方法在
onitmchange
事件上失败并返回
nil

财产声明如下:

property Selected: TListItem read GetSelected write SetSelected;
对其getter方法的检查如下:

if (FItemIndex >= 0) and (FItemIndex < Adapter.Count) then 
    return code
else
    result := nil;
在OnItemChange事件中添加以下内容

procedure TForm5.ListView1ItemsChange(Sender: TObject);
begin
caption := 'fired'+datetimetostr(now);
if checkbox1.IsChecked then
caption := 'selected item index: '+ inttostr(listview1.Selected.index);
end;
您将得到以下结果

  • 首次使用
    CheckBox.IsChecked=True
    添加项目时(由于没有项目,因此未选择任何项目),您将获得AV,因为没有可选择的项目
  • 成功添加未选中复选框的项目后,选中该项目并选中该复选框,然后添加另一个项目。瞧,没有AV
从我的观点来看,我认为你是第一个案例(很奇怪,你没有调查原因)

把文档中关于
OnChange
事件的内容放在一边。只要在调用
GetSelected
方法之前确保选择了项目,就不会有AV。

最后:我发现人们没有多花一点时间来回答为什么这个问题,这实在令人失望


如果您不知道它失败的原因,那么如何确保它不会再次失败?

我一定是瞎了!谢谢你的快速回答!顺便说一句,我的名字是Günter,不带“h”:@Softtouch您需要意识到,
OnChange
事件并不是您可以在其上执行此操作的唯一事件。真正的问题是为什么
GetSelected
getter方法在
OnItemChange
Event上失败。为什么否决票问题询问如何在使用光标键时查找所选项目?为什么这个属性失败了?如果你看看上面,OP已经接受了另一个答案。没有说这就是你被否决的原因,但它确实指出了另一个答案有助于解决这个问题,而这个答案没有。很可能是因为您的答案没有说明
OnItemChange
事件的用法,这正是OP使用的,也是错误的地方。@Jerrydoge这个答案的要点是:
selected
属性很好,是正确的方法,而
OnChange
事件并不是唯一正确的事件。如果(FItemIndex>=0)和(FItemIndex的任何事件都是可以的,否则就不可以了。@JerryDodge感谢您的评论。这对我来说证明了一些事情,我非常感谢。
procedure TForm5.ListView1ItemsChange(Sender: TObject);
begin
caption := 'fired'+datetimetostr(now);
if checkbox1.IsChecked then
caption := 'selected item index: '+ inttostr(listview1.Selected.index);
end;