Встраивание нескольких экземпляров MS Word в TOleContainer

Это дает мне головную боль...

приложение delphi, над которым я работаю, открывает одну или несколько форм со словом в TOLEContainer. Проблема заключается в том, что при открытии нескольких форм со встроенным экземпляром Word элементы управления одного экземпляра влияют на все остальные экземпляры, в то время как элементы управления первого экземпляра непригодны для использования.

элементы управления для первого TOleContainer, например, по-прежнему видны и, как представляется, включены, но не являются функциональными, выбор текста в первом экземпляре и использование элементов управления во втором экземпляре приводят к отражению изменений в первом экземпляре (ясно, как грязь?!?) Все очень запутанно, поэтому я включил изображение:

OleControls toolbar controlling both instances of word

намерение состоит в том, чтобы каждый экземпляр Слова был встроен в его собственную форму и использовал его собственные элементы управления. Так что же вызывает мое нежелательное поведение и что я могу с этим поделать? Я уверен, что это что-то простое, например, поймать свойство "активировать" и настройку (Я не знаю, что установить) OleContainer, но мне не повезло с этим.

Я полагаю, что одной из альтернатив может быть создание моих собственных экземпляров TWordApplication и либо повторный родитель через Windows.SetParent () (это работает, кстати, каждый экземпляр контролирует себя, но потребует много переделки приложения) или встроить в OleContainer... могу ли я встраивать экземпляры TWordApplication в собственные OleContainers? Если да, то как? Кроме того по умолчанию открывается поведение CreateObjectFromFile (но я думаю, что это контролируется COM-сервером, который является 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 ответов


вы можете попробовать работать с IOleInPlaceActiveObject и активировать и деактивировать, когда ваша форма активируется и деактивируется. См. принятый ответ на мой вопрос: контекстное меню исчезает с Word automation