7

这让我很头疼...

我正在开发的 delphi 应用程序在 TOLEContainer 中使用 Word 打开一个或多个表单。我遇到的问题是,当使用 Word 的嵌入实例打开多个表单时,一个实例的控件会影响所有其他实例,而第一个实例上的控件不可用。

例如,第一个 TOleContainer 的控件仍然可见并且似乎已启用但不起作用,在第一个实例中选择文本并在第二个实例中使用控件会导致更改反映在第一个实例中(清除为泥?!?)一切都非常混乱,所以我附上了一张照片:

OleControls 工具栏控制 word 的两个实例

目的是将每个单词实例嵌入到它自己的形式中并利用它自己的控件。那么是什么导致了我不受欢迎的行为,我能做些什么呢?我确信这很简单,比如捕捉 OleContainer 的“激活”属性和设置(我不知道要设置什么),但我没有运气。

我认为一种替代方法可能是创建我自己的 TWordApplication 实例,并通过 Windows.SetParent() 重新父级(这确实有效,顺便说一句,每个实例都可以控制自己,但需要对应用程序进行大量返工)或嵌入一个 OleContainer ......我可以嵌入 TWordApplication 实例他们自己的 OleContainers 吗?如果是这样怎么办?或者更改 CreateObjectFromFile 的默认打开行为(但我认为这是由 Word 的 COM 服务器控制的)...

供参考....通过实例化几个表单来测试以下内容...

// 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,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam);
4

1 回答 1

6

您可以尝试使用 IOleInPlaceActiveObject 并在表单激活和停用时激活和停用。请参阅我的问题的已接受答案:上下文菜单随着 Word 自动化而消失

于 2013-01-15T08:50:50.107 回答