用DELPHI開發OCX(轉)

ActiveX控件也就是一般所說的OCX控件,它是ActiveX技術的一部分。ActiveX是微軟公司推出的基於組件對象模型COM的技術,包括對Windows 32位應用編程接口(Win32 API)和組件對象模型的一系列擴充和增強,目標是把計算機桌面環境與因特網環境集成起來,同時保護在Windows技術中現有的開發投資。微軟的ActiveX技術根本上就是修改過的OCX技術,使它能夠跨越Internet,主要是使用WWW來傳遞控件。

  ActiveX控件可以被集成到很多支持ActiveX的應用當中去,或者直接用來擴展應用的功能,這些支持ActiveX的應用包括C++ Builder、Delphi、Visual dBASE、 Visual Basic、Visual C++、Internet Explorer、Netscape Navigator等。ActiveX控件還可以使用在因特網上,在網頁上使用它來發布信息、處理與用戶的交互,但是需要使用支持ActiveX的瀏覽器才能閱讀這些網頁。目前已經開發出來的ActiveX控件越來越多,由於ActiveX控件具有很好的特性,我們可以在編程的時候選擇使用合適的控件來加快自己的應用開發。可以不誇張地說,ActiveX控件是Windows平臺編程必不可少的法寶。

  使用ActiveX控件是相對比較簡單的。但是,開發ActiveX控件並不是一件簡單的事情,必須要熟悉而不只是瞭解ActiveX技術才能開發出好的ActiveX控件。而COM、OLE等ActiveX技術對於一般的程序員來說,是比較複雜難懂的。所以,ActiveX控件的開發者一般都是“老鳥”級別的程序員。

  但是如果您有了Inprise公司的Borland Delphi,那又另當別論了。Delphi作爲Windows平臺上最優秀的程序開發工具之一,爲ActiveX控件的開發提供了強有力的支持,讓您輕鬆地開發ActiveX控件。Delphi的開發者僅僅需要了解一些ActiveX控件的簡單知識,就可以使用Delphi提供的工具來快速開發自己的ActiveX控件。本文詳細介紹了利用Delphi所提供的工具來快速開發ActiveX控件的技巧。

  一、ActiveX控件

  要開發ActiveX控件,我們先得簡單瞭解一下ActiveX控件的一些相關知識。在Delphi中,一個ActiveX控件由如下幾個部分組成:VCL(可視化構件庫)控件、屬性、方法、事件,以及一個或者多個相關的類型庫,其中每個部分都有各自的作用。現在對每個部分介紹如下:

  1、VCL構件

  在Delphi中,一個ActiveX控件是由一個或者多個VCL構件經過包裝以後得到的。所以,要使用Delphi來開發ActiveX控件,必須先得開發出或者選擇要進行包裝的VCL構件。也正是由於這個原因,我們可以將Delphi裏大量優秀的VCL構件包裝成ActiveX控件,從而可以在別的不能夠直接使用VCL構件的開發工具(如Visual Basic、Visual C++)裏也能夠使用到這些控件啦!

  圖1

  但是,在Delphi裏可以用來做ActiveX控件的VCL構件必須是TWinControl的後代。如果想用一個TGraphiControl的子類做ActiveX控件,在大多數情況下只需要把它的基類變爲TCustomControl即可。有的VCL構件是被註冊成非ActiveX控件的,例如EditControl,這些控件也不能做ActiveX控件。

  2、類型庫

  類型庫包含了控件的類型定義信息,提供了比接口更多的詳細信息,是控件向它的宿主程序提供服務信息的一種途徑。類型庫的目的是爲其他應用和編程工具提供關於它包含的構件對象的信息。開發ActiveX控件時,Delphi把類型庫信息存入一個.TLB文件中及一個對應的Pascal文件(.TLB文件的Pascal語言版本),編譯時類型庫將作爲資源鏈入DLL或者EXE中。

  類型庫的元素包括:(1)類型庫信息:包括類型庫的總體信息和特徵、當前類型庫引用的其他類型庫;(2)構件類:代表整個ActiveX控件,包含了提供給客戶應用的接口;(3)接口屬性和方法、事件;(4)枚舉類型:一種用作數據類型的相關常量,可以用在類型庫的其他地方定義屬性和方法。

  Delphi提供了一個類型庫編輯器,用於觀察或修改類型庫,見圖1,可以使用它來增加、修改、刪除類型庫的各種元素。從圖1類型庫的界面上可以看到,左邊是一個樹形結構,各種元素的成員作爲子節點出現;右邊是根據左邊所選中的元素類型顯示不同的頁籤,可以對該元素的一些屬性進行編輯。

  3、屬性、方法和事件

  VCL構件的屬性、方法和事件自然就變成爲ActiveX控件的屬性、方法和事件。控件的屬性,例如顏色、標籤等;控件的方法是請求控件執行某些動作;事件則是控件給宿主程序的一個通知,發生了一些事情。

  4、屬性頁

  ActiveX控件所帶的屬性頁可以讓控件的使用者查看和修改控件的屬性。您可以把幾個屬性捆綁在一個屬性頁上,也可以只爲一個屬性提供一個屬性頁。

  二、快速開發ActiveX控件

  下面就讓我們來使用Delphi具體做一個ActiveX控件。

  圖2

  假設我們現在面臨的問題是,在使用Visual C++(VC)開發一個應用的時候,需要使用一個Grid控件來處理界面的事情,而使用VC所提供的FlexGrid控件又很麻煩,發現Delphi裏的TStringGrid構件非常合適。但是TStringGrid是Delphi裏的VCL構件,又不能直接被VC使用,怎麼辦呢?不用愁,我們只要把TStringGrid包裝成爲VC可以使用的ActiveX控件就可以解決這個問題了。

  Delphi爲ActiveX控件的開發提供了兩個嚮導:

  * ActiveX控件嚮導可以讓你把一個VCL構件包裝成爲一個ActiveX控件。下面將會使用到這個嚮導。

  * ActiveForm嚮導則可以把幾個VCL構件包裝成爲一個ActiveX控件或者開發一個完整的ActiveX應用。

  在Delphi當中把TStringGrid包裝成一個ActiveX控件的過程如下:

  首先,要啓動ActiveX控件嚮導,選擇File菜單裏的New命令,在彈出的對話框裏選擇ActiveX頁籤,然後雙擊ActiveX Control圖標即可,如圖2所示。嚮導中的第一個域要求選擇一個要進行包裝的VCL構件,點擊選擇TStringGrid。其他幾個域取缺省值即可,如果需要包含版本信息等其他信息,也可以選上。點擊OK按鈕,嚮導將生成一個Delphi的ActiveX控件開發項目StringGridXControl1,包括以下幾個的文件:

  1. 一個ActiveX項目文件,包含了啓動、初始化一個ActiveX控件所需要的代碼。通常是不需要修改這個文件的。

  2. 一個類型庫文件(TLB擴展名),定義和實現了ActiveX控件向外所提供的接口、屬性、方法和事件。Delphi專門爲這個文件提供了一個Pascal版本的文件,而且自動維護這兩個文件的一致性。

  3. 一個ActiveX實現的文件,使用了Delphi ActiveX框架(DAX)定義和實現了這個ActiveX控件,具體實現類型庫裏定義的接口。這個文件是我們經常需要修改的。DAX是Delphi對ActiveX控件的COM規約的實現方式。

  4. 如果選擇了包括一個“關於”對話框的話,還有一個對應的對話框實現文件。

  Delphi的ActiveX控件嚮導根據所包裝的VCL構件的屬性、方法和事件生成了ActiveX控件相應的屬性、方法和事件。但是它沒有把VCL構件使用非OLE類型(如集合、數組等)的屬性、方法和事件轉換過去。例如,TStringGrid的Options屬性是集合類型的,RowHeights是數組類型的,在控件嚮導所生成的屬性中就沒有這些屬性。但是有時候偏偏這些屬性、方法和事件是很重要的,這時就需要手工添加一些屬性、方法和事件!

  現在爲這個ActiveX控件添加一個BRowSelect屬性,這個屬性本來是TStringGrid的Options屬性的子屬性,控制Grid是否處於行選中狀態。在StringGridXControl1項目裏打開ActiveX實現文件StringGridImp1.pas,選擇Edit菜單裏的Add To Interface命令(注意:只有打開了實現文件,這個命令才能使用),Delphi將彈出增加接口對話框,如圖3所示。在對話框裏的Interface項選擇Properties/Methods-IStringGridX,然後在Declaration裏寫入BRowSelect屬性的聲明(如果你選中了對話框裏的Syntax Helper選項,Delphi將隨時提示你應該輸入的內容):

  圖3

  Property BRowSelect:WordBool;

  點擊OK後,這個屬性的相關信息將自動加入到控件的實現文件、類型庫文件和對應的Pascal文件中。因爲控件的接口是雙向的,所以在Pascal文件裏使用了讀和寫兩個方法來實現控件的屬性。

  Delphi自動在類型庫里加入了以下聲明:

  property BRowSelect: WordBool read Get_BRowSelect write Set_BRowSelect;

  這說明了:對於BRowSelect這個屬性,有一個讀方法Get_BRowSelect,一個寫方法Set_BRowSelect。

  Delphi自動在控件的實現文件里加入了對BRowSelect屬性的讀和寫訪問方法的聲明和實現:

  function Get_BRowSelect: WordBool; safecall;

  procedure Set_BRowSelect(Value: WordBool); safecall;

  這時候這兩個方法的實現體是空的,必須得自己填入具體實現的代碼:

  function TStringGridX.Get_BRowSelect: WordBool;

  begin

   //以下代碼由自己根據需要編寫

   //獲得現在是否處於行選中狀態

   with FDelphiControl do

   Result:=goRowSelect in Options ;

  end;

  

  procedure TStringGridX.Set_BRowSelect(Value: WordBool);

  begin

   //以下代碼由自己根據需要編寫

   //設置行選中狀態

   with FDelphiControl do

   begin

   if Value then Options:=Options+[goRowSelect]

   else Options:=Options-[goRowSelect];

   end;

  end;

  這時候,使用類型庫編輯器來查看類型庫,可以看到新增加的BRowSelect屬性。類似的,我們還可以往ActiveX控件里加入更多的屬性。

  還可以往ActiveX控件加入新的方法、事件,加入的方法與加入屬性類似。而且加入以後,Delphi也會自動往相應的文件中加入對應方法和事件的聲明和實現,具體的實現體還得自己編寫,這裏不再多說。

  我們可以注意到,Delphi自動生成了把VCL構件包裝成ActiveX控件所需的包裝代碼。我們爲ActiveX控件增加新的屬性、方法和事件的時候,只需要在接口方法的實現裏把ActiveX控件的數據與VCL構件的數據聯繫起來,或者使用VCL構件的方法來完成ActiveX控件的行爲,而基本上不需要關心編寫一個ActiveX控件的具體細節,例如COM規約等。

  前面提到,還可以爲ActiveX控件添加定製的屬性頁。這裏不必專門添加新的屬性頁,因爲大多數支持ActiveX的IDE編程環境已經缺省爲每個ActiveX控件提供了一個包含所有屬性的屬性頁了,我們使用這個缺省的屬性頁即可。

  好了,做好了前面這些工作以後,選擇Project菜單的Build StringGridXControl1命令即可生成我們所需要的ActiveX控件。在項目的目錄下,我們可以找到StringGridXControl1.ocx這個文件,這個就是我們的ActiveX控件啦!把它拷貝到Windows 9x的System目錄或者Windows NT/2000的System32目錄裏面,然後使用命令regsvr32 StringGridXControl1.ocx在系統中註冊這個StringGridX控件,就可以在VC編程中使用了。

  三、小結

  由於有了Delphi對開發ActiveX控件強有力的支持,我們基本不費什麼功夫就很快得到了一個新的ActiveX控件。Delphi讓使用它來開發ActiveX控件的開發人員把注意力集中到了作爲ActiveX控件基礎的VCL構件上,而不必過多地關心ActiveX控件的細節,所以讓對ActiveX技術不是太熟悉的開發者也能夠享受到開發ActiveX控件的樂趣,而且也大大豐富了在VC、VB裏開發能夠利用的控件。

分類: Delphi OCX
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章