delphi – 上下文菜单与Word自动化消失

前端之家收集整理的这篇文章主要介绍了delphi – 上下文菜单与Word自动化消失前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
当我在OleContainer(inplace)中编辑Word文档时,我切换到另一个Word文档,然后我切换回来,我不能再使用我的rightmouse按钮了。上下文菜单不会显示

这发生在Word 2000,而不是Word 2007(我不知道其他版本)。

如何摆脱这种行为?

如何复制:

>创建一个新的VCL应用程序
>添加菜单
>添加TOleContainer,Align alClient,AllowInPlace和AllowActiveDoc True。
>使用TOleContainer,插入Word 97-2003文档
>在菜单栏中添加一个“关闭”,在其事件处理程序中,添加OleContainer1.DestroyObject,以便您可以停止编辑
>运行此应用程序,双击OleContainer,使其进入editmode
>现在打开Word 2000
>切换回您的应用程序,上下文菜单将不再工作。

编辑:
我在以下系统上复制了上述行为(使用Citrix):

Windows Server 2003企业版
5.2版(Build 3790.srv03_sp2_rtm.070216-1710:Service Pack 2)

Microsoft Word 2000(9.0.6926 SP-3)

我使用Delphi 7(构建8.1)来创建应用程序。

解决方法

当通过ActiveX托管Office应用程序时,您会发现某些Office应用程序的某些版本对于通知窗口激活更改可笑,这可能会特别影响其上下文菜单

基本上,如果您在失去或获得焦点时不告诉他们,并且每当您的顶级窗口获得或失去焦点时(即使他们的窗口中的孩子控制没有获得关注),那么他们可以去干线。

这是我打了很长时间的东西,特别令人沮丧的是,当你不得不告诉应用程序他们比你更了解的位置(比如当他们失去或直接获得焦点时),或者当他们创建一个弹出菜单,使焦点远离他们,并且必须以不同的方式处理一些其他应用程序/窗口的焦点,你将被遗弃…呃。

无论如何,Office应用程序应该公开一个IOleInPlaceActiveObject接口,您应该确保调用其OnFrameWindowActivate方法来告诉它关于激活/停用。

从记忆中,快速浏览我自己的托管办公室的代码,这是最重要的事情之一。忽略也是一件容易的事情,想想“呃,这不是什么关系……为什么会关心窗口是否活跃?”你可能会认为这只会导致一些小的化妆品问题(如果没有出现活动的话),但是可能导致整个事情被锁定或崩溃。相信我,办公室关心这样的事情太多了!我得到的印象是,在办公室的封面下,从合作多任务处理的时代起,仍然有一个非常老的单线程设计,当两个窗口似乎同时处于活动状态时,可能会感到困惑。

对不起,我不能给出更多的建议,而不仅仅是指向这个方向…编写ActiveX主机是一个黑色的艺术(所有的文档是面向被托管,不是主机()和唯一的方式,我得到我自己的代码工作经历了几个月的尝试和错误,并进行了大量的调试,这是一场噩梦,不幸的是。

最后一条建议:不要害怕为特定应用程序硬编码。这是IE本身所做的,使用注册表设置来控制哪些klud应用于什么(我怀疑有些硬编码到代码中)。 ActiveX是一个很不明确的混乱,各种控件都有自己的怪癖和错误,并且不可能编写一个干净,通用的主机与所有这些。 (修改一个修改将会破坏另一个)。您还将发现仅在IE尝试接口时才能正常工作,只因为它们只能通过IE进行测试;做点事情略有不同,它们分崩离析。

猜你在找的Delphi相关文章