分類: Delphi COM編程技術 2011-09-26 14:13 402人閱讀 評論(0) 收藏 舉報 程序員
delphipascalwindowsimportinternet編程編程
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控件的一些相關知識。在Delphi中,一個ActiveX控件由以下幾個部分組成: VCL(可視化構件庫)控件、屬性、方法、事件,以及一個或者多個相關的類型庫,其中每一個部分都有各自的做用。ui
如今對每一個部分介紹以下:
一、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控件。
二、類型庫
類型庫包含了控件的類型定義信息,提供了比接口更多的詳細信息,是控件向它的宿主程序提供服務信息的一種途徑。類型庫的目的是爲其餘應用編程工具提供關於它包含的構件對象的信息。開發ActiveX控件時,Delphi把類型庫信息存入一個.TLB文件中及一個對應的Pascal文件(.TLB文件的Pascal語言版本),編譯時類型庫將做爲資源鏈入DLL或者EXE等中。
類型庫的元素包括:
(1)類型庫信息:包括類型庫的整體信息和特徵、當前類型庫引用的其餘類型庫;
(2)構件類:表明整個ActiveX控件,包含了提供給客戶應用的接口;
(3)接口屬性和方法、事件;
(4)枚舉類型:一種用做數據類型的相關常量,能夠用在類型庫的其餘地方定義屬性和方法。
Delphi提供了一個類型庫編輯器,用於觀察或修改類型庫,可使用它來增長、修改、刪除類型庫的各類元素。類型庫的界面上能夠看到,左邊是一個樹形結構,各類元素的成員做爲子節點出現;右邊是根據左邊所選中的元素類型顯示不一樣的頁籤,能夠對該元素的一些屬性進行編輯。
三、屬性、方法和事件
VCL構件的屬性、方法和事件天然就變成爲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控件的主要步驟:
一、 點擊【File】—>【New】—>【Other】菜單項,打開【New Items】,選擇【ActiveX】;
二、 選擇【ActiveX Library】選項卡,點擊ok,建立工程。
三、 點擊【File】—>【New】—>【Other】菜單項,打開【New Items】,選擇【ActiveX】;
四、 選擇【ActiveX Control】選項卡,點擊ok,打開【ActiveX Control Wizard】窗口;
五、 在【VCL Class Name】組合框中選擇‘VCL’類(如TStringGrid),單擊Ok;
六、 添加代碼;
七、 運行程序,生成ocx文件。
八、在Delphi中單擊【Component】—>【Import ActiveX Control】菜單項,打開【Import ActiveX】窗口,在窗口中點擊【Add】,而後選擇ocx文件,而後單擊Install按鈕安裝組件。若是成功,在ActiveX組件頁中將顯示該組件。
一、首先,要啓動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是數組類型的,在控件嚮導所生成的屬性中就沒有這些屬性。可是有時候恰恰這些屬性、方法和事件是很重要的,這時就須要手工添加一些屬性、方法和事件!
二、在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;
三、生成ActiveX控件(OCX控件)
這時候,使用類型庫編輯器來查看類型庫,能夠看到新增長的BRowSelect屬性。好了,作好了前面這些工做之後,選擇Project菜單的Build StringGridXControl1命令便可生成咱們所須要的ActiveX控件。在項目的目錄下,咱們能夠找到 StringGridXControl1.ocx這個文件,這個就是咱們的ActiveX控件啦!
四、把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裏開發可以利用的控件。