Delphi Firemonkey TListView.selected始终为零onItemsChange

问题描述:

Firemonkey App,Windows和MacOS目标。Delphi Firemonkey TListView.selected始终为零onItemsChange

我需要知道当用户使用光标键滚动或用鼠标点击列表视图项目时选择了什么项目。

我可以通过onItemClick事件对鼠标点击做出反应,这很好,当我用光标键移动选区时触发onItemsChange事件,但是listview的选定属性始终保持在该事件的零位。

这是一个错误还是有我想念的东西?

如何知道用户在控件中使用光标键时选择了哪个项目?

您正在使用错误的事件。 OnItemsChange事件是

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

as the documentation states。你是否更改项目列表?不,你没有。

你要找的是OnChange事件:

发生时,ItemIndex属性变化选择不同的项目的用户的结果。 编写OnChange事件处理程序以响应ItemIndex属性的更改。一旦列表成功更改,OnChange允许响应。

请参阅documentation for more details

+0

我一定是盲目的!感谢您的快速回答!顺便说一句,我的名字是Günter没有'h':) – Softtouch

+0

@Softtouch你需要认识到'OnChange'事件不是唯一的事情,你可以做到这一点。真正的问题是'OnItemsChange'事件中'GetSelected' getter方法失败的原因 –

我真的不明白倒票他们真的是一个???对我来说。不过,我决定更新我的答案,并试图使其更清晰

第一:你需要认识到,OnChange事件是不是你能做到这一点上的唯一事件。真正的问题是GetSelected getter方法在OnItemsChange事件中失败并返回nil

selected属性的声明是这样的

property Selected: TListItem read GetSelected write SetSelected; 

其getter方法的检查是这样的:

if (FItemIndex >= 0) and (FItemIndex < Adapter.Count) then 
    return code 
else 
    result := nil; 

这么清楚的东西是在documentation

发生

列表视图中当前选定的列表项。 此属性 是零如果没有选择项目

通过选中它们表示上述检查。这首先提出了如何解决这个事件的下列问题。在documentation它说

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

这意味着当你改变项目的存在(删除,添加,而不是改变高度或宽度,我已经检查过)。此外,选择属性不返回零,如果事件不会改变选择

以下测试可用于

在表单中添加以下

  • 的TListView
  • TCheckBox
  • a TButton

在按钮OnClick事件中添加此

procedure TForm5.Button1Click(Sender: TObject); 
var 
    I: Integer; 
begin 
for I := 1 to 10 do 
listview1.items.add; 
end; 

在OnItemsChange事件添加此

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,因为没有什么可以选择
  • 成功添加一个项目后未勾选复选框选择我t并选中该框然后添加另一个项目。 Voila no AV

从我的角度来看,我认为你是第一个案例(这很奇怪,你没有调查为什么)。

撇开文件中有关OnChange事件的说法。只要您确保在调用GetSelected方法之前选择了项目,就不会有AV。

最后:我真的感到很失望的是,人们不会去额外的努力来回答为什么问题。

如果你不知道它为什么失败,那么如何确保它不会再失败?

+0

为什么在使用光标键时如何找到所选项目?以及为什么财产失败? –

+0

如果你看一看上面,OP已经接受了其他答案。不要说这就是为什么你会陷入低估的原因,但它确实指出了另一个答案有助于解决这个问题,而这个答案并没有。最有可能的原因是你的回答没有解决OnItemsChange事件的使用问题,这正是OP所使用的并且是错误的。 –

+0

@JerryDodge从这个答案中得到的一点是:'selected'属性很好,而且是正确的方法,'OnChange'事件并不是唯一正确的事件。任何通过这个'if(FItemIndex> = 0)和(FItemIndex