如何处理TListView中启用OwnerData时默认列宽度自适应的问题

6

我有一个TListView(在报表模式下),我正在虚拟模式下使用它(OwnerData:= True)。除了我所知道的两种情况可以自动调整列大小之外,一切正常。它们是:

  1. 双击标题列分隔符以自动调整单个列
  2. Ctrl-KeypadPlus键自动调整所有列。

虚拟模式下的这些事件的默认处理方式似乎并不起作用(它似乎会在数据的第一行自动调整大小)。我想钩入该行为并执行自己的列自动调整。有人知道如何做到这一点吗?或者我可能错过了一些明显的东西?我正在使用Delphi XE。谢谢任何建议。


类似的内容在这里 https://dev59.com/PGox5IYBdhLWcg3wWzJ7 - TLama
1个回答

1

对于虚拟列表视图控件,自动调整列大小是使用在执行自动调整操作时可见的所有项目。 这是 Delphi TListView 控件的行为。 尝试在资源管理器中执行相同的操作,您可以轻松看到这是操作系统标准。

当您在非虚拟模式下操作列表视图时,将在执行自动调整大小时考虑所有行的内容。

我不确定为什么您观察到自动调整大小仅考虑第一行数据。 如果这确实是您遇到的情况,那么我认为您的代码可能有问题,我们需要查看它。


您的问题似乎是Windows XP的一个bug。据我所见,虚拟列表视图在XP上不能正确执行自动调整大小。我认为,资源管理器在XP和Vista之间从非虚拟切换到虚拟,而且我敢打赌,资源管理器团队有足够的内部影响力来解决这个问题。

据我所知,您不会收到正在进行自动调整大小的通知,因此我认为很难解决这个问题。如果您想进一步追究此事,则可以尝试响应标题控件和CTRL +列表的HDN_DIVIDERDBLCLICK通知。但是,我不确定该方法是否会产生任何成果。


谢谢David。我不确定它使用的是什么方法,但在我的XP系统上,它似乎没有使用可见行来进行自动调整大小(或者测量不正确,看起来设置得更小,以至于我会得到很多省略号,有时是几个字符,有时更多)。无论如何,我的问题实际上是如何控制行为,因为默认值不符合我的需求。 - MarkF
我在Windows 7上进行了实验。我将在XP机器上看一眼,以查看其表现如何。 - David Heffernan
谢谢,感谢你的更新。我的主要开发机是XP,但我当然计划升级到Win 7 64位,这样我就可以玩XE2了。我看到一些关于C++的论坛帖子提到他们不得不使用自己的头控件来解决这个问题,所以我认为你可能是正确的,缺乏乐趣...我只是惊讶,因为它似乎是一个有用的覆盖。 - MarkF

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接