これが頭を悩ませている…
私が取り組んでいる Delphi アプリは、TOLEContainer 内の Word で 1 つ以上のフォームを開きます。私が抱えている問題は、Word の埋め込みインスタンスで複数のフォームを開くと、1 つのインスタンスのコントロールが他のすべてのインスタンスに影響を与え、最初のインスタンスのコントロールが使用できないことです。
たとえば、最初の TOleContainer のコントロールは引き続き表示され、有効になっているように見えますが、機能していません。最初のインスタンスでテキストを選択し、2 番目のインスタンスでコントロールを使用すると、変更が最初のインスタンスに反映されます (泥?!?) すべて非常に紛らわしいので、写真を含めました:
意図は、単語の各インスタンスを独自のフォームに埋め込み、独自のコントロールを利用することです。では、私の望ましくない行動の原因と、それに対して何ができるのでしょうか? 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);