【发布时间】:2010-11-17 08:18:25
【问题描述】:
多年来,一位同事一直在使用自定义 AVI 来指示一些较长时间的操作的进度。它总是运行良好。
最近他决定从 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 方法的进度回调。回调函数既提供当前操作的进度(以百分比表示),又提供通过函数返回值取消操作的方法。所以整个问题都没有实际意义。回调函数可用于更新进度条,向用户指示应用未挂起。
【问题讨论】:
-
从 7 移动到 2007 以获得主题?我虽然 Delphi 7 已经支持主题。
-
我确实说过“部分”。 D7 确实支持主题;他只是没有注意到。 (他有点像卢德分子。
)
标签: delphi windows-xp