Delphi 編寫ActiveX控制項(OCX控制項)的知識和範例(有詳細步驟)

來源:互聯網
上載者:User

標籤:build   查看類   架構   修改   枚舉   asi   hicon   編輯   dbase   

一、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

Delphi 編寫ActiveX控制項(OCX控制項)的知識和範例(有詳細步驟)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.