Delphi Firemonkey TListView.selected在OnItemChange中始终为零
Firemonkey应用程序、Windows和MacOS目标 我需要知道当用户用光标键滚动或用鼠标单击listview项目时选择了什么项目 我可以通过onItemClick事件对鼠标单击作出反应,这很好,当我使用光标键移动选择时,也会触发OnItemChange事件,但listview的selected属性在该事件中始终保持为零 这是一只虫子还是我错过了什么Delphi Firemonkey TListView.selected在OnItemChange中始终为零,listview,delphi,firemonkey,Listview,Delphi,Firemonkey,Firemonkey应用程序、Windows和MacOS目标 我需要知道当用户用光标键滚动或用鼠标单击listview项目时选择了什么项目 我可以通过onItemClick事件对鼠标单击作出反应,这很好,当我使用光标键移动选择时,也会触发OnItemChange事件,但listview的selected属性在该事件中始终保持为零 这是一只虫子还是我错过了什么 当用户使用控件中的光标键时,如何知道选择了什么项目?您使用的事件错误。OnItemChange事件是一个 更改项目列表后发生的事件 。您是
当用户使用控件中的光标键时,如何知道选择了什么项目?您使用的事件错误。
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;
您将得到以下结果
- 首次使用
添加项目时(由于没有项目,因此未选择任何项目),您将获得AV,因为没有可选择的项目CheckBox.IsChecked=True
- 成功添加未选中复选框的项目后,选中该项目并选中该复选框,然后添加另一个项目。瞧,没有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;