启用主题的Windows XP/Vista中的TAnimate将不起作用
一位同事使用自定义AVI来指示多年来在某些较长时间的操作中的进度。它一直运行良好。启用主题的Windows XP/Vista中的TAnimate将不起作用
最近他决定从Delphi 7转到Delphi 2007,部分原因是为他的应用程序获得主题支持。 (我们终于得到了大多数人,但不是全部,在XP上运行。)动画停止工作。禁用主题会使其重新运行。
TAnimate是使用InitCommonControlsEx(ICC_ANIMATE_CLASS)创建的Windows动画控件的包装。 MSDN文档说:“如果您使用的是ComCtl32.dll版本6,则不支持该线程,因此请确保您的应用程序不会阻止UI或动画不会发生。”显然,这是预期的行为。
有没有人有解决方法或替代这个问题的建议?他试图展示进度的处理不适合产生单独的线程,并且由于显而易见的原因,Application.ProcessMessages也不是一个好的解决方案。
编辑:我授予Rob Kennedy这个问题的正确答案,因为a)他向Raymond Chen的博客文章提供了关于此主题的“缺失的链接”(双关语意),以及b)因为当然移动了东西到一个单独的线程是正确的答案。
这里很有讽刺意味:他正在进行的阻止TAnimate的操作是我们使用的数据库引擎(Advantage Database Server或ADS)的索引操作。当他问我这个问题时他没有提到。
ADS使用TAdsDataSet.AdsRegisterCallbackFunction和TAdsDataSet.AdsClearCallbackFunction方法支持进度回调。回调函数提供了当前操作的进度(百分比)以及通过函数的返回值取消操作的方法。所以整个问题都是没有意义的。可以使用回调函数来更新进度条,该进度条向用户指示应用程序未挂起。
Raymond Chen has written about this.他甚至没有涉及我通常认为的主要原因,即线程控件无法正常工作,也就是说线程不应该在与其他线程关联的窗口上绘制。
我鼓励你的同事重新审视任何事情,因为他决定他不能将任务放到单独的线程中。阻止主UI线程并不是一个好主意,不管是否有一个动画控件来掩盖无响应。
罗布,谢谢。我知道我曾经在某处看到过某些东西,但是MSDN搜索没有提到雷蒙德的文章。他仍然不同意单独的线程是唯一的解决方案(他等待的是在调用第三方DLL时发生的,并且他的应用程序不应该能够继续,直到DLL任务完成)。他只是想在过程中显示某种活动指示器,以便用户知道应用程序未被冻结。 – 2009-08-06 14:25:54
从7到2007获得主题?我虽然Delphi 7已经支持主题。 – 2009-08-06 13:51:58
我确实说过“部分”。 D7确实支持主题;他只是没有注意到。 (他有点Luddite) –
2009-08-06 14:30:05