假设您有一个带有TListView的表单,并启用了MultiSelect。通常您必须按shift或control才能选择多个项目。如果我想让列表视图只用鼠标点击选择/取消选择其他项目,我该怎么做?
如果您单击item1然后选择item3,则两者都会被选中,然后如果再次单击item1,它将仅保留item3。
我没有在Object Inspector中看到任何看起来相关的内置属性。我是否需要修改ListviewOnMouseDown或ListviewOnSelectItem以更改选择?
答案 0 :(得分:2)
这种选择在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
,派生新控件......当然,您还可以有条件地实施行为更改,或者想要测试和保存其他虚拟键/纽扣。在这种情况下,请参阅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的选择以匹配您更新的列表根据需要。