关于ListView控件的兼容性的一则轶事

关于ListView控件的兼容性的一则轶事

作者:BlogUpdater |  时间:2021-12-02 |  浏览:258 |  评论已关闭 条评论

ListView是一个用来呈现数据的,非常强大的控件。当它处于报告模式(report mode)时,它会创建一个列头控件,用来显示表格中每一列的标题。这个列头控件是ListView控件的属性,但是ListView还是十分善意第提供了一个获取其句柄的方法,这样你就可以操作列头控件。

但是,有些开发者却滥用了这种善意。

在原始版本的ListView控件中,它没有使用列头控件条目的LPARAM来保存任何数据。有些开发者就说,”挺好啊,你们没有用到这个,我就用了哦” 然后就在这个LPARAM中保存一些应用程序的一些私有数据。

冲突在新版本的ListView中发生了。ListView的开发团队决定,”我需要在每一个列头条目中保存一些状态数据了。幸运的是,这个是ListView内部使用的控件,我可以保存一些私有数据到列头项目的LPARAM中,客户代码应该不会有任何影响,太棒了!”

然后应用程序兼容性团队将这两种成分(将数据填充到标题控件中的程序和执行相同操作的列表视图)带到他们的实验室,将它们混合,然后爆炸就发生了。

经过一些取证分析,ListView开发团队弄清楚了发生了什么,他们必须设计一种方案来解决这个内部数据结构导致的冲突。后来,开发团队绞尽脑汁,终于将他们用到的私有数据存储在控件的其他地方,以便这些客户程序可以继续运行而不会崩溃。

这个故事的寓意是:即使你改变了一些没人应该依赖的东西,也很有可能有人依赖它。

有人会说,你可以直接不考虑兼容性,这样应用程序的开发者就不得不修改他们的程序了。
如果我告诉你,如果这个程序是一个被广泛使用的系统工具怎么办?用户只会看到他们之前正常使用功能的工具不能工作了,而不会想到底层的原因。

算了,还是继续努力保持兼容性为妙。

总结
我学习到:如果你不希望别人访问你的对象,就不要暴露出可以操作对象的句柄。
看来,面向对象编程我还得在学几年。

最后
Raymond Chen的《The Old New Thing》是我非常喜欢的博客之一,里面有很多关于Windows的小知识,对于广大Windows平台开发者来说,确实十分有帮助。
本文来自:《The compatibility constraints of even your internal bookkeeping》

最近我写了个东西
正如你们所知道的,拓扑梅尔智慧办公平台(Topomel Box)是一款绿色软件,主要面向经常使用电脑的朋友。它提供了各种提升办公效率的小功能,同时操作上尽可能地简单方便。
我想:你值得拥有。

评论已关闭。