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:
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);
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
@ 0909EM: Sono contento di averlo aiutato, ho usato anche De OnFrameWindowActivate. –
Ulteriori letture hanno portato a questo arrivo ... http://support.microsoft.com/kb/98678 ... anche se potrei saltarlo nell'applicazione a cui sto lavorando – 0909EM