【发布时间】:2015-02-19 14:05:57
【问题描述】:
我正在使用 QAxObject 从 Qt 应用程序自动生成 Excel 窗口。当 Excel 窗口被用户关闭时,我需要得到通知。
Excel 工作簿 COM 对象有一个事件 BeforeClose(),但处理它是不够的,因为它在提示用户保存更改之前被触发,因此用户将在保存确认对话框中取消关闭操作。因此,即使BeforeClose() 被触发,Excel 窗口也可能不会关闭。
还有另一个事件Deactivate() 在停用工作簿时触发。当窗口实际关闭以及用户切换到不同的工作簿时会触发此事件。所以单独处理也是不够的。
我当前使用的解决方案是在触发BeforeClose() 时将布尔变量closing 设置为true。当Deactivate() 事件处理程序随后被触发时,我认为只有当closing 设置为true 时Excel 才会关闭。
这还需要一件事,如果用户在保存确认对话框中取消关闭操作,则将 closing 设置为 false。我使用的方法是在BeforeClose() 中启动一个重复计时器并检查计时器中Excel COM 对象的Visible 属性。当模式对话框(例如保存确认对话框)打开时,Visible 属性被评估为 false。所以我可以在计时器中将Visible 属性评估为true 时立即将closing 设置为false。
有人知道在 Excel 工作簿实际关闭时获得通知的更好方法吗?
【问题讨论】:
-
你很接近。相反,只需检查
Closing在Deactivate中是否为真。如果是这样,那么它真的要关闭了。此时将 Closing 设置为 False(如果您在应用程序级别执行此操作)。 -
但如果用户取消关闭操作,则不会触发 Deactivate。因此,我发现将
closing重置为 false 的唯一方法是使用计时器。 -
你是对的。不知道我在想什么。