实现自己的第一个插件

1、放置按钮

    公司在网站项目还没有完成时,就开会讨论了下一步每个人要做的工作,开会讨论的结果是准备让我写 Office 插件。昨天终于是把网站给发布了。我也开始准备着手来写 Office 插件,这项工作对我来说还是很有难度的。毕竟自己没有一点开发插件的经验。边学边做吧,写下这篇文章就当是个开发记录,要是哪天不记得具体的步骤还可以上来回忆一下,老手可以不用看了。
    废话不多说了,先给 word2003 中添加一个自己的按钮先。前提是你装了word 2003 和 Delphi 2009 (CodeGear RAD Studio)。

第一步:创建一个ActiveX 动态库
       File->New->Other...->ActiveX Library->OK
       此时 Delphi 会为你创建两个文件(其实不是两个了,但是我们打交道的就两个):Project1.dpr 和 Project1.ridl。 选中 Project1.dpr 按后保存,或者直接点击 Save Project As ...,此时delphi 弹出的第一个对话框是要你保存Project1.ridl这个文件的,我们用WordAddIn.ridl这个文件名来保存它后,它又会弹出第二个对话框并且名字已经有了为 WordAddIn_TLB.pas 我们直接保存。最后它才弹出保存 Project1.dproj 对话框,我们保存它为 MyWordAddInDll.dproj。注意了:这部分最好这样来操作,不然容易出错,问题多多,原因是delphi 2009 的Bug了。我再来简单的说一下这些文件名的作用,第一个文件名 WordAddIn 会在注册插件时用到,第二个文件名 MyWordAddInDll 是编译时产生Dll时的文件名(MyWordAddInDll.dll)。

第二步:创建一个自动化对象。
       File->New->Other...->Automation Object->OK
       此时会弹出一个窗口,在 coclassname 里面输入 AutoAddIn 这个文件名在注册插件时也会用到。点击OK后会生成 unit1.pas 用AddInMain.pas文件名来保存该文件。以后一段时间内编写代码的工作主要要在这个文件里面进行。

第三步:引入必要的类型库。
      
在这里要引入三个类型库Office_TLB.pas、Word_TLB.pas、AddInDesignerObjects_TLB.pas
       Component->Import Component...->Next->输入MSO.DLL查找选中->Next-> Next-> Finish。此时Office_TLB.pas已经创建好,注意用‘另存为’保存到自己的目录下面去。用同样的方法分别输入 MSWORD.OBL 和 MSADDNDR.DLL 就可以创建出 Word_TLB.pas 和 AddInDesignerObjects_TLB.pas 记住也都要另外保存它们到你的目录下面。

第四步:编写代码实现按钮添加。
       1、在Uses(interface下面的那个,不是 implementation下面的那个)添加 Office_TLB,Word_TLB,AddInDesignerObjects_TLB 三个单元的引用。
       2、修改 TAutoAddIn = class(TAutoObject, IAutoAddIn) 为 TAutoAddIn = class(TAutoObject, IAutoAddIn, IDTExtensibility2) 。
       3、在 Protected 部分 添加 Office 插件的5个函数。
  procedure OnConnection(const Application: IDispatch;ConnectMode: ext_ConnectMode; const AddInInst: IDispatch;var custom: PSafeArray); safecall;
  procedure OnDisconnection(RemoveMode: ext_DisconnectMode; var custom: PSafeArray); safecall;
  procedure OnAddInsUpdate(var custom: PSafeArray); safecall;
  procedure OnStartupComplete(var custom: PSafeArray);safecall;
  procedure OnBeginShutdown(var custom: PSafeArray); safecall;

       4、用鼠标点击一下这里的函数任何一个函数,再按 Ctrl+Shift+C 就可以快速完成类定义,添加方法的实现部分的代码框架到单元中。(点击这些函数是为了让光标在这些函数中,如果光标不在这些函数中按那些键是没有效果的。)
       5、添加 type 里面添加声明如下:
  //定义一个Word对象
  WordApp : WordApplication;
  //定义一个工具条对象
  MyWordBar : Commandbar;
  //定义一个按钮对象
  MyWordbtn1 : CommandBarButton;

       6、在 OnConnection 事件中添加如下代码:
procedure TAutoAddIn.OnConnection(const Application: IDispatch;
    ConnectMode: ext_ConnectMode; const AddInInst: IDispatch;
    var custom: PSafeArray);
var
    i : integer;
begin
    //实例一个Word对象
    WordApp := Application as WordApplication;
    MyWordBar := nil;

    //如果我们的工具条对象已经存在就是使用它
    for i := 1 to WordApp.CommandBars.Count do
        if WordApp.CommandBars.Item[i].Name = 'MyDelphiBar1' then
             MyWordBar := WordApp.CommandBars.Item[i];

    //如果我们的工具条对象不存在就创建它
    if (not Assigned(MyWordBar)) then
    begin
        MyWordBar := WordApp.CommandBars.Add('MyDelphiBar1', msoBarTop, 0, False );
        MyWordBar.Set_Protection(msoBarNoCustomize);
    end;

    //如果找到我们的按钮就使用,找不到就创建
    MyWordbtn1 := nil;
    MyWordbtn1 := MyWordBar.FindControl( msoControlButton, 1, 'MyDelphiBtn1', 1, 1 ) as CommandBarButton ;
    if (not Assigned(MyWordbtn1)) then
        MyWordbtn1 := MyWordBar.Controls.Add( msoControlButton, 1, 0, 1, False ) as commandbarbutton;

    //给按钮设置一些属性
    MyWordbtn1.Caption := '选择全部内容';
    MyWordbtn1.TooltipText := '点击可以选中全部内容';
    MyWordbtn1.Tag := 'MyDelphiBtn1';
    MyWordbtn1.Style := msoButtonCaption;
    MyWordbtn1.Width := 80;
    MyWordbtn1.Visible := true;
    MyWordBar.Visible := true;
end;
 
       7、编译代码:Project->Comlile all projects(省去该步骤也可以,直接执行第8个步骤它也会自动帮你编译)。
       8、注册组件:Run->Regiser ActiveX server。
       9、注册另外一些必要的键值(第8步已经为我们注册了一些)。开始->运行->输入regedit.exe->确定。展开目录到 HKEY_CURRENT_USER\Software\Microsoft\Office\Word\Addins 新建一个项:WordAddIn.AutoAddIn 然后再在这个新建项下面建立一个字符串值 数值名称是 FriendlyName 值自己来填,在这里我填的是 My first word button ,再建立一个DWORD 值,数值名称是 LoadBehavior 数值为3就可以了。

第五步:检查我们的Word按钮是否已经存在。
    现在打开Word看看吧,如果你的操作没有错误的话就应该可以在Word 2003 里面看到一个名为 '选择全部内容' 的按钮了。效果如下:



    到此为止 我们已经会给 word2003 添加按钮了。要是想知道如何给按钮添加事件你可以点击我的博客的该专题的另一篇文章:学习使用Delphi 2009 开发 Word 2003 插件 <二>