2013-01-14 25 views
7

To daje mi ból głowy ...Osadzanie wielu instancji MS Word w TOleContainer

Delphi App pracuję nad otwiera jeden lub więcej formularzy z programu Word w TOLEContainer. Problem polega na tym, że gdy otwierany jest więcej niż jeden formularz z osadzoną instancją programu Word, elementy sterujące jednej instancji wpływają na wszystkie inne wystąpienia, podczas gdy elementy sterujące w pierwszej instancji są bezużyteczne.

Elementy sterujące dla pierwszego kontenera, na przykład, są nadal widoczne i wydają się być włączone, ale nie działają, zaznaczając tekst w pierwszej instancji, a za pomocą elementów sterujących w drugiej instancji powoduje, że zmiany są odzwierciedlane w pierwszej (?!? jasne jak słońce) instancji Wszystko bardzo mylące, więc podaję obrazek:

OleControls toolbar controlling both instances of word

zamiarem jest, aby każde wystąpienie słowa osadzonym w jego własnej postaci i wykorzystując swoje własne kontrole. Co powoduje moje niepożądane zachowanie i co mogę z tym zrobić? Jestem pewien, że jest to coś prostego, na przykład łapanie właściwości i ustawień "aktywacji" (nie wiem, co ustawić) w OleContainerze, ale nie miałem z tym szczęścia.

Myślę, że jedną z alternatyw może być tworzenie własnych wystąpień TWORDApplication i ponowne nadawanie rodzicom za pomocą Windows.SetParent() (to działa, btw, każda instancja sama kontroluje, ale wymagałaby dużej ilości przeróbek aplikacji) lub osadzić w OleContainer ... czy mogę osadzić wystąpienia TWordApplication w swoich własnych kontenerach OleContainers? Jeśli tak, to w jaki sposób? Alternatywnie zmianę domyślnej otwarty zachowanie CreateObjectFromFile (ale myślę, że ten jest kontrolowany przez serwer COM, który jest Słowem) ...

Dla porównania .... przetestować następujące instancji przez kilka form ...

// 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); 

Odpowiedz

6

Możesz spróbować pracy z IOleInPlaceActiveObject i aktywować i dezaktywować, gdy formularz aktywuje się i dezaktywuje. Zobacz zaakceptowane odpowiedź na moje pytanie: Context menu disappears with Word automation

+3

Dla kogoś w moim budzeniu ... Sposobem na to jest złapać OnActivate/wyłączyć w formularzu, a następnie odlewane są następujące ... jeśli określony cel (FWordApplication), a następnie rozpocząć jeśli wsporniki (OleContainer1.OleObject, IOleInPlaceActiveObject, lOleInPlaceActiveObject) następnie rozpocząć lOleInPlaceActiveObject.OnDocWindowActivate (true) koniec; koniec; Tym, czego potrzebowałem, była funkcja OnFrameWindowActivate, która jest częścią tego samego interfejsu. Łatwo, kiedy wiesz jak! – 0909EM

+0

@ 0909EM: Cieszę się, że pomogło, użyłem również OnFrameWindowActivate. –

+1

Dalsze czytanie zaowocowało tym nadchodzącym ... http://support.microsoft.com/kb/98678 ... chociaż mogę pominąć to w aplikacji, nad którą pracuję – 0909EM