2011-12-24 54 views
5

這裏是我嘗試設置IAdviseSink接口的代碼,該接口在我的TForm1類中實現,用於捕獲新創建的MSWord文檔的一些事件。代碼運行時我沒有任何錯誤,但是我無法捕獲任何事件,同時保存文檔或關閉它。 如何爲MSWord文檔正確設置IAdviseSink用於捕獲MSWord文檔事件的IAdviseSink設置

 

    var 
     Form1 : TForm1; 
     doc_ole_obj : IOleObject; 
     word : IDispatch; 
     Connection: LongInt; 

    implementation 

    //------------ Setup IAdviseSink 
    procedure TForm1.Setup; 
    begin 
    word := CreateOleObject('Word.Application'); 
    OleVariant(word).Visible := True; 

    IUnknown(OleVariant(word).Documents.Open('file.doc')).QueryInterface(IOleObject,doc_ole_obj); 
    doc_ole_obj.Advise(IAdviseSink(Self), Connection); 
    end; 

    //------------- catch Sink events 
    procedure TForm1.OnSave; 
    begin 
     Caption := 'saved at ' + TimeToStr(Now); 
    end; 
 
+0

使用該設置,OnClose在這裏關閉文檔時很好,當我保存文檔'OnRename'時,再次使用新名稱保存時' OnRename着火了。是什麼賦予了? – 2011-12-24 16:12:55

+1

'OnClose'示例[here](http://stackoverflow.com/a/2886747/243614),但我沒有測試其他事件,然後.. – 2011-12-24 16:20:30

回答

0

編輯:

沒關係這個答案。爲了教育目的而離開它。


爲什麼投IAdviseSink(Self)

如果宣佈窗體的類聲明的接口:

TForm1 = class(TForm, IAdviseSink) 
    ... 
end; 

,你不應該有。

事實上,您使用演員(和一個剛剛告訴編譯器閉嘴的硬演員),可能表明你沒有。這可能會導致調度機制發現您的表單沒有實現IAdviseSink,因此沒有任何方法可以調用OnSave方法。

我不明白Sertac的評論「但隨後的代碼將無法編譯」起初:


爲什麼上面是沒有問題的解釋。他的意思是沒有被IAdviseSink窗體的類聲明的一部分,線

doc_ole_obj.Advise(IAdviseSink(Self), Connection); 

將導致[DCC錯誤] Unit1.pas(41):E2010不兼容的類型: 'IAdviseSink' 和 'TForm1'

IAdviseSink(Self)顯然不是一個簡單的硬演員,比如TForm(SomePointer),它基本上告訴編譯器關閉並將SomePointer視爲TForm。然後,一個接口被施放,提示編譯器檢查被施放的實例是否實際上支持該接口。不知道。每天學些新東西。

+3

但是然後代碼不會編譯.. – 2011-12-24 17:08:10

+0

@Sertac:爲什麼不呢?它在我的機器上編譯得很好(D2010)。 – 2011-12-24 17:26:34

+0

我不是那個意思。如果表單沒有實現IAdviseSink,那麼'Advise(Self..'不會編譯。既不是'Advise(IAdviseSink(Self),..',*)*'* * * *'*。* *。*在這裏。 – 2011-12-24 17:29:05

0

不完全是一個答案,但是...

有你爲什麼要另起爐竈,做全Advise -thing自己一個特別的原因?爲什麼不使用Word2000中的TWordDocument包裝類(與Delphi捆綁在一起)(在這種情況下,你需要做的所有事情就是調用ConnectTo()並分配你的事件處理程序)?但Document對象沒有OnSave事件(至少不在2000版本的TLB中,如果您希望應用程序與多個Office版本兼容,通常這是一個很好的共同點)。 Application對象確實有一個BeforeDocumentSave -event,儘管...