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

          常用鏈接

          統(tǒng)計(jì)

          積分與排名

          friends

          link

          最新評(píng)論

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

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

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

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

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

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

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

          ,而且不改變?cè)形锛膶傩约胺椒ǎ蛘呤窃谠形锛蠑U(kuò)充功能。

          ?

          ?

          ?

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

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

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

          ?

          ?

          ?

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

          ?

          ?

          ?

          這個(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;

          ?

          ?

          接下來(lái)我們看 TMyEdit 如何改變?cè)瓉?lái)的屬性,請(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

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

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

          Get/Set 放在 private 還是 protected

          區(qū)段實(shí)為見(jiàn)仁見(jiàn)智的問(wèn)題,設(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è)物件我們開(kāi)始進(jìn)行測(cè)試,看這個(gè)物件如何無(wú)聲無(wú)息的嵌入我們已

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

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

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

          ?

          ?

          ?

          TMyEdit(Edit1).ReadOnly := False;

          ?

          ?

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

          ?

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

          主站蜘蛛池模板: 临澧县| 平远县| 上犹县| 巴马| 柏乡县| 曲水县| 霍邱县| 平塘县| 临城县| 汉寿县| 通榆县| 博白县| 鄯善县| 洛宁县| 潼南县| 亚东县| 游戏| 安溪县| 广昌县| 岳阳县| 清新县| 兴宁市| 马山县| 曲靖市| 许昌县| 济源市| 荔波县| 义马市| 深州市| 阿勒泰市| 岚皋县| 墨脱县| 庐江县| 望都县| 万山特区| 大余县| 南宁市| 汾阳市| 始兴县| 贺兰县| 武夷山市|