注册Office插件
同其他COM对象一样,一个Office插件必须在系统中注册后才能使用。在Delphi中选择Run | Register ActiveX Server菜单命令,就可以注册
我们刚才创建的插件。除了标准的COM注册,还需要进行Office 相关的注册,这需要在注册表中创建一个新的键值:
HKEY_CURRENT_USER\Software\Microsoft\Office\
<AppName>\Addins\<AddInProgID>
<AppName>就是插件宿主应用程序的名字(这里是Word),<AddInProgID>是自动化对象的名字(这里是DIWordAddIn.AddIn,ActiveX library和类名的组合)。
HKEY_CURRENT_USER \ Software \ Microsoft \ Office \ Word \ Addins\DIWord AddIn.AddIn
我们还需要在这个键值下创建几个值:一个DWORD类型的名为LoadBehavior的值决定插件是如何加载及被应用程序调用的。在本文中
我们设定它为3–相当于1和2的结合就是应用程序连接插件并在启动时自动加载。值的意义列在表1.2中,各种值可以相互组合。
表1.2
值
意 义
$0
断开,不加载
$1
连接,加载
$2
自动启动加载
$8
只有当用户请求时才加载
$16
只在下次程序启动时加载一次
还有一些其他的值可以出现在注册表键值下,比如定义出现在应用程序COM管理器对话框中的名字,以及设定是否可以从命令行激活插件。
Office 2000用户界面
Office应用程序共享一组通用的用户界面元素对象、菜单条、工具条通用控件(比如工具条按钮和组合编辑框)以及Office小助手。
此前引入的Word类型库就包括了这些通用对象的类型库,但是Delphi引入时并没有像通常那样建立一个封装好的OLE Server,
我们不得不手工创建一个Office公开的CommandBarButton对象的Delphi封装。这个对象对应于Office应用程序的一个简单的菜单项或工具条按钮。
对大多数的Microsoft的应用程序来说,Application对象代表对象模型的切入点。Office Application类提供了对CommandBars属性的引用。CommandBar对象包括工具条、浮动工具条和菜单。Office对象模型允许
我们创建或更新已有的CommandBars对象。Office_TLB.pas单元包含了ICommandBar接口,它可以被用来修改CommandBar对象。
CommandBar有一个Controls集合属性,对应于一组CommandBarControl控件。CommandBarControl控件对应于放置在工具条上的控件,比如一个CommandBarButton对应一个简单的工具条按钮(或菜单项),CommandBarCombo控件对应组合编辑框,CommandBarPopup对应于下拉菜单和CommandBarActiveX对应于ActiveX控制。
在Office_TLB.pas单元中,除了ICommandBarButton接口,还有一个ICommandBarButtonEvents接口用来提供对工具条上控件的事件支持。事件的支持通常是通过连接点、事件接收连接到可连接对象来实现。但这比较麻烦,
我们还可以通过更简单的办法来实现事件支持。检查一下Delphi在word_tlb.pas单元创建的TWordApplication的实现代码可以发现Delphi封装了每一个可连接对象,自动实现了事件接收机制。这个单元可以作为一个范本用来创建自定义的对接口对象的封装。
BtnSvr.pas单元包含了一个手工创建的Delphi封装。除了按标准的Delphi属性方式实现了CommandBarButton对象的属性外,还实现了InitServerData、InvokeEvent、Connect、ConnectTo和Disconnect方法。可以注意到这部分完全是模仿TWordApplication实现部分编写的CommandBarButton事件实现。主要就是在InitServerData方法中定义服务器数据。根据Office_TLB.pas中不同的接口GUID,定义一个CommandBarButton接口的内部的接口Fintf,设定InvokeEvent方法来激活基于定义在事件接口部分的DispID的Delphi事件支持。最后,Connect、ConnectTo和Disconnect方法设定Fintf给需要的接口并接收相应的事件。
定义在BtnSvr.pas单元中的Delphi封装类命名为TButtonServer。它需要从TOleServer对象继承以便支持事件处理。
同应用程序连接
有了工具条按钮封装类后,接下来要声明一个TWordApplication域来保存对Word Application对象的引用。此外还需要为新的工具条定义一个接口指针以及两个域使用新的TButtonServer类来保存
我们要创建的新的工具条按钮和菜单项。
在插件类的private部分添加:
FWordApp : TWordApplication;
DICommandBar : CommandBar;
DIBtn : TButtonServer;
DIMenu : TButtonServer;
在OnConnection方法中,保存应用程序指针:
var
WA : Word_TLB._Application;
begin
FWordApp := TWordApplication.Create(nil);
WA := Application as Word_TLB._Application;
WordApp.ConnectTo(WA);
…………………………..