在OnStartupComplete方法中,添加下面的代码来获得工具菜单的接口指针,查找自定义的的菜单项,如果没有就创建新的,然后设定它的OnClick事件:
ToolsBar := WordApp.CommandBars[Tools];
MenuIntf := ToolsBar.FindControl(EmptyParam, EmptyParam,
DIMenu, EmptyParam, EmptyParam);
if (not Assigned(MenuIntf)) then
MenuIntf := ToolsBar.Controls.Add(msoControlButton,
EmptyParam, EmptyParam, EmptyParam, EmptyParam);
DIMenu := TButtonServer.Create(nil);
DIMenu.ConnectTo(MenuIntf as _CommandBarButton);
DIMenu.Caption := Delp&hi Menu;
DIMenu.ShortcutText := ;
图1.34
DIMenu.Tag := DIMenu;
DIMenu.Visible := True;
DIMenu.OnClick := MenuClick;
CommandBar接口的FindControl方法使用唯一的标识来查找菜单项,如果找到了控件就赋值给 MenuIntf,如果没有找到就创建一个新的菜单项。图1.34显示了自定义的工具条。
清理资源
注意应该在OnBeginShutdown 方法中清理用户界面元素:
if (Assigned(DIBtn)) then
begin
DIBtn.Free;
DIBtn := nil;
end;
if (Assigned(DIMenu)) then
begin
DIMenu.Free;
DIMenu := nil;
end;
if (Assigned(DICommandBar)) then begin
DICommandBar.Delete;
DICommandBar := nil;
end;
因为插件的框架是通用的,
我们可以将同样的OLE Server DLL用于多个应用程序,方法就是确定将激活插件的应用程序,并使用合适的对象模型。最简单的判断方法是在OnConnection中把应用程序的IDispatch的接口指针赋值给一个OleVariant变量,然后使用相应的Name 属性来确定相应的程序:
var
AppVar : OleVariant;
begin
AppVar := Application;
if (AppVar.Name = Outlook) then
begin
...
end
else if (AppVar.Name = Microsoft Word) then
begin
...
end else ...
最后,要想获得关于Office开发和Office 2000插件创建更详细的资料,可以查阅microsoft.public.officedev新闻组上的信息。