2013-01-14 56 views
7

這讓我頭疼......嵌入多個MS Word的情況下,在TOleContainer

的Delphi應用程序我正在打開與Word在TOLEContainer一個或多個形式。我遇到的問題是,當使用Word的嵌入式實例打開多個表單時,一個實例的控件影響所有其他實例,而第一個實例上的控件不可用。

例如,第一個TOleContainer的控件仍然可見並且似乎已啓用,但它們都是非功能性的,在第一個實例中選擇文本並在第二個實例中使用控件導致更改被反映在第一個(?!?清楚泥)實例中的所有非常混亂,所以我已經包括了一個畫面:

OleControls toolbar controlling both instances of word

的目的是有字嵌在它自己的形式,並利用它自己控制的每一個實例。那麼是什麼導致了我不想要的行爲,我該怎麼辦呢?我確定這很簡單,就像捕獲OleContainer的「激活」屬性和設置(我不知道要設置什麼),但我沒有這樣的運氣。

我想一個替代方案可能是創建我自己的TWordApplication實例,並通過Windows.SetParent()重新實現父親(這可以工作,順便說一句,每個實例都能控制自己,但需要大量的應用程序返工)或嵌入OleContainer中......我可以在TWordApplication實例中嵌入自己的OleContainer嗎?如果是這樣怎麼樣?或者更改CreateObjectFromFile的默認打開行爲(但我認爲這是由COM服務器控制的Word)...

僅供參考....通過實例化幾個表單來測試以下內容...

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

回答

6

您可以嘗試使用IOleInPlaceActiveObject並在表單激活和停用時激活和停用。見接受的答案我的問題:Context menu disappears with Word automation

+3

對於我醒來的人......這樣做的方式是抓住形式的OnActivate /停用,然後抹上如下... 如果分配(FWordApplication),然後 開始 如果支持(OleContainer1.OleObject,IOleInPlaceActiveObject,lOleInPlaceActiveObject)然後 開始 lOleInPlaceActiveObject.OnDocWindowActivate(真) 端; 結束; 但是我實際需要的是OnFrameWindowActivate,它是同一接口的一部分。很容易,當你知道如何! – 0909EM

+0

@ 0909EM:很高興幫助,我也使用了deFrameWindowActivate。 –

+1

進一步閱讀導致這即將到來... http://support.microsoft.com/kb/98678 ...雖然我可能跳過它在我正在工作的應用程序 – 0909EM

相關問題