如鵬網(wǎng) 大學(xué)生計(jì)算機(jī)學(xué)習(xí)社區(qū)

          CowNew開源團(tuán)隊(duì)

          http://www.cownew.com 郵件請(qǐng)聯(lián)系 about521 at 163.com

            BlogJava :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
            363 隨筆 :: 2 文章 :: 808 評(píng)論 :: 0 Trackbacks

          公告

          “如鵬教育”(http://www.RuPeng.com )是一個(gè)為計(jì)算機(jī)、信息等IT類專業(yè)在校大學(xué)生服務(wù)的學(xué)習(xí)社區(qū)。 每周舉辦免費(fèi)講座,為大一新生答疑解惑,幫大二、大三學(xué)生解決學(xué)習(xí)問(wèn)題,幫同學(xué)提高實(shí)戰(zhàn)開發(fā)能力,幫大四學(xué)生增強(qiáng)求職技巧,成功應(yīng)聘名企。

          常用鏈接

          留言簿(83)

          隨筆分類

          隨筆檔案

          新聞檔案

          相冊(cè)

          友情鏈接

          團(tuán)隊(duì)成員

          搜索

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          ?

          ? 有人說(shuō)過(guò)“不會(huì)開發(fā)控件的Delphi程序員不是真正的程序員”。Delphi正是由于高度的可擴(kuò)展性和大量的第三方控件的支持才能吸引無(wú)數(shù)程序員挑剔的目光。即使是由于工作需要使用其他開發(fā)工具的開發(fā)者也常常懷念和Delphi度過(guò)的日日夜夜。接觸Delphi已經(jīng)一年多了,從當(dāng)初對(duì)著Delphi組件面板上上百個(gè)控件不知所措,到現(xiàn)在已經(jīng)可以根據(jù)需要開發(fā)一些有一定難度的控件,其中走過(guò)的路是十分艱辛的,所以特此寫下這篇文章,將自己的經(jīng)驗(yàn)留給后來(lái)者,也算是獻(xiàn)給“同門師弟”的一份厚禮吧!

          ??? 需要說(shuō)明的一點(diǎn)是:在寫這篇文章之前我假設(shè)讀者已經(jīng)對(duì)面向?qū)ο蟮幕局R(shí)有一定的了解,所以對(duì)于文章中面向?qū)ο笙嚓P(guān)的概念將不再展開講述。

          一、牛刀小試-TURLLabel控件

          我們從一個(gè)能夠添加超鏈接的標(biāo)簽控件開始我們的控件開發(fā)之旅吧!

          既然是Label我們就從Tlabel派生這個(gè)控件吧(其實(shí)從TcustomLabel派生最好,不過(guò)出于簡(jiǎn)單的目的我們這里先從Tlabel派生)!

          1、選擇“File”->New”->Component,將彈出如下的對(duì)話框:

          o_1.jpg

          Ancestor type中選擇TlabelClassName中填入TURLLabel(名字可以任意取,但是要以T開頭,否則的話會(huì)出現(xiàn)注冊(cè)控件時(shí)候的問(wèn)題)。這里Ancestor type代表控件的基類,TURLLabel代表控件的名稱。

          2、超鏈接的視覺(jué)效果是帶下劃線的文字,所以我們覆蓋父類的構(gòu)造函數(shù),在構(gòu)造函數(shù)里修改控件的字體屬性。

          constructor TUrlLabel.Create(AOwner:TComponent);

          begin

          ? inherited Create(AOwner);

          ? Cursor:=crHandPoint;

          ? Font.Style:= [fsUnderline];

          ? end;

          代碼解釋:

          (1)??? inherited Create(AOwner);這句的意思是執(zhí)行父類的構(gòu)造函數(shù)。我們制作控件的時(shí)候,如果覆蓋了父類的構(gòu)造函數(shù),那么在新的構(gòu)造函數(shù)中一定要首先調(diào)用父類的構(gòu)造函數(shù),否則會(huì)引起錯(cuò)誤。這是很多初學(xué)控件開發(fā)的人常常遇到的問(wèn)題。當(dāng)您把自己開發(fā)的控件從面板上拖放到窗體時(shí),如果跳出一個(gè)“Access Violent”的錯(cuò)誤對(duì)話框的話,那么十有八九是因?yàn)槟苏{(diào)用父類的構(gòu)造函數(shù)。

          ??? 2 Cursor:=crHandPoint;

          Font.Style:= [fsUnderline];?

          這三句的意思是修改標(biāo)簽的視覺(jué)效果。Cursor:=crHandPoint;是設(shè)定當(dāng)鼠??????? 標(biāo)移動(dòng)到控件上時(shí)鼠標(biāo)的形狀為“手型”;Font.Style:= [fsUnderline];? 是設(shè)定文字的下劃線效果。

          3、既然是超鏈接控件,那么我們肯定要能使用戶在使用控件的時(shí)候能在“Object Inspector”中對(duì)超鏈接的URL進(jìn)行修改,所以我們應(yīng)該為控件增加一個(gè)Url屬性。

          ?? 屬性是訪問(wèn)控件字段的接口。通過(guò)屬性,控件使用者可以間接讀或者寫控件的內(nèi)部字段改變控件的狀態(tài)。組件屬性的聲明需要以下幾部分:屬性名、屬性類型、讀方法(或讀字段)、寫方法(或?qū)懽侄巍H绻麤](méi)有寫方法或?qū)懽侄?,則該屬性為只讀屬性)。屬性在控件類聲明的Published部分聲明。在Published中聲明的屬性可以在設(shè)計(jì)期通過(guò)“Object Inspector”對(duì)屬性值進(jìn)行修改。如果聲明在Public部分則不可以在設(shè)計(jì)期通過(guò)“Object Inspector”對(duì)屬性值進(jìn)行修改,但是可以在運(yùn)行時(shí)通過(guò)代碼進(jìn)行讀寫。

          ?在類聲明的Private訪問(wèn)區(qū)域中添加如下字段聲明:

          ? FUrl: String;

          ? 在類聲明中添加Published訪問(wèn)區(qū)域,并添加如下代碼

          property Url: String read FUrl write FUrl;

          這段聲明的意思是為控件添加一個(gè)Url屬性,屬性的類型是string,在讀Url屬性時(shí)返回Furl的值,在寫 Url屬性時(shí)設(shè)定Furl的值。

          4、超鏈接的視覺(jué)效果有了,下面使它點(diǎn)擊時(shí)調(diào)用瀏覽器打開Url指定的網(wǎng)址。

          Delphi控件的事件處理中很多事件都有對(duì)應(yīng)的一個(gè)調(diào)度方法(這是設(shè)計(jì)模式中模板模式的典型應(yīng)用)。比如在鼠標(biāo)點(diǎn)擊控件時(shí),控件會(huì)首先調(diào)用Click方法,由Click方法進(jìn)行相應(yīng)的處理,而絕大多數(shù)調(diào)度方法都會(huì)引發(fā)一個(gè)事件句柄(關(guān)于事件句柄我們后邊有深入的介紹)。比如Tlabel控件中在用戶用點(diǎn)擊Label時(shí)會(huì)首先調(diào)用控件的Click方法(被聲明為Protected級(jí)別),Click方法再觸發(fā)OnClick事件。所以我們只要覆蓋TlabelClick方法進(jìn)行我們自己的處理就可以了。

          Protected部分添加如下的聲明:

          procedure Click;override;

          ? 在實(shí)現(xiàn)部分為Click方法寫如下的代碼:

          procedure TUrlLabel.Click;

          begin

          ? ShellExecute(Application.Handle, nil, PChar(Url), nil, nil,SW_NORMAL);

          ? inherited;

          end;

          代碼解釋:

          (1)??? ShellExecute的作用是用默認(rèn)的程序打開第三個(gè)參數(shù)指定的文件。所以當(dāng)?shù)谌齻€(gè)參數(shù)為一個(gè)URL時(shí),則用瀏覽器打開這個(gè)網(wǎng)址。關(guān)于ShellExecute其他參數(shù)的使用方法可以查閱MSDN或其他相關(guān)資料。

          (2)??? Inherited;的作用是調(diào)用父類的Click方法來(lái)由父類來(lái)對(duì)鼠標(biāo)單擊事件做其他的處理。

          5、源代碼。

          下面給出這個(gè)控件的全部源代碼:

          unit UrlLabel;

          interface

          uses

          ? Windows, Messages, SysUtils, Classes, Controls, StdCtrls,Shellapi,

          ? Graphics, Forms;

          type

          ? TUrlLabel = class(TLabel)

          ? private

          ??? FUrl:AnsiString;

          ? protected

          ??? procedure Click;override;

          ? public

          ??? constructor Create(AOwner:TComponent);override;

          ? published

          ??? property Url:AnsiString read FUrl write FUrl;

          ? end;

          ?

          procedure Register;

          implementation

          constructor TUrlLabel.Create(AOwner:TComponent);

          begin

          ? inherited Create(AOwner);

          ? Cursor:=crHandPoint;

          ? Font.Style:=[fsUnderline];

          end;

          procedure TUrlLabel.Click;

          begin

          ? ShellExecute(Application.Handle, nil, PChar(Url), nil, nil,SW_NORMAL);

          ? inherited;

          end;

          ?

          procedure Register;

          begin

          ? RegisterComponents('Linco', [TUrlLabel]);//控件生成向?qū)傻淖?cè)控件用代碼

          end;

          ?

          end.

          6、為控件添加圖標(biāo)。

          如果沒(méi)有給自定義的控件定義圖標(biāo),出現(xiàn)在控件面板上的自定義圖標(biāo)的圖標(biāo)是默認(rèn)的圖標(biāo),很沒(méi)有“個(gè)性”,也不容易被用戶與其他控件區(qū)別開來(lái),所以我們需要給組件指定一個(gè)圖標(biāo)。

          首先利用DelphiImage Editor創(chuàng)建一個(gè)24*24的位圖,并把它保存到一個(gè)DCR文件中。創(chuàng)建了一個(gè)位圖后,就需要給位圖命名了。位圖的名稱必須和控件的類名相同,且為大寫,而DCR文件的名字則必須與控件所在單元的單元名相同。如我們上邊定義的控件,位圖的名字應(yīng)該為TURLLABEL,DCR文件的名字應(yīng)該是UrlLabel.dcr,此DCR文件應(yīng)該與組件的單元文件放在同一個(gè)目錄下。

          打開Image Editor,選擇”File”>New >Component Resource File(.dcr)”,如下圖:

          o_2.jpgo_2.jpg

          在“Contents”上單擊鼠標(biāo)右鍵,選擇“New”->BitMap”:

          o_3.jpg

          Width,Height中都填入24,點(diǎn)“OK”即可。

          o_4.jpg

          可以在Bitmap1上點(diǎn)右鍵選擇“Rename”為位圖重命名為TURLLABEL,然后雙擊TURLLABEL,就可以像使用“畫圖”一樣為您的控件設(shè)計(jì)圖標(biāo)了。

          7、注冊(cè)組件。

          點(diǎn)擊Componet>Install Componet進(jìn)行自定義組件安裝,此時(shí)將出現(xiàn)組件安裝對(duì)話框。

          Unit FilName 中輸入控件單元文件的文件名(包括路徑),點(diǎn)擊“OK,在彈出的Package Editor 中按下Install按鈕。如果安裝成功系統(tǒng)就會(huì)提示安裝成功。關(guān)閉Package Editor時(shí),會(huì)提示您是否保存修改,點(diǎn)擊Yes即可。

          安裝成功,建立一個(gè)測(cè)試程序。將URLLabel控件放到窗體上,設(shè)定Url屬性為http://www.sohu.com 運(yùn)行程序,點(diǎn)擊此Label,就會(huì)彈出瀏覽器打開http://www.sohu.com這個(gè)網(wǎng)址。

          思考題:

          1、如何為控件添加一個(gè)圖標(biāo)?

          2、Delphi中的控件的共同基類是哪個(gè)類?

          3、請(qǐng)做一個(gè)編輯框控件,當(dāng)控件中輸入的字符串是網(wǎng)址(以http://開頭)且用戶在編輯框上按回車時(shí),用瀏覽器打開此網(wǎng)址。

          posted on 2005-10-21 23:16 CowNew開源團(tuán)隊(duì) 閱讀(7302) 評(píng)論(0)  編輯  收藏

          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 松滋市| 察雅县| 收藏| 昭平县| 抚州市| 长子县| 嘉峪关市| 福鼎市| 延长县| 永德县| 遵义县| 镇远县| 潮州市| 栖霞市| 乌兰察布市| 牟定县| 西昌市| 临高县| 霞浦县| 东丽区| 岳普湖县| 南郑县| 监利县| 景东| 奉新县| 萨嘎县| 渑池县| 清镇市| 伊金霍洛旗| 栾城县| 玉山县| 长顺县| 昌图县| 祁东县| 和平县| 万山特区| 喜德县| 东兰县| 翁源县| 嘉禾县| 桑日县|