Delphi 在TListview中使用鼠标进行多选?

Delphi 在TListview中使用鼠标进行多选?,delphi,Delphi,假设您有一个带有TListView的表单,并且启用了MultiSelect。通常,您必须按shift或control来选择多个项目。如果我想让listview只需单击鼠标即可选择/取消选择其他项目,我该怎么做 例如,如果您单击item1,然后单击item3,这两个选项都将被选中,如果您再次单击item1,则只会选择item3 我在Object Inspector中没有看到任何看起来相关的内置属性。是否需要修改ListviewOnMouseDown或ListviewOnSelectItem以更改选

假设您有一个带有TListView的表单,并且启用了MultiSelect。通常,您必须按shift或control来选择多个项目。如果我想让listview只需单击鼠标即可选择/取消选择其他项目,我该怎么做

例如,如果您单击item1,然后单击item3,这两个选项都将被选中,如果您再次单击item1,则只会选择item3

我在Object Inspector中没有看到任何看起来相关的内置属性。是否需要修改ListviewOnMouseDown或ListviewOnSelectItem以更改选择?

将ListView的ExtendedSelect属性设置为False

更新:
ListView没有ExtendedSelect属性。它仅适用于列表框

但是可以将其添加到ListView中。下面是Sertac发布的代码的改进版本,它添加了ExtendedSelect。我还对其进行了改进,使其比原来的更易于使用,因为它保持了多选择的shift键。(我希望我可以在这里发布改进后的版本,它比我的评论更容易阅读)

类型
TListView=class(Vcl.ComCtrls.TListView)
私有的
FExtendedSelect:布尔值;
过程SetExtendedSelect(常量值:布尔值);
受保护的
程序WMLButtonDown(var消息:TWMLButtonDown);
信息WM_LBUTTONDOWN;
公众的
属性ExtendedSelect:Boolean read FExtendedSelect write SetExtendedSelect;
结束;
过程TListView.SetExtendedSelect(常量值:布尔值);
开始
FExtendedSelect:=值;
结束;
过程TListView.WMLButtonDown(变量消息:TWMLButtonDown);
开始
如果不是FExtendedSelect,则
开始
如果Message.Keys和MK_控制0,则
Message.Keys:=Message.Keys和(非MK_控件)
否则,如果Message.Keys和MK_SHIFT=0,则
Message.Keys:=MK_控件;
结束;
继承;
结束;
将ListView的ExtendedSelect属性设置为False

更新:
ListView没有ExtendedSelect属性。它仅适用于列表框

但是可以将其添加到ListView中。下面是Sertac发布的代码的改进版本,它添加了ExtendedSelect。我还对其进行了改进,使其比原来的更易于使用,因为它保持了多选择的shift键。(我希望我可以在这里发布改进后的版本,它比我的评论更容易阅读)

类型
TListView=class(Vcl.ComCtrls.TListView)
私有的
FExtendedSelect:布尔值;
过程SetExtendedSelect(常量值:布尔值);
受保护的
程序WMLButtonDown(var消息:TWMLButtonDown);
信息WM_LBUTTONDOWN;
公众的
属性ExtendedSelect:Boolean read FExtendedSelect write SetExtendedSelect;
结束;
过程TListView.SetExtendedSelect(常量值:布尔值);
开始
FExtendedSelect:=值;
结束;
过程TListView.WMLButtonDown(变量消息:TWMLButtonDown);
开始
如果不是FExtendedSelect,则
开始
如果Message.Keys和MK_控制0,则
Message.Keys:=Message.Keys和(非MK_控件)
否则,如果Message.Keys和MK_SHIFT=0,则
Message.Keys:=MK_控件;
结束;
继承;
结束;

这种选择在listview控件中没有实现,可能是因为它们支持可以独立选中的复选框,我不知道

你必须自己修改行为。但是使用
OnMouseDown
OnSelectItem
事件并不真正合适,因为在触发事件时已经执行了选择。下面的示例截取鼠标左键按下消息

type
  TListView = class(vcl.comctrls.TListView)
  protected
    procedure WMLButtonDown(var Message: TWMLButtonDown);
      message WM_LBUTTONDOWN;
  end;

procedure TListView.WMLButtonDown(var Message: TWMLButtonDown);
begin
  Message.Keys := MK_CONTROL;
  inherited;
end;

您可以通过任何其他方式截获消息,分配给
WindowProc
,导出新控件。。。当然,您也可以有条件地实现行为更改,或者希望测试并保留其他虚拟键/按钮。请参见这种情况。

这种选择在listview控件中没有实现,可能是因为它们支持可以独立选中的复选框,我不知道

你必须自己修改行为。但是使用
OnMouseDown
OnSelectItem
事件并不真正合适,因为在触发事件时已经执行了选择。下面的示例截取鼠标左键按下消息

type
  TListView = class(vcl.comctrls.TListView)
  protected
    procedure WMLButtonDown(var Message: TWMLButtonDown);
      message WM_LBUTTONDOWN;
  end;

procedure TListView.WMLButtonDown(var Message: TWMLButtonDown);
begin
  Message.Keys := MK_CONTROL;
  inherited;
end;

您可以通过任何其他方式截获消息,分配给
WindowProc
,导出新控件。。。当然,您也可以有条件地实现行为更改,或者希望测试并保留其他虚拟键/按钮。请参见这种情况。

ListView本机不支持您的请求。您必须维护自己的“选定”项目列表,使用OnClick或OnMouseDown事件检测用户正在单击的项目,以便您可以相应地切换列表内容,然后根据需要重置ListView的选择以匹配更新的列表。

ListView本机不支持您的请求。您必须维护自己的“选定”项目列表,使用OnClick或OnMouseDown事件检测用户正在单击的项目,以便您可以相应地切换列表的内容,然后根据需要重置ListView的选择以匹配更新的列表。

ExtendedSelect似乎不是TListView的属性:我想您可能混淆了TListBox和TListView。其他人提出了同样的建议,然后删除了他们的回答,你是对的。我把它和箱子弄混了。我将保留我的答案的更新版本,以便其他人不会受到诱惑。ExtendedSelect似乎不是TListView的属性:我认为您可能混淆了TListBox和TListView。其他人提出了同样的建议,然后删除了他们的回答,你是对的。我把它和箱子弄混了。我会保留我答案的最新版本,这样就不会有其他人受到诱惑