<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

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

    CowNew開源團(tuán)隊

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

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

    #

    ?

    二、控件開發(fā)縱覽

    ? 通過開發(fā)上邊這個控件,我們已經(jīng)對Delphi控件開發(fā)有了基本的認(rèn)識。下面我們將系統(tǒng)的講述一下控件開發(fā)的知識。

    制作控件第一件事就是選擇適當(dāng)?shù)?Delphi對象類型作為父對象,以派生新的對象。子對象可以繼承父對象的全部非 private部件,但不能擺脫不需要的部件。因此,所選父對象應(yīng)盡可能多地包含子對象所需的屬性、事件和方法,但不應(yīng)包含子對象不需要的東西。Delphi必須從Tcomponent或Tcomponent的子類派生。TComponent是所有 Delphi控件的基點,但若直接從 TComponent 派生新控件,很多東西就需要自己從頭做起。一般只有非可視控件才直接從 TComponent派生。 Delphi提供了若干專門用于制作控件(可視控件)的對象類型,都是從 TControl和 TWinControl派生而來。

    TControl的子類型用于非窗口式控件, TWinControl的子類型則用于窗口式控件。除非特殊需要,一般不直接從 TControl和TWinControl派生新控件,而是從其子類型派生。這樣可以充分利用原有的屬性、事件和方法,減少很多工作量。在這些控件類型中,非通用的屬性、事件和方法都聲明為 protected。這樣可以禁止控件用戶訪問,又能被子類型繼承和修改。在新控件中,可以簡單地把繼承來的屬性和事件重新聲明為 published,使控件用戶能在設(shè)計期通過對象編輯窗口訪問,也可以進(jìn)而修改屬性的默認(rèn)值和讀寫方式,或是重載( override)事件處理子過程和其他控件方法,以修改其中的程序代碼。重聲明可以放寬訪問權(quán)限,但不能相反,例如,不可能把 published屬性重聲明為 private或 protected。

    ?Delphi控件也是Delphi的類,所有的控件都有特定的結(jié)構(gòu)。一般控件包括三大組成部分:屬性、方法和事件,下面先介紹初學(xué)控件開發(fā)的最難懂的屬性部分,其他部分我們將在以后章節(jié)為大家介紹。

    屬性主要部分就是屬性的讀寫方法(或讀寫字段)。前面的例子用的是讀寫字段,也就是對屬性的讀寫都通過對字段的讀寫來完成。下面為大家講解一下讀寫方法的使用方法:

    TmyComponent = class(TComponent)

    Private

    ? Fcount: Integer;

    ? Procedure SetCount(Avalue: Integer);

    Pulbished

    ? Property Count: Integer read Fcount write SetCount;

    End;

    這個例子中當(dāng)執(zhí)行MyComponent1.Count := 1;這樣的代碼時,將會導(dǎo)致SetCount方法執(zhí)行,并且參數(shù)Avalue被指定為1;當(dāng)執(zhí)行 I := MyComponent1.Count;方法時,會將 Fcount的值返回給I。

    屬性的聲明語法允許屬性聲明的Read和Write部分用訪問方法取代對象私有數(shù)據(jù)域。屬性的讀方法是不帶參數(shù)的函數(shù),返回同屬性相同類型的值。通常讀方法以Get開頭。屬性的寫方法總是帶一個參數(shù)的過程。寫方法常常以Set開頭。

    思考題:

    1、? 如何為控件添加屬性?

    2、? TwinControl類派生的控件的特點是什么?

    posted @ 2005-10-21 23:24 CowNew開源團(tuán)隊 閱讀(2850) | 評論 (1)編輯 收藏

    ?

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

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

    一、牛刀小試-TURLLabel控件

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

    既然是Label我們就從Tlabel派生這個控件吧(其實從TcustomLabel派生最好,不過出于簡單的目的我們這里先從Tlabel派生)

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

    o_1.jpg

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

    2、超鏈接的視覺效果是帶下劃線的文字,所以我們覆蓋父類的構(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ù)。我們制作控件的時候,如果覆蓋了父類的構(gòu)造函數(shù),那么在新的構(gòu)造函數(shù)中一定要首先調(diào)用父類的構(gòu)造函數(shù),否則會引起錯誤。這是很多初學(xué)控件開發(fā)的人常常遇到的問題。當(dāng)您把自己開發(fā)的控件從面板上拖放到窗體時,如果跳出一個“Access Violent”的錯誤對話框的話,那么十有八九是因為您忘了調(diào)用父類的構(gòu)造函數(shù)。

    ??? 2 Cursor:=crHandPoint;

    Font.Style:= [fsUnderline];?

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

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

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

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

    ? FUrl: String;

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

    property Url: String read FUrl write FUrl;

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

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

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

    Protected部分添加如下的聲明:

    procedure Click;override;

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

    procedure TUrlLabel.Click;

    begin

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

    ? inherited;

    end;

    代碼解釋:

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

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

    5、源代碼。

    下面給出這個控件的全部源代碼:

    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ū)傻淖钥丶么a

    end;

    ?

    end.

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

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

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

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

    o_2.jpgo_2.jpg

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

    o_3.jpg

    Width,Height中都填入24,點“OK”即可。

    o_4.jpg

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

    7、注冊組件。

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

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

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

    思考題:

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

    2、Delphi中的控件的共同基類是哪個類?

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

    posted @ 2005-10-21 23:16 CowNew開源團(tuán)隊 閱讀(7304) | 評論 (0)編輯 收藏

    僅列出標(biāo)題
    共30頁: First 上一頁 22 23 24 25 26 27 28 29 30 
    主站蜘蛛池模板: 色www永久免费| 亚洲av纯肉无码精品动漫| 香蕉免费一级视频在线观看| 又粗又硬免费毛片| 亚洲国产精品ⅴa在线观看| 又粗又大又黑又长的免费视频| 亚洲视频在线观看网站| 日韩免费无码一区二区三区| 日本高清不卡aⅴ免费网站| 亚洲精品成人区在线观看| 一区二区三区免费视频播放器| 亚洲区不卡顿区在线观看| 国产日韩精品无码区免费专区国产| 国产成人综合亚洲AV第一页 | 野花香在线视频免费观看大全| 亚洲人成人无码网www电影首页 | 亚洲国产精品一区二区久久hs| 国产真人无码作爱视频免费 | 国产精品亚洲综合五月天| 国内一级一级毛片a免费| 免费在线观看亚洲| 久久久久亚洲爆乳少妇无| 嫩草在线视频www免费观看| 免费国产成人午夜电影| j8又粗又长又硬又爽免费视频| 国产亚洲精品a在线观看app | 免费无码成人AV在线播放不卡| 久久99亚洲网美利坚合众国| 亚洲免费网站观看视频| 暖暖免费中文在线日本| 五月天网站亚洲小说| 毛片在线看免费版| fc2成年免费共享视频18| 中文字幕亚洲综合久久2| 啦啦啦在线免费视频| a级大片免费观看| 亚洲娇小性xxxx| 亚洲男人的天堂一区二区| 1000部禁片黄的免费看| 韩国亚洲伊人久久综合影院| 亚洲高清专区日韩精品|