【问题标题】:TListView doesn't hide selection when using explorer style使用资源管理器样式时,TListView 不隐藏选择
【发布时间】:2023-04-06 20:49:01
【问题描述】:

在Delphi XE4中,如果将HiSERection设置为True并使用Explorer Style TlistView(选择矩形具有渐变背景,如Windows资源管理器)单击另一个控件,则不会隐藏选择矩形。它会一直呆在那里,就好像什么都没发生一样 - 当 Listview 没有焦点时,它甚至不会像往常一样变成灰色矩形。

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

【问题讨论】:

  • 您可以在OnExit事件中设置ListView.Selected := nil;
  • @LURD 你想在 OnEnter 中恢复选择
  • 取消设置隐藏选择,它们至少会变成灰色。
  • @DavidHeffernan,是的,请看我的回答。我必须把它设为AutoFocus,这样鼠标移动看起来会很自然。如果没有AutoFocus,在没有焦点的ListView 内部单击会使选择变得尴尬。
  • @LURD 我告诉过你! ;-)

标签: delphi selection delphi-xe4 tlistview


【解决方案1】:

这是底层控件的一个功能。除了将LVS_SHOWSELALWAYS 列表视图样式传递给底层控件之外,delphi 代码对该属性没有任何作用。

最初我对你的问题感到惊讶。我从未见过你描述的行为。经过仔细检查,我意识到这是因为我所有的列表视图都是虚拟的。也就是说,他们将OwnerData 设置为True 并提供内容以响应OnData 事件。这样做是我所知道的唯一解决方法。

【讨论】:

  • 我会试试你写的,但我真的不想因为这个而切换到虚拟。我知道 Delphi 对列表视图没有做任何事情,但你确定它没有很好地实现吗?也许有一个标志或某些我们不知道 Delphi 无法处理的新“功能”......最好将其与一些 MS .NET listview 控件进行比较,看看它的行为方式!
  • 这是您在代码中所做的事情。我总是使用虚拟列表视图来获得它们带来的所有其他好处。在我看来,非虚拟控件使用起来很糟糕。但是你在你的程序中做什么当然取决于你。您问这是 Delphi 的问题,还是控件的功能。我给了你我的答案。不信可以去查。
  • 感谢您的回答,我没有使用虚拟列表视图,因为有问题的列表视图非常简单,它们通常只显示一些项目 - 这就是焦点矩形更麻烦的原因。跨度>
  • 虚拟应用的大部分好处适用于具有任意数量项目的列表视图。性能只是一个好处,在我看来并不是最重要的。主要好处是 UI 和业务逻辑解耦得很好。
【解决方案2】:

David 解释了这个“功能”,这里有一个解决方法。

通过使用OnExit 事件来保存选择并将选择设置为零,您将模仿想要的行为。当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一样。

【讨论】:

  • 在某些控件上,完全没有必要在控件未激活时留下灰色矩形。我认为把它留在那里不会是一个好的 UI 实践,至少它真的让我很困扰......
猜你喜欢
  • 2013-02-24
  • 1970-01-01
  • 2016-10-15
  • 1970-01-01
  • 2021-07-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多