在TOleContainer中嵌入多个MS Word实例

时间:2013-01-14 23:01:52

标签: delphi ms-word toolbar ole

这令我头疼......

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

例如,第一个TOleContainer的控件仍然可见并且似乎已启用但无法正常工作,在第一个实例中选择文本并在第二个实例中使用控件会导致更改反映在第一个实例中(清楚如泥?!?)所有非常令人困惑所以我已经包括了一张图片:

OleControls toolbar controlling both instances of word

目的是让每个单词实例都嵌入其自身的形式并利用它自己的控件。那么是什么导致了我不受欢迎的行为,我该怎么办呢?我确定它很简单,就像捕捉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,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam);

1 个答案:

答案 0 :(得分:6)

您可以尝试使用IOleInPlaceActiveObject,并在表单激活和停用时激活和停用。请参阅我的问题的接受答案:Context menu disappears with Word automation