这让我很头疼……
我正在开发的delphi App在TOLEContainer中用Word打开一个或多个表单.我遇到的问题是,当使用嵌入的Word实例打开多个表单时,一个实例的控件会影响所有其他实例,而第一个实例上的控件不可用.
例如,第一个TOleContainer的控件仍然可见并且似乎已启用但功能不正常,在第一个实例中选择文本并在第二个实例中使用控件会导致更改反映在第一个实例中(清除为泥?!?)所有非常令人困惑,所以我已经包括一张图片:
目的是让每个单词实例嵌入其自身的形式并利用它自己的控件.那么是什么导致了我不受欢迎的行为,我该怎么办呢?我确定它很简单,就像捕捉OleContainer的“激活”属性和设置(我不知道要设置什么),但我没有运气.
我认为一个替代方案可能是创建我自己的TWordApplication实例,并通过Windows.SetParent()重新生成(这确实有效,顺便说一句,每个实例都控制自己,但需要对应用程序进行大量的返工)或嵌入OleContainer …我可以将TWordApplication实例嵌入自己的OleContainer吗?如果是这样怎么回事?或者更改CreateObjectFromFile的默认打开行为(但我认为这是由Word服务器控制的)…
供参考….通过实例化几个表格来测试以下内容……
// This embed into an OleContainer,but opening two forms // leaves me with one that has working controls and another // that has non-working controls (this code on it's own form) // If this code is on TForm2 and you create two instances of TForm2 // Word behaves incorrectly OleContainer1.CreateObjectFromFile('C:\Test.docx',false); OleContainer1.AutoActivate := aaGetFocus; OleContainer1.DoVerb(ovOpen); OleContainer1.Run; // To embed Word on a TPanel (this code on it's own form) // This code on TForm3,create two instance of TForm3 to see // word work independently as desired wordApp := TWordApplication.Create(Self); wordApp.ConnectKind := TConnectKind.ckNewInstance; wordApp.Caption := IntToStr(AppId); wordApp.Visible := True; WordHandle := FindWindow('OpusApp',PWideChar(wordApp.Caption)); Windows.SetParent(WordHandle,Panel1.Handle); if AppId = 1 then begin lFilename := 'C:\Test.docx'; end else begin lFilename := 'C:\Test2.docx'; end; wordApp.Documents.Open(lFileName,EmptyParam,EmptyParam);
解决方法
您可以尝试使用IOleInPlaceActiveObject,并在表单激活和停用时激活和取消激活.请参阅我的问题的接受答案:
Context menu disappears with Word automation