代码之家  ›  专栏  ›  技术社区  ›  The_Fox

上下文菜单随Word automation一起消失

  •  16
  • The_Fox  · 技术社区  · 14 年前

    当我在一个OleContainer(inplace)中编辑一个Word文档时,我切换到另一个Word文档,然后再切换回来,我就不能再使用鼠标右键了。上下文菜单将不显示。

    我怎样才能摆脱这种行为?

    • 创建新的VCL应用程序
    • 添加菜单栏
    • 使用TOleContainer,插入Word 97-2003文档
    • 将menuitem“Close”添加到菜单栏,在其eventhandler中,添加 OleContainer1.DestroyObject ,因此您可以停止编辑
    • 运行此应用程序,双击OleContainer,使其进入编辑模式
    • 现在打开Word 2000
    • 切换回应用程序,上下文菜单将不再工作。

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


    版本5.2(内部版本3790.srv03\u sp2\u rtm.070216-1710:Service Pack 2)

    我使用Delphi7(Build8.1)创建应用程序。

    3 回复  |  直到 14 年前
        1
  •  4
  •   Leo Davidson    14 年前

    当通过ActiveX托管Office应用程序时,您会发现某些Office应用程序的某些版本对于被告知窗口激活更改非常敏感,这会特别影响到它们的上下文菜单。

    基本上,如果你不告诉他们何时失去或获得焦点,也不告诉你的顶级窗口何时获得或失去焦点(即使他们在窗口中的子控件没有获得焦点),那么他们可能会失控。

    这是我与之斗争了很长一段时间的事情,尤其是当你不得不告诉应用程序他们比你更了解的事情时(比如当他们失去或直接获得焦点时。。。或者,当他们创建一个弹出式菜单,将焦点从他们身上移开,并且必须以不同于其他应用程序/窗口的方式来处理焦点时,你将被留给神。。。啊。

    从内存中,快速查看一下我自己的托管Office代码,这是最重要的事情之一。这也是一件容易忽视的事情,心想“不,没什么大不了的。。。为什么有人会那么在意窗口是否处于活动状态呢?“你可能会认为这只会导致一些小的装饰问题(比如它不处于活动状态时显得很活跃),但它可能会导致整个事情锁定或崩溃。相信我,办公室太关心这些事情了!我得到的印象是,在办公室的掩护下,仍然有一个非常古老的,单线程的设计,从合作多任务的日子里,它会变得非常混乱,当它的两个窗口似乎同时活跃。

    最后一条建议:不要害怕为特定的应用程序编写代码。这就是IE本身所做的,通过注册表设置来控制哪些乱七八糟的东西被应用到什么东西上(我怀疑代码中有更多的硬编码)。ActiveX是一个定义很差的烂摊子,各种控件都有自己的怪癖和错误,不可能编写一个干净的、通用的主机来处理所有这些控件(你也会发现,只有当你按照IE的顺序尝试接口时,才有效果,因为它们只经过IE的测试;做事稍有不同就会分崩离析(

        2
  •  0
  •   David T. Macknet    14 年前

    我想知道你是否能钓到鱼 Lost Focus 从包含OLE容器的窗体中键入事件,此时可以销毁OLE容器中的文档,但将其保留在内存中。那么,在任何情况下 Got Focus 为窗体键入event,您可以检查是否有该文档;如果是,请将其重新加载到OLE容器中。

    那对你有用吗?

        3
  •  0
  •   Ross Bush    14 年前

    也许您可以使用组件调用应用程序。我从来没有遇到过这样的问题:创建一个自定义组件,通过接口调用word,然后在菜单中注册特殊命令。在一个容器里你不能在窗体上设计一个特殊的菜单吗?有几个WordSink Evenets可以帮助保存和关闭,它们可以与word com对象一起使用。