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

2024-03-09

这是我尝试设置的代码IAdviseSink在我的接口中实现的TForm1用于捕获新创建的 MSWord 文档的一些事件的类。代码运行时没有任何错误,但在保存文档或关闭文档时无法捕获任何事件。 如何设置IAdviseSinkMSWord 文档正确吗?


    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;


Edit:

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


为什么选演员IAdviseSink(Self)?

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

TForm1 = class(TForm, IAdviseSink)
   ...
end;

,你不应该这样做。

事实上,您使用了强制转换(以及只是告诉编译器关闭的硬强制转换),可能表明您没有这样做。这很可能会导致调度机制发现您的表单没有实现 IAdviseSink,因此没有任何内容可以调用 OnSave 方法。


解释为什么上述不是问题:

起初我不明白 Sertac 的评论“但是代码无法编译”。他的意思是如果没有IAdviseSink作为表单类声明的一部分,该行

doc_ole_obj.Advise(IAdviseSink(Self), Connection);

会导致 [DCC 错误] Unit1.pas(41): E2010 不兼容的类型:“IAdviseSink”和“TForm1”

The IAdviseSink(Self)显然不是一个简单的硬演员TForm(SomePointer)is,它基本上告诉编译器关闭并将 SomePointer 视为 TForm。然后,接口强制转换会提示编译器检查正在强制转换的实例是否确实支持该接口。不知道。每天学些新东西。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

用于捕获 MSWord 文档事件的 IAdviseSink 设置 的相关文章

  • 在非输入元素上反应 onKeyDown/onKeyUp 事件

    我需要捕获 cmd 按钮向上和向下事件 以便选择是否在 setState 中使用串联 例如 我如何在表元素上获取这些事件 您必须在主体 窗口级别捕获按键 表元素没有输入焦点 因此您无法从表中捕获键 没有输入元素 var cmdDown fa
  • 使用 Javascript 跟踪 HTML 元素的显示变化

    假设我有一个给定的 HTML 元素 例如 div div 在该元素内部 可能会发生很多事情 这些事情会改变该元素的某些显示配置 例如其高度或固定位置 我是否可以跟踪与该元素的显示相关的任何更改 当元素更改任何显示变量时是否会触发一般事件 只
  • 如何使用 Microsoft.Office.Interop.Word 将光标移动到特定段落?

    我们正在开发C Net 4 0基于 Windows 窗体的应用程序使用Microsoft Office Interop Word参考 现在我想将光标的位置移动到特定段落 我怎么做呢 void MoveToParagraph Microsof
  • ZF2 共享模块事件管理器

    当特定情况发生时 我需要在每个模块中实现一个事件触发器 我还需要所有其他模块在触发该事件时必须执行某些工作 请注意这一点 我正在尝试创建一些通用端点 我可以在其中发送触发器 并且所有模块都需要监听 但我在弄清楚如何实现这一点时遇到了一些麻烦
  • 如何从窗体单元外部访问delphi控件?

    我试图从如下定义的过程中调用计时器的 Enabled 属性 procedure Slide Form TForm Show Boolean 并且没有固定的形式名称 例如 Form2 Timer 将表单的单位放入使用列表后 这可以工作 For
  • Angularjs:当滚动到达div中滚动条的底部时如何触发事件?

    我试图在滚动条到达末尾时触发一个事件 我找到了这个这个例子 http jsfiddle net ADukg 4831 这是我的代码 问题是它根本不调用 load more 控制台语句的值为 848 899 in scroll 881 899
  • 如何使 WPF 中的窗口对鼠标事件不可见?

    我创建了这个类 它非常适合使我的 WPF 应用程序对鼠标事件透明 using System Runtime InteropServices class Win32 public const int WS EX TRANSPARENT 0x0
  • 如何将IDL导入到Delphi中?

    我如何导入接口定义语言 idl 文件存入Delphi 将类型和接口转换为 pascal 文件 我试过了 File Open 它只显示 idl 文本文件的文本 Project 添加到项目 它只是 就像 添加了一个 idl文本文件到项目 成分
  • 当您使用 .html() 删除元素时,jQuery 中的事件侦听器是否会自动删除?

    在 jQuery 中如果我们使用 remove 如果要删除某些元素 则与该元素关联的所有绑定事件和 jQuery 数据都将被删除 但是如果我们用以下命令 删除 元素会发生什么 html 我们是否需要在更改任何 html 之前取消绑定所有元素
  • 从 onclick 属性调用 e.stopImmediatePropagation()

    如何从事件对象中获取事件对象onclick属性 我努力了 a href something html Click me a 另外 我也尝试过这个 a href something html Click me a 但控制台只显示 a 元素 我
  • 从不同的形式调用过程

    我正在使用 Lazarus 我有一个名为TForm1单元名称为 Unit 1 在这里我有一个名为mergeDATfile a shortint 这会产生一些东西 顺便说一句 我必须创建另一个名为TForm2里面有按钮 Button1 当它被
  • Firebird 或 NexusDB

    我知道有很多与 Delphi 数据库相关的问题 但我只考虑这两个数据库 我需要查询大约 100 000 条记录 根据您的经验 哪个更快 作为嵌入式 as C S Thanks 我还没用过 Nexus tbh 但我经常使用 Firebird
  • 指针^ 与 s[1]

    在读取数据的函数中 数据含义只字符串 从磁盘 我应该更喜欢哪个 哪个更好 A DiskStream Read Pointer s Count or B DiskStream Read s 1 Count Note 我知道两者都有相同的结果
  • 在 tlistbox 中绘制缩略图

    在 DelphiXE 中 我使用 tFileOpenDialog 选择一个文件夹 然后在 tListBox 中列出该文件夹中的所有 jpg 文件 我允许将列表项拖放到列表中进行自定义排序 以便稍后按顺序显示它们 我希望能够在文件名旁边绘制图
  • 使用 (Object as TClass) 和 TClass(Object) 进行强制转换有什么区别

    有问题在哪里MyObj classnameis TMyClass classname 是真的并且TMyClass MyObj 有效但是 MyObj as TMyclass doSomething抛出转换错误 我真的不需要任何关于这些垃圾的帮
  • WxWidgets自定义事件

    我正在尝试使用自定义事件 in my WxWidgetsC 应用程序 如所描述的here http wiki wxwidgets org Custom Events 22But I don 27t need a whole new even
  • 为什么不提高EInvalidPointer?

    德尔福文档状态 http docwiki embarcadero com Libraries en System SysUtils EInvalidPointer 切勿提出E无效指针直接异常 E无效指针由内存管理器内部引发 我正在编写一个自
  • SSL 错误 1409442E 使用 TIdHTTP 通过 HTTPS 下载文件 [重复]

    这个问题在这里已经有答案了 我正在使用德尔福10 3 3 下面的代码曾经有效 但现在尝试通过 HTTPS 下载文件时遇到错误 连接 SSL 错误错误 1409442E SSL 例程 SSL3 READ BYTES tlsv1 警报协议版本
  • 使用 Inno Setup 中格式化(部分粗体)的文本制作安装程序?

    有人看过 GOG com 游戏安装程序吗 如何制作像这样的欢迎文本字符串 包括单个标题中的路径和需要大小 其中部分内容加粗 以下是修改安装路径后如何更改字符串换行的示例 您可以使用TRichEditViewer http www jrsof
  • Delphi XE 和 OmniXML:使用 SelectNode()?

    我将以下 XML 片段作为一个更大的 XML 文件的一部分 我正在使用最新的 OmniXML 快照进行处理

随机推荐

  • 使用 java 创建快速/可靠的基准测试?

    我正在尝试使用 java 创建基准测试 目前我有以下简单的方法 public static long runTest int times long start System nanoTime String str str for int i
  • 线程环境中的 Clojure 全局变量行为

    鉴于这按我的预期工作 do println resolve a nil def a a println resolve a user a 我想了解为什么这不会 future println resolve b user b shouldn
  • 球互相弹开

    我正在编写这个脚本 其中画布中有 x 个弹跳球 在本例中为 20 个球 我的问题是 如何让它们在撞击时相互弹开 以及在撞击黄色矩形时弹开 var mycanvas document getElementById mycanvas var c
  • 使用 libav 转换 mp4-ts

    我正在尝试使用将 mp4 文件转换为 mpegtslibav 该代码可以工作 但输出的文件无法被任何播放器播放 这里是输入文件 http yt dash mse test commondatastorage googleapis com m
  • 单击按钮后克隆整个表单元素

    我有以下表格
  • 没有.net库的图像裁剪C#

    谁能建议如何裁剪图像 例如 jpeg 而不使用任何 NET 框架结构 仅使用原始字节 因为这是 Silverlight 中唯一 的方法 或者指向一个图书馆 我不关心渲染 我想在上传之前操作 jpg Silverlight 中没有可用的 GD
  • 无法链接到 XCode9 中的插座集合

    我有一些在动画期间随机播放的限制 升级到 XCode9 后 我尝试进行一些调整 编辑器似乎不再允许我向约束集合 IBOutlet 添加约束 我什至创建了一个新项目并尝试制作一个简单的插座系列 但遇到了同样的问题 这是我正在谈论的内容的简短视
  • 删除 PayPal Express Checkout 中的送货地址选项

    我用的是JSscript https developer paypal com docs integration direct express checkout integration jsv4 basic integration 贝宝推荐
  • Google 可以使用邮政信箱自动填写地址表单吗?

    我正在购物车中的结账表单上使用 地点 自动完成功能 参见示例 https developers google com maps documentation javascript examples places autocomplete ad
  • 在Python中使用队列进行线程处理

    我想在 python 中使用线程来下载大量网页 并浏览了以下在其中一个网站中使用队列的代码 它放置了一个无限的 while 循环 每个线程是否连续运行 直到所有线程都完成为止 我是不是错过了什么 usr bin env python imp
  • mongo集合中的数据碎片

    我在一个 mongo 集合中有很多更新 并假设此后文件系统上存在巨大碎片 我主要担心的是 集合将在文件系统上不断增长 而集合 中的数据却没有有价值的增长 您能否证实或反驳我的担忧 这取决于您要进行哪种更新 如果这些更新增加了您的文档 数组推
  • 对于同一 .NET 库的不同目标框架构建,程序集 GUID 属性是否应该有所不同?

    我正在用 C 开发一个 NET 库 它必须解决一系列广泛的目标框架 我想生成一个 nuget 包 它可以根据目标项目的设置正确安装 为了实现这一目标 我使用多个 csproj 文件 它们中的每一个都针对特定的目标框架 例如 MyLibrar
  • 程序集未加载 C#

    我有一个项目Common其中包含一个 log4net CustomAppender 我在所有其他项目中引用该项目并在中配置 log4net 附加程序app config 一切都很顺利 除了一个项目在尝试实例化 Appender 时失败了 输
  • 如何在java中更新文本文件的某些部分

    我希望能够更新文本文件中的某一行 但我收到错误 无法删除该文件 为什么会收到此错误 public class Main public static void main String args Main rlf new Main rlf re
  • Pandas GroupBy 和计算 Z 分数 [重复]

    这个问题在这里已经有答案了 所以我有一个如下所示的数据框 pd DataFrame 1 10 14 1 12 14 1 20 12 1 25 12 2 18 12 2 30 14 2 4 12 2 10 14 columns A B C A
  • 如何在 Pygame 中显示精灵?

    这只是一个关于 PyGame 中精灵的简单问题 我按照下面的代码加载了图像 我只是想知道如何在 PyGame 中显示精灵 例如绘制矩形或圆形 无论如何 我不想让它表现得如此 我想我用一个blit命令 但我不确定并且我在网上没有找到太多信息
  • 多线程环境登录并测试

    请让我知道您在以下场景中如何设计日志记录以及如何测试日志记录的建议 我有一个可以由多个线程调用的 API 单个线程对该 API 的一次调用会生成 50 KB 的日志 是否存在用于在多线程环境中进行日志记录的设计模式 IE所有线程使用一个日志
  • 如何在 Kotlin 中手动将字节分配给 long?

    我正在尝试做这样的事情Kotlin val top Long 1000000 1000000 1000000 1000000 1000000 1000000 1000000 In Java它看起来像这样 long TOP 1000000 1
  • lambda 函数比委托/匿名函数更快吗?

    我以为lambda functions delegates and anonymous functions具有相同的主体将具有相同的 速度 但是 运行以下简单的程序 static void Main string args List
  • 用于捕获 MSWord 文档事件的 IAdviseSink 设置

    这是我尝试设置的代码IAdviseSink在我的接口中实现的TForm1用于捕获新创建的 MSWord 文档的一些事件的类 代码运行时没有任何错误 但在保存文档或关闭文档时无法捕获任何事件 如何设置IAdviseSinkMSWord 文档正