如何正确设置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.然后,接口强制转换,提示编译器检查正在强制转换的实例是否实际支持该接口.不知道那个.每天学些新东西.
总结以上是内存溢出为你收集整理的delphi – 用于捕获MSWord文档事件的IAdviseSink设置全部内容,希望文章能够帮你解决delphi – 用于捕获MSWord文档事件的IAdviseSink设置所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)