使用资源管理器样式时,TListView不会隐藏选择

时间:2014-06-03 15:13:58

标签: delphi selection delphi-xe4 tlistview

在Delphi XE4中,如果将HideSelection设置为true并使用资源管理器样式TListView(当选择矩形具有像Windows资源管理器一样的渐变背景时)单击另一个控件将不会隐藏选择矩形。它将保持在那里,好像什么也没发生 - 当Listview没有焦点时,它甚至不会像平常一样变成灰色矩形。

这是Delphi错误还是MS Listview控件的“功能”?是否有任何已知的解决方法或修复方法?真的很烦人......

2 个答案:

答案 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在评论中提到的那样。