delphi – 用于捕获MSWord文档事件的IAdviseSink设置

delphi – 用于捕获MSWord文档事件的IAdviseSink设置,第1张

概述下面是我尝试设置在我的TForm1类中实现的IAdviseSink接口的代码,用于捕获新创建的MSWord文档的一些事件.代码运行时我没有任何错误,但我无法捕获任何事件,同时保存文档或关闭它. 如何正确设置IAdviseSink for MSWord文档? var Form1 : TForm1; doc_ole_obj : IOleObject; word 下面是我尝试设置在我的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.然后,接口强制转换,提示编译器检查正在强制转换的实例是否实际支持该接口.不知道那个.每天学些新东西.

总结

以上是内存溢出为你收集整理的delphi – 用于捕获MSWord文档事件的IAdviseSink设置全部内容,希望文章能够帮你解决delphi – 用于捕获MSWord文档事件的IAdviseSink设置所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1271466.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-08
下一篇 2022-06-08

发表评论

登录后才能评论

评论列表(0条)

保存