加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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.然后,接口强制转换,提示编译器检查正在强制转换的实例是否实际支持该接口.不知道那个.每天学些新东西.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读