7

これが頭を悩ませている…

私が取り組んでいる Delphi アプリは、TOLEContainer 内の Word で 1 つ以上のフォームを開きます。私が抱えている問題は、Word の埋め込みインスタンスで複数のフォームを開くと、1 つのインスタンスのコントロールが他のすべてのインスタンスに影響を与え、最初のインスタンスのコントロールが使用できないことです。

たとえば、最初の TOleContainer のコントロールは引き続き表示され、有効になっているように見えますが、機能していません。最初のインスタンスでテキストを選択し、2 番目のインスタンスでコントロールを使用すると、変更が最初のインスタンスに反映されます (泥?!?) すべて非常に紛らわしいので、写真を含めました:

Word の両方のインスタンスを制御する OleControls ツールバー

意図は、単語の各インスタンスを独自のフォームに埋め込み、独自のコントロールを利用することです。では、私の望ましくない行動の原因と、それに対して何ができるのでしょうか? 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 に答える