在Delphi XE4中,如果将HideSelection设置为true并使用资源管理器样式TListView(当选择矩形具有像Windows资源管理器一样的渐变背景时)单击另一个控件将不会隐藏选择矩形。它将保持在那里,好像什么也没发生 - 当Listview没有焦点时,它甚至不会像平常一样变成灰色矩形。
这是Delphi错误还是MS Listview控件的“功能”?是否有任何已知的解决方法或修复方法?真的很烦人......
答案 0 :(得分:3)
这是底层控件的功能。除了将LVS_SHOWSELALWAYS
列表视图样式传递给基础控件之外,delphi代码对该属性不执行任何操作。
最初我对你的问题感到惊讶。我从来没有见过你描述过的行为。经过仔细检查,我意识到这是因为我的所有列表视图都是虚拟的。也就是说,他们将OwnerData
设置为True
并提供内容以响应OnData
个事件。这样做是我所知道的唯一解决方法。
答案 1 :(得分:1)
这个"功能"由David解释,这是一个解决方法。
通过利用OnExit
事件保存选择并将选择设置为nil,您将模仿想要的行为。关注ListView
时,恢复选择。
要使其对鼠标做出反应,请将ListView
重点放在OnMouseEnter
事件中。
Type
TForm1 = class(TForm)
...
private
FSelected: TListItem;
...
end;
procedure TForm1.ListView1Enter(Sender: TObject);
begin
if (ListView1.SelCount = 0) and Assigned(FSelected) then
ListView1.Selected := FSelected;
end;
procedure TForm1.ListView1Exit(Sender: TObject);
begin
FSelected := ListView1.Selected;
if Assigned(FSelected) then ListView1.Selected := Nil;
end;
procedure TForm1.ListView1MouseEnter(Sender: TObject);
begin
ListView1.SetFocus;
end;
提到这个解决方案之后,为什么不选择简单的解决方案,设置HideSelection = false
,并且在未聚焦时所选项目将变为灰色,就像Sertac在评论中提到的那样。