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允许响应。
我真的不明白倒票他们真的是一个???对我来说。不过,我决定更新我的答案,并试图使其更清晰
第一:你需要认识到,的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。
最后:我真的感到很失望的是,人们不会去额外的努力来回答为什么问题。
如果你不知道它为什么失败,那么如何确保它不会再失败?。
为什么在使用光标键时如何找到所选项目?以及为什么财产失败? –
如果你看一看上面,OP已经接受了其他答案。不要说这就是为什么你会陷入低估的原因,但它确实指出了另一个答案有助于解决这个问题,而这个答案并没有。最有可能的原因是你的回答没有解决OnItemsChange事件的使用问题,这正是OP所使用的并且是错误的。 –
@JerryDodge从这个答案中得到的一点是:'selected'属性很好,而且是正确的方法,'OnChange'事件并不是唯一正确的事件。任何通过这个'if(FItemIndex> = 0)和(FItemIndex
我一定是盲目的!感谢您的快速回答!顺便说一句,我的名字是Günter没有'h':) – Softtouch
@Softtouch你需要认识到'OnChange'事件不是唯一的事情,你可以做到这一点。真正的问题是'OnItemsChange'事件中'GetSelected' getter方法失败的原因 –