程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Delphi >> 用BDS 2006來開發基於Interop的Office程序

用BDS 2006來開發基於Interop的Office程序

編輯:Delphi

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 可編程性支持”選項:

用BDS 2006來開發基於Interop的Office程序

  這就是我們要與之大打交道的Office PIA。Office PIA安裝在Windows安裝目錄之下的Assembly目錄中,在資源管理器中浏覽起來大概是這樣的:

用BDS 2006來開發基於Interop的Office程序


 

 我們可以清楚的看到Microsoft名下已經有了類似Microsoft.Office.Interop.Excel這樣的PIA。

  二、在BDS 2006中引用PIA

  讓我們啟動BDS 2006(當然也可以只啟動Delphi for .NET),並選擇File|New,繼續選擇VCL Forms Application - Delphi for .Net。

用BDS 2006來開發基於Interop的Office程序

  BDS會創建一個空白的窗體,一個空白的單元文件。在繼續下一步之前,先保存這個工程。選擇菜單中的VIEw|Project Manager觀察工程管理窗口,並在References結點處右擊並選擇Add Reference,在彈出的對話框中切換到COM Imports頁,滾動到Microsoft Excel 11.0 Object Library處:

用BDS 2006來開發基於Interop的Office程序

  選擇Add Reference並繼續選擇OK關閉對話框。在References結點下就會出現如下的新的引用:

用BDS 2006來開發基於Interop的Office程序

  參照上面的過程,繼續添加對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可以成功的被調用並顯示:


 

用BDS 2006來開發基於Interop的Office程序

  當然,現在的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文檔的一致性而已。


 

 

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved