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

时间:2014-05-09 02:21:38

标签: delphi

假设您有一个带有TListView的表单,并启用了MultiSelect。通常您必须按shift或control才能选择多个项目。如果我想让列表视图只用鼠标点击选择/取消选择其他项目,我该怎么做?

如果您单击item1然后选择item3,则两者都会被选中,然后如果再次单击item1,它将仅保留item3。

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

3 个答案:

答案 0 :(得分:2)

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

您必须自己修改行为。但是使用OnMouseDownOnSelectItem事件并不合适,因为选择已经在被解雇时执行。下面的示例拦截鼠标左键消息。

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,派生新控件......当然,您还可以有条件地实施行为更改,或者想要测试和保存其他虚拟键/纽扣。在这种情况下,请参阅documentation

答案 1 :(得分:1)

将ListView的ExtendedSelect属性设置为False。

更新:
ListView没有ExtendedSelect属性。它仅适用于ListBox。

但是可以将它添加到ListView中。这是Sertac发布的代码的改进版本,它添加了ExtendedSelect。我也对它进行了改进,因此它比原版更加用户友好,因为它保留了多选工作的移位键。 (我希望我可以在这里发布改进的版本,它比我的评论更容易阅读。)

type
  TListView = class(Vcl.ComCtrls.TListView)
  private
    FExtendedSelect: Boolean;
    procedure SetExtendedSelect(const Value: Boolean);
  protected
    procedure WMLButtonDown(var Message: TWMLButtonDown);
      message WM_LBUTTONDOWN;
  public
    property ExtendedSelect: Boolean read FExtendedSelect write SetExtendedSelect;
  end;

procedure TListView.SetExtendedSelect(const Value: Boolean);
begin
  FExtendedSelect := Value;
end;

procedure TListView.WMLButtonDown(var Message: TWMLButtonDown);
begin
  if not FExtendedSelect then
  begin
    if Message.Keys and MK_CONTROL <> 0 then
      Message.Keys := Message.Keys and (not MK_CONTROL)
    else if Message.Keys and MK_SHIFT = 0 then
      Message.Keys := MK_CONTROL;
  end;
  inherited;
end;

答案 2 :(得分:1)

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