gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 15:14:41 26 4
gpt4 key购买 nike

下面是我尝试设置在 TForm1 类中实现的 IAdviseSink 接口(interface)的代码,用于捕获新创建的 MSWord 文档的一些事件。代码运行时没有任何错误,但在保存文档或关闭文档时无法捕获任何事件。如何正确设置 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;

最佳答案

编辑:

别介意这个答案。将其保留用于教育目的。

<小时/>

为什么要转换IAdviseSink(Self)

如果您在 Form 的类声明中声明了接口(interface):

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 视为表格。然后,接口(interface)强制转换会提示编译器检查正在强制转换的实例是否确实支持该接口(interface)。不知道。每天学习新东西。

关于delphi - 用于捕获 MSWord 文档事件的 IAdviseSink 设置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8625340/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com