一、ActiveX應用情況簡介:
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++)里也能夠使用到這些控件啦!
但是,在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提供了一個類型庫編輯器,用於觀察或修改類型庫,可以使用它來增加、修改、刪除類型庫的各種元素。類型庫的界面上可以看到,左邊是一個樹形結構,各種元素的成員作為子節點出現;右邊是根據左邊所選中的元素類型顯示不同的頁簽,可以對該元素的一些屬性進行編輯。
3、屬性、方法和事件
VCL構件的屬性、方法和事件自然就變成為ActiveX控件的屬性、方法和事件。控件的屬性,例如顏色、標簽等;控件的方法是請求控件執行某些動作;事件則是控件給宿主程序的一個通知,發生了一些事情。
4、屬性頁
ActiveX控件所帶的屬性頁可以讓控件的使用者查看和修改控件的屬性。您可以把幾個屬性捆綁在一個屬性頁上,也可以只為一個屬性提供一個屬性頁。
三、快速開發ActiveX控件
下面就讓我們來使用Delphi具體做一個ActiveX控件。
假設我們現在面臨的問題是,在使用Visual C++(VC)開發一個應用的時候,需要使用一個Grid控件來處理界面的事情,而使用VC所提供的FlexGrid控件又很麻煩,發現Delphi里的 TStringGrid構件非常合適。但是TStringGrid是Delphi里的VCL構件,又不能直接被VC使用,怎么辦呢?不用愁,我們只要把 TStringGrid包裝成為VC可以使用的ActiveX控件就可以解決這個問題了。
Delphi為ActiveX控件的開發提供了兩個向導:
1>、ActiveX控件向導可以讓你把一個VCL構件包裝成為一個ActiveX控件。下面將會使用到這個向導。
2>、ActiveForm向導則可以把幾個VCL構件包裝成為一個ActiveX控件或者開發一個完整的ActiveX應用。
四、開發實例:
在Delphi當中把TStringGrid包裝成一個ActiveX控件的主要步驟:
1、 點擊【File】—>【New】—>【Other】菜單項,打開【New Items】,選擇【ActiveX】;
2、 選擇【ActiveX Library】選項卡,點擊ok,創建工程。
3、 點擊【File】—>【New】—>【Other】菜單項,打開【New Items】,選擇【ActiveX】;
4、 選擇【ActiveX Control】選項卡,點擊ok,打開【ActiveX Control Wizard】窗口;
5、 在【VCL Class Name】組合框中選擇‘VCL’類(如TStringGrid),單擊Ok;
6、 添加代碼;
7、 運行程序,生成ocx文件。
8、在Delphi中單擊【Component】—>【Import ActiveX Control】菜單項,打開【Import ActiveX】窗口,在窗口中點擊【Add】,然后選擇ocx文件,然后單擊Install按鈕安裝組件。如果成功,在ActiveX組件頁中將顯示該組件。
1、首先,要啟動ActiveX控件向導,創建ActiveX項目
首先,要啟動ActiveX控件向導,選擇File菜單里的New命令,在彈出的對話框里選擇ActiveX頁簽,然后雙擊ActiveX Control圖標即可。向導中的第一個域要求選擇一個要進行包裝的VCL構件,點擊選擇TStringGrid。其他幾個域取缺省值即可,如果需要包含版本信息等其他信息,也可以選上。點擊OK按鈕,向導將生成一個Delphi的ActiveX控件開發項目 StringGridXControl1,包括以下幾個的文件:
1. 一個ActiveX項目文件(dpr后綴名),包含了啟動、初始化一個ActiveX控件所需要的代碼。通常是不需要修改這個文件的。
2. 一個類型庫文件(tlb后綴名),定義和實現了ActiveX控件向外所提供的接口、屬性、方法和事件。Delphi專門為這個文件提供 了一個Pascal版本的文件(tlb擴展名),而且自動維護這兩個文件的一致性。
3. 一個ActiveX實現的文件(Pas擴展名),使用了Delphi ActiveX框架(DAX)定義和實現了這個ActiveX控件,具體實現類型庫里定義的接口。這個文件是我們經常需要修改的。DAX是Delphi對ActiveX控件的COM規約的實現方式。
4. 如果選擇了包括一個“關於”對話框的話,還有一個對應的對話框實現文件。
Delphi的ActiveX控件向導根據所包裝的VCL構件的屬性、方法和事件生成了ActiveX控件相應的屬性、方法和事件。但是它沒有把 VCL構件使用非OLE類型(如集合、數組等)的屬性、方法和事件轉換過去。例如,TStringGrid的Options屬性是集合類型的, RowHeights是數組類型的,在控件向導所生成的屬性中就沒有這些屬性。但是有時候偏偏這些屬性、方法和事件是很重要的,這時就需要手工添加一些屬性、方法和事件!
2、在ActiveX控件中添加一個屬性和實現的方法:
現在為這個ActiveX控件添加一個BRowSelect屬性,這個屬性本來是TStringGrid的Options屬性的子屬性,控制Grid是否處於行選中狀態。在StringGridXControl1項目里打開ActiveX實現文件StringGridImp1.pas,選擇【Edit】菜單里的【Add To Interface】命令(注意:只有打開了實現文件,這個命令才能使用),Delphi將彈出增加接口對話框。在對話框里的Interface項選擇Properties/Methods-IStringGridX,然后在Declaration里寫入BRowSelect屬性的聲明(如果你選中了對話框里的Syntax Helper選項,Delphi將隨時提示你應該輸入的內容):Property BRowSelect:WordBool;點擊OK后,這個屬性的相關信息將自動加入到控件的實現文件、類型庫文件和對應的Pascal文件中。因為控件的接口是雙向的,所以在Pascal文件里使用了讀和寫兩個方法來實現控件的屬性。
1>、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;
這時候這兩個方法的實現體是空的,必須得自己填入具體實現的代碼:
2>、在實現文件中編寫代碼
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;
3、生成ActiveX控件(OCX控件)
這時候,使用類型庫編輯器來查看類型庫,可以看到新增加的BRowSelect屬性。好了,做好了前面這些工作以后,選擇Project菜單的Build StringGridXControl1命令即可生成我們所需要的ActiveX控件。在項目的目錄下,我們可以找到 StringGridXControl1.ocx這個文件,這個就是我們的ActiveX控件啦!
4、把ActiveX控件(OCX控件)注冊到系統中
1>、在Delphi中單擊【Component】—>【Import ActiveX Control】菜單項,打開【Import ActiveX】窗口,在窗口中點擊【Add】,然后選擇ocx文件,然后單擊Install按鈕安裝組件。如果成功,在ActiveX組件頁中將顯示該組件。
2>、 把它拷貝到Windows 9x的System目錄或者Windows NT/2000的System32目錄里面。在DOS命令行狀態中,運行命令:regsvr32.exe c:\winnt\system32\alasunsmscon.ocx (regsvr32 StringGridXControl1.ocx)在系統中注冊這個StringGridX控件。
3>、在Delphi中,打開創建該ActiveX控件的工程(*.dpr)文件,然后選擇Run->Register ActiveX Server.
注意,以上第2種方法和第3種方法操作只是向Windows消息系統注冊了該ActiveX控件,但是並沒有將其添加到Delphi的VCL庫中。還無法在其它程序中調用。我們還需要進行第1中方法中的操作。如果已經注冊完畢就可以在Import ActiveX中查找,如果沒有就需要點擊【Add】充文件的路徑添加。
五、小結
類似的我們還可以往ActiveX控件里加入更多的屬性。還可以往ActiveX控件加入新的方法、事件,加入的方法與加入屬性類似。而且加入以后,Delphi也會自動往相應的文件中加入對應方法和事件的聲明和實現,具體的實現體還得自己編寫,這里不再多說。
我們可以注意到,Delphi自動生成了把VCL構件包裝成ActiveX控件所需的包裝代碼。我們為ActiveX控件增加新的屬性、方法和事件的時候,只需要在接口方法的實現里把ActiveX控件的數據與VCL構件的數據聯系起來,或者使用VCL構件的方法來完成ActiveX控件的行為,而基本上不需要關心編寫一個ActiveX控件的具體細節,例如COM規約等。
前面提到,還可以為ActiveX控件添加定制的屬性頁。這里不必專門添加新的屬性頁,因為大多數支持ActiveX的IDE編程環境已經為每個ActiveX控件提供了一個包含所有屬性的屬性頁了,我們使用這個屬性頁即可。
由於有了Delphi對開發ActiveX控件強有力的支持,我們基本不費什么功夫就很快得到了一個新的ActiveX控件。Delphi讓使用它來開發ActiveX控件的開發人員把注意力集中到了作為ActiveX控件基礎的VCL構件上,而不必過多地關心ActiveX控件的細節,所以讓對 ActiveX技術不是太熟悉的開發者也能夠享受到開發ActiveX控件的樂趣,而且也大大豐富了在VC、VB里開發能夠利用的控件。
http://blog.csdn.net/zang141588761/article/details/51248269