Delphi 如何使用禁用了MultiSelect的TListView切换选定(聚焦)项目的选择状态?

Delphi 如何使用禁用了MultiSelect的TListView切换选定(聚焦)项目的选择状态?,delphi,vcl,tlistview,Delphi,Vcl,Tlistview,我有一个TListView,其中MultiSelect设置为False 我想切换当前选定项目的选择状态。我的意思是,取消选择当前选中(聚焦)的项目。但允许将选择(焦点)切换到另一项。启用MultiSelect并按住Ctrl键并单击选定项目时,可以看到相同的切换 我尝试了onchangg事件,但由于重新进入该方法,我完全迷路了 最后,我在OnEditing事件中做了一个非常糟糕的解决方案,例如: procedure TForm1.CMUnselectItems(var Message: TMess

我有一个
TListView
,其中
MultiSelect
设置为
False

我想切换当前选定项目的选择状态。我的意思是,取消选择当前选中(聚焦)的项目。但允许将选择(焦点)切换到另一项。启用
MultiSelect
并按住Ctrl键并单击选定项目时,可以看到相同的切换

我尝试了
onchangg
事件,但由于重新进入该方法,我完全迷路了

最后,我在
OnEditing
事件中做了一个非常糟糕的解决方案,例如:

procedure TForm1.CMUnselectItems(var Message: TMessage);
var
  Item: TListItem;
begin
  Item := ListView1.Selected;
  if Assigned(Item) then
  begin
    ListView1.Selected := nil;
    ListView1.ItemFocused := nil;
  end;
end;

procedure TForm1.ListView1Editing(Sender: TObject; Item: TListItem;
  var AllowEdit: Boolean);
begin
  AllowEdit := False;
  PostMessage(Self.Handle, CM_UnselectItems, 0, 0);
end;

是否有一种优雅的方法可以做到这一点?

可能在
WM\u NOTIFY
消息中等待
NM\u单击
通知,在
nmitemactive
结构中检查并修改
uNewState
成员(
LVIS\u FOCUSED
LVIS\u SELECTED
标志)。问题是,即使用户在“长时间”后单击同一项目(实际上没有发生更改),是否也会发送此通知。现在无法验证。@Victoria,
NM\u单击
未提供有效的
uNewState
/
uOldState
。每次用户单击某个项目时都会发送该消息。但是没有特别的信息。似乎唯一的办法是改变LVN_ITEMCHANGING,但我不知道该怎么处理。如果项目已被选中(我不确定),可能会有一个计时器触发此通知两次。您是否正确屏蔽了标志(在这些消息中始终检查状态)。如果是这样,那么您仍然可以执行
LVM\u GETITEMSTATE
LVM\u SETITEMSTATE
。我没有建议
LVN\u ITEMCHANGING
通知,因为它是为正在选择的项目发送的,而不是为正在取消选择的项目发送的。