您现在的位置: > 首页 > 程序开发 > Delphi教程
>> 最新教程
>> 热门教程
>> 最新游戏资讯
>> 热门游戏资讯
用BDS 2006来开发基于Interop的Office程序
作者:本站                来自:安迪教程网                 加入时间:08-09-19                进入论坛讨论

  Borland公司从Delphi 8开始支持.NET的编程,也就为我们打开了用Delphi+Interop来编写Office程序的大门。

  笔者曾就用BCB 6/Delphi 7进行Office开发写过若干文章,目前都放置在本站点,可以用相关TAG进行搜索(连接在此)。在这几篇早期的文章中,我也明确表示我会将开发的方向转移到利用Interop来开发Office上,那么接下来的一些时间我将兑现我的承诺,我将用BDS 2006来开发基于Interop的Office程序。

  关于Interop的概念,我这里不再展开,有兴趣的读者可以自行参阅Microsoft的说明文档。在当前,我们只要知道它是我们可以用来在Dephi中开发.NET的Office程序的Assembly就可以了。

  一、准备工作

  一般而言,我们都会先安装Windows XP,然后安装Office,然后安装BDS。但是这样的安装将无法提供Office的PIA(Primary Interop Assembly),因此我们需要重新启动Office的安装程序,增加Office组件。

  在增加Office的组件时,一定要选择自定义安装,同时在接下来弹出的对话框中要选中“选择应用的高级定制”(大意如此),于是Office安装程序就会弹出有关Office各个组件的更详细的选项列表,从中我们展开任何一个Office基本组件的话,都可以看到类似如下的“.NET 可编程性支持”选项:

hp.agwcn.com

  这就是我们要与之大打交道的Office PIA。Office PIA安装在Windows安装目录之下的Assembly目录中,在资源管理器中浏览起来大概是这样的:

hp.agwcn.com

  我们可以清楚的看到Microsoft名下已经有了类似Microsoft.Office.Interop.Excel这样的PIA。

  二、在BDS 2006中引用PIA

  让我们启动BDS 2006(当然也可以只启动Delphi for .NET),并选择File|New,继续选择VCL Forms Application - Delphi for .NET。

hp.agwcn.com

  BDS会创建一个空白的窗体,一个空白的单元文件。在继续下一步之前,先保存这个工程。选择菜单中的View|Project Manager观察工程管理窗口,并在References结点处右击并选择Add Reference,在弹出的对话框中切换到COM Imports页,滚动到Microsoft Excel 11.0 Object Library处:

hp.agwcn.com

  选择Add Reference并继续选择OK关闭对话框。在References结点下就会出现如下的新的引用:

hp.agwcn.com

  参照上面的过程,继续添加对Microsoft Visual Basic for Aplication Extensibility和OLE Automation (2.0)的引用。编译这个工程,应该是没有错误了。

  我们来看看如何简单的启动Excel应用并退出Excel应用。打开单元文件,在头部的uses段落加入Microsoft.Office.Interop.Excel。随意在窗体上放置一个按钮,并书写它的事件处理函数如下:

procedure TForm1.Button1Click(Sender: TObject);
var e: Microsoft.Office.Interop.Excel.ApplicationClass;
begin
e:=Microsoft.Office.Interop.Excel.ApplicationClass.Create;
e.Visible:=true;
e.Caption:='在BDS 2006中调用Excel';
end;

  编译运行,Excel可以成功的被调用并显示:

hp.agwcn.com

  当然,现在的Excel应用中没有任何实质性的东西。而这个DEMO也只是先展示一下框架而已。

  如果我们终止程序的运行,可以看到Excel也会结束运行,如果此时我们打开任务管理器并观察进程列表,可以发现并没有Excel进程。这说明Excel进程“完整”的退出了。

  如果我们再次回到我们保存工程的目录,可以看到除了常规的pas、nfm、bdsproj、exe、res文件之外,又多了三个dcpil文件,它们分别是Microsoft.Office.Interop.Excel.dcpil,Microsoft.Vbe.Interop.dcpil和stdole.dcpil,分别对应了我们在工程中引用的三个COM类型库。

  在BDS中,不仅有Delphi .NET,也有C#。我不知道对于原先BCB的忠实拥趸者来说,是更愿意转移到Delphi还是更愿意转移到C#,或者更愿意选择等待C++Builder .NET的出现?为了不偏不倚,我们下面给出C#的代码,同样在BDS 2006环境中调试完成:

  public class WinForm : System.Windows.Forms.Form
// 本文转自 C++Builder研究 - http://www.ccrun.com/article.asp?i=1046&d=b2l731
{
///
/// Required designer variable.
///
private System.ComponentModel.Container components = null;
private System.Windows.Forms.Button button1;
private Microsoft.Office.Interop.Excel.Application EA;
public WinForm()
{
//
// Required for Windows Form Designer support
//
InitializeComponent();
  //
// TODO: Add any constructor code after InitializeComponent call
//
}
  ///
/// Clean up any resources being used.
///
protected override void Dispose(bool disposing)
{
if (disposing)
{
if (components != null)
{
components.Dispose();
}
}
base.Dispose(disposing);
}
  #region Windows Form Designer generated code
///
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
///
private void InitializeComponent()
{
this.button1 = new System.Windows.Forms.Button();
this.SuspendLayout();
//
// button1
//
this.button1.Location = new System.Drawing.Point(16, 264);
this.button1.Name = "button1";
this.button1.TabIndex = 0;
this.button1.Text = "button1";
this.button1.Click += new System.EventHandler(this.button1_Click);
//
// WinForm
//
this.AutoScaleBaseSize = new System.Drawing.Size(6, 14);
this.ClientSize = new System.Drawing.Size(464, 310);
this.Controls.Add(this.button1);
this.Name = "WinForm";
this.Text = "WinForm";
this.ResumeLayout(false);
}
#endregion
  ///
/// The main entry point for the application.
///
[STAThread]
static void Main()
{
System.Windows.Forms.Application.Run(new WinForm());
}
  private void button1_Click(object sender, System.EventArgs e)
{
button1.Text="Clicked";
object m=Type.Missing;
EA=new Microsoft.Office.Interop.Excel.Application();
  EA.Visible=true;
EA.Caption="Invoke Excel from C#";
  }
}

  之所以把这一长串代码都贴出来,是因为有一个特别的地方需要指出,也就是上面代码段中的System.Windows.Forms.Application.Run(new WinForm());。由于Excel命名空间也有一个Application(也就是Excel Application),所以我们只能在显示主窗体的时候用上完整的名称空间,否则编译无法通过。但是如果你的BDS打过了UPDATE 1的补丁,那么这个问题就不再存在。

  从代码的比较我们也可以看出,C#和Delphi .NET在通过Interop操作Office时,过程、代码都惊人的相似。这给我们也带来了巨大的好处。

  在以后的文章中,我会先从Excel开始详细讨论一些具体的操作,然后是Word,Outlook,最后是一些其他的程序。之所以这样考虑,是因为Microsoft本身对Interop操作的说明也集中在Excel/Work/Outlook上。我只是想保持我的文章与MSDN文档的一致性而已。

联系方式:QQ:6084884 email:agwcn@126.com 粤ICP备05055782号
本网站中发布的文章只代表发表人的个人观点,不代表安迪教程网网站的立场
copyright© 2000-2004 安迪教程网 All rights reserved agwcn.com