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

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

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

    love fish大鵬一曰同風(fēng)起,扶搖直上九萬里

    常用鏈接

    統(tǒng)計(jì)

    積分與排名

    friends

    link

    最新評(píng)論

    偷龍轉(zhuǎn)鳳的物件設(shè)計(jì)方法

    一般我們?cè)O(shè)計(jì)一個(gè)物件,規(guī)規(guī)矩矩的從 VCL 下選擇一個(gè)最符合本身需求的物計(jì)

    繼承下來,從這個(gè)物件開始擴(kuò)充功能,但有時(shí)候這種標(biāo)準(zhǔn)的設(shè)計(jì)方式,有實(shí)

    際的困難,一者我們手上可能沒有這個(gè)物件的 Source ,二者更改這個(gè)物件之

    後,需考慮原先的物件可能已經(jīng)在系統(tǒng)中運(yùn)作,為了不破壞原有的物件功能

    ,及使用的介面,這個(gè)時(shí)候我們需要一種偷龍轉(zhuǎn)鳳的方法,偷偷的把這個(gè)物

    件至換掉,要置換這個(gè)物件,最好的方法就是產(chǎn)生一個(gè)一模一樣的類別出來

    ,而且不改變?cè)形锛膶傩约胺椒?,或者是在原有物件上擴(kuò)充功能。

    ?

    ?

    ?

    以下提供一個(gè)另類的設(shè)計(jì)方法,來解決這個(gè)問題。假如有一個(gè) TEdit 的物件

    ,我們希望它在修改資料的時(shí)候,可以改變顏色,在不改變?cè)形锛氖褂?/span>

    介面下,如何來擴(kuò)充這個(gè)功能呢﹖

    ?

    ?

    ?

    請(qǐng)看這個(gè)範(fàn)例的說明﹕

    ?

    ?

    ?

    這個(gè)繼承自 TEdit TMyEdit 很簡(jiǎn)單的宣告 ReadOnly 這個(gè)屬性,其他

    Create , Load 的方法,只是要在設(shè)計(jì)期間取得目前正確的顏色設(shè)定而已。

    ?

    ?

    ?

    type

    ? TMyEdit = class(TEdit)

    ? private

    ??? FDesignColor: TColor;

    ??? FReadOnly: boolean;

    ??? procedure SetReadOnly(Value: boolean);

    ??? procedure SetColor;

    ? protected

    ??? procedure Loaded; override;

    ? public

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

    ? published

    ??? property ReadOnly: boolean read FReadOnly write SetReadOnly;

    end;

    ?

    ?

    接下來我們看 TMyEdit 如何改變?cè)瓉淼膶傩裕?qǐng)把焦點(diǎn)放在 SetReadOnly 上面,這個(gè)

    procedrue 動(dòng)了以下的手腳 : 在繼承 ReadOnly 原有的屬性之後,進(jìn)行顏色的改變。

    ?

    ?

    ?

    procedure TMyEdit.SetReadOnly(Value: boolean);

    begin

    ? FReadOnly:= Value;

    ? inherited ReadOnly:= Value;

    ? SetColor;

    end;

    ?

    ?

    ?

    SetReadOnly 在父層類別 TCustomEdit

    中已有定義,只是它被放在 private

    區(qū)段裡,子類別是看不到的,否則只要改寫 SetReadOnly

    方法就行了。在這裡重新定義了 ReadOnly

    屬性,除了保有父類別 ReadOnly

    屬性的作用,並賦予它新的行為。在設(shè)計(jì)類別時(shí),也許將

    Get/Set 存取方法宣告在 protected

    區(qū)段會(huì)比較方便,後代類別可以直接改寫 Get/Set

    方法來改變或附加行為,但這也表示父類別將失去對(duì)私有成員的保護(hù)力,子類別幾乎

    可以完全改變父類別的行為。因此,要把

    Get/Set 放在 private 還是 protected

    區(qū)段實(shí)為見仁見智的問題,設(shè)計(jì)者可視情況選擇對(duì)自己最有利的方式。

    ?

    ?

    ?

    以下是 TMyEdit 所有實(shí)作的部分﹕

    ?

    ?

    ?

    constructor TMyEdit.Create(AOwner: TComponent);

    begin

    ? inherited;

    ? FDesignColor:= clWindow;

    end;

    procedure TMyEdit.Loaded;

    begin??

    ? inherited;??

    ? FDesignColor:= Color;

    end;

    procedure TMyEdit.SetColor;

    begin??

    ? if ReadOnly then????

    ??? Color:= clBtnFace??

    ? else????

    ??? Color:= FDesignColor;

    end;

    procedure TMyEdit.SetReadOnly(Value: boolean);

    begin??

    ? FReadOnly:= Value;??

    ? inherited ReadOnly:= Value;??

    ? SetColor;

    end;

    ?

    ?

    寫好這個(gè)物件我們開始進(jìn)行測(cè)試,看這個(gè)物件如何無聲無息的嵌入我們已

    經(jīng)寫好的單元,首先我們拉一個(gè) Form1 出來,在上面放一個(gè) Edit1

    Button1 ,當(dāng)然您還要建構(gòu)這個(gè) TMyEdit 的物件,為了方便起見,請(qǐng)將這

    個(gè)單元直接 Copy Form1 所屬的單元裡頭,然後在 Button1 上面,寫入 :

    ?

    ?

    ?

    TMyEdit(Edit1).ReadOnly := False;

    ?

    ?

    執(zhí)行看看,按一下 Button1 ,這時(shí)候 Edit1 ReadOnly 是不是多了改變顏色的功能﹖

    ?

    posted on 2007-02-06 15:04 liaojiyong 閱讀(356) 評(píng)論(0)  編輯  收藏 所屬分類: Delphi

    主站蜘蛛池模板: 两个人看的www免费| 亚洲fuli在线观看| 国产精品亚洲A∨天堂不卡| 亚洲男人第一无码aⅴ网站| 国产成人啪精品视频免费网| 国产猛烈高潮尖叫视频免费| 国产精品国产免费无码专区不卡 | 亚洲精品无码久久久久久| 亚洲国产区男人本色在线观看| 亚洲a级在线观看| 亚洲码欧美码一区二区三区| 亚洲成av人片天堂网无码】| 亚洲av纯肉无码精品动漫| 国产成人亚洲精品蜜芽影院| 一级白嫩美女毛片免费| 最近更新免费中文字幕大全| 日韩在线不卡免费视频一区| 麻豆高清免费国产一区| 中文字幕无码视频手机免费看 | 在线观看人成视频免费无遮挡| 青柠影视在线观看免费| 95免费观看体验区视频| 99爱在线精品免费观看| 精品剧情v国产在免费线观看| 亚洲av区一区二区三| 亚洲熟妇无码AV在线播放| 亚洲一区精品中文字幕| 亚洲一级黄色大片| 免费观看亚洲人成网站| 国产精品网站在线观看免费传媒| 亚洲免费在线观看视频| 日韩在线免费播放| 亚洲色WWW成人永久网址| 亚洲精品影院久久久久久| 亚洲熟妇无码av另类vr影视| 色多多A级毛片免费看| 国产va在线观看免费| 在线观看人成网站深夜免费| 久久久久噜噜噜亚洲熟女综合 | xvideos亚洲永久网址| 亚洲Av无码专区国产乱码DVD|