Встраивание нескольких экземпляров MS Word в TOleContainer
Это дает мне головную боль...
приложение delphi, над которым я работаю, открывает одну или несколько форм со словом в TOLEContainer. Проблема заключается в том, что при открытии нескольких форм со встроенным экземпляром Word элементы управления одного экземпляра влияют на все остальные экземпляры, в то время как элементы управления первого экземпляра непригодны для использования.
элементы управления для первого TOleContainer, например, по-прежнему видны и, как представляется, включены, но не являются функциональными, выбор текста в первом экземпляре и использование элементов управления во втором экземпляре приводят к отражению изменений в первом экземпляре (ясно, как грязь?!?) Все очень запутанно, поэтому я включил изображение:
намерение состоит в том, чтобы каждый экземпляр Слова был встроен в его собственную форму и использовал его собственные элементы управления. Так что же вызывает мое нежелательное поведение и что я могу с этим поделать? Я уверен, что это что-то простое, например, поймать свойство "активировать" и настройку (Я не знаю, что установить) 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