2013-01-14 17 views
7

Questo mi sta dando un mal di testa ...Incorporare più istanze di MS Word in TOleContainer

Delphi applicazioni Mi sto lavorando apre una o più forme con Word in un TOLEContainer. Il problema che ho è che quando più di un modulo viene aperto con un'istanza di Word incorporata, i controlli di un'istanza riguardano tutte le altre istanze mentre i controlli della prima istanza sono inutilizzabili.

I controlli per il primo TOleContainer, ad esempio, sono ancora visibili e sembrano attivati ​​ma non sono funzionali, selezionando il testo nella prima istanza e utilizzando i controlli nella seconda istanza fanno sì che le modifiche vengano riflesse in primo luogo (?!? chiaro come il fango) istanza tutto molto confuso così ho inserito una foto:

OleControls toolbar controlling both instances of word

L'intenzione è quella di avere ogni istanza di word incorporato in esso la propria forma e utilizzando sia propri controlli. Quindi cosa causa il mio comportamento indesiderato e cosa posso fare al riguardo? Sono sicuro che sia qualcosa di semplice, come prendere la proprietà "attiva" e impostare (non so cosa impostare) di OleContainer, ma non ho avuto fortuna con questo.

Immagino che un'alternativa potrebbe essere quella di creare le mie istanze di TWordApplication e reindirizzare tramite Windows.SetParent() (funziona, btw, ogni istanza si controlla da sola ma richiederebbe molta modifica dell'applicazione) o incorporati in un OleContainer ... posso incorporare le istanze di TWordApplication con i propri OleContainer? Se sì, in che modo? In alternativa cambiare il comportamento di apertura predefinito di CreateObjectFromFile (ma penso che questo è controllato dal server COM, che è la Parola) ...

Per riferimento .... testare i seguenti istanziando un paio di forme ...

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

risposta

6

Si potrebbe provare a lavorare con IOleInPlaceActiveObject e attivare e disattivare quando il modulo si attiva e si disattiva. Vedere la risposta accettata alla mia domanda: Context menu disappears with Word automation

+3

Per chiunque nella mia scia ... Il modo per farlo è prendere l'OnActivate/disattivazione del modulo, poi gettato come segue ... se Assigned (FWordApplication) allora cominciano se Supporti (OleContainer1.OleObject, IOleInPlaceActiveObject, lOleInPlaceActiveObject) poi iniziare lOleInPlaceActiveObject.OnDocWindowActivate (vero) fine; fine; Ciò che effettivamente avevo bisogno era OnFrameWindowActivate che fa parte della stessa interfaccia. Facile quando sai come! – 0909EM

+0

@ 0909EM: Sono contento di averlo aiutato, ho usato anche De OnFrameWindowActivate. –

+1

Ulteriori letture hanno portato a questo arrivo ... http://support.microsoft.com/kb/98678 ... anche se potrei saltarlo nell'applicazione a cui sto lavorando – 0909EM