delphi – 用于捕获MSWord文档事件的IAdviseSink设置
发布时间:2020-12-15 09:45:18 所属栏目:大数据 来源:网络整理
导读:下面是我尝试设置在我的TForm1类中实现的IAdviseSink接口的代码,用于捕获新创建的MSWord文档的一些事件.代码运行时我没有任何错误,但我无法捕获任何事件,同时保存文档或关闭它. 如何正确设置IAdviseSink for MSWord文档? var Form1 : TForm1; doc_ole_obj :
下面是我尝试设置在我的TForm1类中实现的IAdviseSink接口的代码,用于捕获新创建的MSWord文档的一些事件.代码运行时我没有任何错误,但我无法捕获任何事件,同时保存文档或关闭它.
如何正确设置IAdviseSink for MSWord文档? 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; 解决方法
编辑:
别介意这个答案.将它留在教育目的. 为什么演员IAdviseSink(自我)? 如果您在Form的类声明中声明了接口: 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.然后,接口强制转换,提示编译器检查正在强制转换的实例是否实际支持该接口.不知道那个.每天学些新东西. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |