使用Delphi快速開發ActiveX控件

使用Delphi快速開發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提供了一個類型庫編輯器,用於觀察或修改類型庫,見圖1,可以使用它來增加、修改、刪除類型庫的各種元素。從圖1類型庫的界面上可以看到,左邊是一個樹形結構,各種元素的成員作爲子節點出現;右邊是根據左邊所選中的元素類型顯示不同的頁籤,可以對該元素的一些屬性進行編輯。   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控件的開發提供了兩個嚮導:   * 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將隨時提示你應該輸入的內容):   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裏開發能夠利用的控件。 本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/chenyq2008/archive/2008/01/30/2072596.aspx

 

 

 

2008-11-13

開發IE控件ActiveX(Delphi 打印控件)

文章分類:Java編程 關鍵字: activex ie控件 fastreport
    一直以來都覺得開發IE控件是一件非常難的事情,都是一些比較資深的程序員開發的,對於開發IE控件真的是覺得無從下手。

    經過這幾天的,查資料,問別人,瞎摸索終於做出了我的第一個IE控件--汽車電子客票打印控件。下面按照自己的步驟,記錄一下,以免以後自己都忘了,我這裏是用Delphi7開發的(學校的課程設計時學過,後來一直都沒用過,手生得很),使用了FastReport報表打印控件(http://fast-report.com/en/),以及Delphi7 WebDeploy發佈工具(http://www.2ccc.com/article.asp?articleid=4381):

    1、安裝Delphi及插件,由於不會在Delphi上安裝插件,還是費了不少功夫,問別人。
   
    2、新建一個ActiveX工程,我這裏選的是“ActiveX Form”,至於其它的選項,我還真不知道是用來開發什麼的。

    3、開發Delphi程序,接下來的事情,就是拖控件,寫代碼了。其中很多時候需要調試,不知道有沒有什麼好的辦法,自己覺得開發ActiveX控件,調試還是比較麻煩的,所以,我基本上是先在普通的Application Form上先把一些比較難弄、需要多次的程序寫好,再拷到“ActiveX Form”工程中(詳細的delphi+fastReport的開發過程下面再說)。

    4、用WebDeploy發佈,之前需要先在“Web deployment options”裏,選擇發佈路徑,發佈後,會自動生成一個html文件了一個ocx控件,其中html裏的代碼還需要自己去調一下,大小啊,位置啊,還有就是object標籤的ocx路徑,最好改成相對路徑,否則好像會報access拒絕的錯誤。

    5、用IE打開這個html,選擇警告中的“允許阻止的內容”,這樣就會安裝控件了,它安裝在了“C:/WINDOWS/Downloaded Program Files”這個路徑下,如果需要再次改代碼、調試,你需要從這裏把它右鍵刪除掉(需要關掉這個html頁面,否則刪不掉)

    6、接下來你會覺得,安裝的這個控件的圖標有點醜(delphi的默認圖標),在project->options->application發現這個東西,還不讓改,怎麼辦,查資料,“http://topic.csdn.net/t/20041021/14/3477746.html”我好像兩種辦法都試了一次,但總是改不了,後來重啓一次,發現這個是已經改掉了。
引用

3樓myy()回覆於 2004-10-27 10:28:59 得分 30兩種辦法皆可:   
  1. 用Image   Editor打開   工程名.res   文件,編輯裏面的“MAINICON”,保存。   
  2.寫個   .rc   文件,內容:   
  A_MY_ICON       ICON       E:/MyWork/MyOcx/my.ico    
  添家加到工程中即可,注意“A_MY_ICON”這個名字按字符串排序,  
  不能排在“MAINICON”後面。


    7、還會發現個問題,自己寫的ocx控件好像體積很大,我自己用了fastReport控件總共下來ocx有1550k,這麼大,得減肥。接着查資料“http://www.delphibbs.com/keylife/iblog_show.asp?xid=19233”,我好像把那個勾打上,就成了248K了,真的很神奇!如果有時間,再把裏面的包一個一個刪的試試。
引用

KeyLife富翁筆記 
作者: 木樁
標題: 一步給你的Delphi程序減減肥(從443KB減到34KB)
關鍵字: 減肥 包
分類: 個人專區
密級: 公開
(評分:★ , 回覆: 5, 閱讀: 1654) »»
是不是覺得Delphi2006編譯出的文件都是大塊頭呢?
動不動就300KB,確實麻煩。實際上那是因爲文件裏包含的Packages太多的緣故,下面就教你一種方法,去掉不要的Packages!

選菜單裏的 Project -> Options.. (Shift+Ctrl+F11)
出現Project Options for Project1.exe窗口,在左邊選 Packages
出現如下圖的東西,這樣修改:
1> 將Runtime packages裏的[ ]Build with runtime packages鉤上
2> 將不需要的包去掉就行了。(一般編寫Win32的程序,只要rtl;vcl就行)

如果實在不知道該去哪個,可以在上面的Design packages裏選擇一個包,點Components按鈕就可以查看這個包提供的控件。如果沒用過這個包,去掉前面的鉤就行了。


    8、真實的web應用(目前還沒弄好,弄好後再補上)

下面說一下delphi+fastReport的開發中遇到問題:
    1、fastReport根本沒用過,查資料學習
    demo:在官網上下載過來的文件裏有一些demo可以看
    FastReport開發指南:http://download.csdn.net/source/573124
    一篇短小文章:http://www.qq08.net/article/2007/1019/article_26559.html

    2、在用barCode(條形碼控件)時,總是會報錯,原來除了在報表在放barCode,還需要在form上放一個frxBarCodeObject控件,(FastReport開發指南中也提到了)。

    3、怎麼樣給barCode動態傳Code進去,這裏有個牛人,回答的非常棒http://delphi.ktop.com.tw/board.php?cid=168&fid=916&tid=66419

    4、因爲自己安裝的是英文版的fastReport,在控件的打印預覽中,界面是英文,怎麼漢化
http://www.newasp.net/code/dl004719,這裏也有安裝說明,但我裝的過程似乎不需要那麼複雜, 在/Res文件夾下,新建一個"Chinese"把那6個源文件放在裏面,運行fastReport目錄下的recompile.exe選擇好選項,運行編譯,就OK

    5、打印預覽的左上角圖標是FR的圖標,不爽,換!
http://topic.csdn.net/t/20041015/13/3459272.html,但不知道這裏用的是什麼版本,我的是3.07找不到那個源文件,我發現有另外一個文件,“frxPreview.pas”(其實搜一下,有三個同名文件,爲了保險起見,我改了兩個我認爲需要的地方)




  • 大小: 126.7 KB
  • 大小: 106.3 KB

 

由於項目的需要,近期開始學習用delphi開發一個軟電話控件。
      以前接觸過一些delphi開發方面的東西(當然都是些皮毛啦),但沒接觸過ocx控件的開發,在此把一些簡單的東西記下來,一方面以後自己可以再學習,另一方面希望對剛剛學習delphi開發ocx控件的初學者有所幫助,如果有什麼寫的不對和寫的不好的地方,還請各位多多指正,在此先謝謝了。
      關於ocx控件的一些基礎知識在這裏就不說這麼多了,網絡上有很多這方面的文章,有興趣的朋友可以到網上去搜搜!!
      Delphi集成開發環境對開發ocx控件提供了很好的支持,只要簡單的幾步就可以開發出屬於自己的ocx控件了,下面是delphi開發ocx的一些簡單的步驟:
      1、 打開delphi集成開發環境,選擇File->new->other,此時彈出一個多頁的窗口,選擇ActiveX頁,選擇ActiveX Form,點擊OK後,彈出工程屬性框,爲ActiveX起一個名字,這樣一個ocx控件的工程就建立好了
      2、 保存工程
      這樣一個ocx控件就建好了,但這個ocx不具備任何功能,不過這時可以對這個ocx進行編譯然後通過web發佈,再通過我們就瀏覽器就可以調用這個ocx控件了,下面介紹下編譯和發佈的一些簡單步驟:
      1、選擇project->compile project(ctrl+F9)a編譯工程
      2、註冊組件:Run->register ActiveX server(說明,當往form中增加新的組件後,編譯完後要重新註冊,不然的話,新加的組件顯示不出來)
      3、發佈:project->web deploy ......

發佈了70 篇原創文章 · 獲贊 6 · 訪問量 20萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章