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

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

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

    love fish大鵬一曰同風起,扶搖直上九萬里

    常用鏈接

    統計

    積分與排名

    friends

    link

    最新評論

    偷龍轉鳳的物件設計方法

    一般我們設計一個物件,規規矩矩的從 VCL 下選擇一個最符合本身需求的物計

    繼承下來,從這個物件開始擴充功能,但有時候這種標準的設計方式,有實

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

    後,需考慮原先的物件可能已經在系統中運作,為了不破壞原有的物件功能

    ,及使用的介面,這個時候我們需要一種偷龍轉鳳的方法,偷偷的把這個物

    件至換掉,要置換這個物件,最好的方法就是產生一個一模一樣的類別出來

    ,而且不改變原有物件的屬性及方法,或者是在原有物件上擴充功能。

    ?

    ?

    ?

    以下提供一個另類的設計方法,來解決這個問題。假如有一個 TEdit 的物件

    ,我們希望它在修改資料的時候,可以改變顏色,在不改變原有物件的使用

    介面下,如何來擴充這個功能呢﹖

    ?

    ?

    ?

    請看這個範例的說明﹕

    ?

    ?

    ?

    這個繼承自 TEdit TMyEdit 很簡單的宣告 ReadOnly 這個屬性,其他

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

    ?

    ?

    ?

    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 如何改變原來的屬性,請把焦點放在 SetReadOnly 上面,這個

    procedrue 動了以下的手腳 : 在繼承 ReadOnly 原有的屬性之後,進行顏色的改變。

    ?

    ?

    ?

    procedure TMyEdit.SetReadOnly(Value: boolean);

    begin

    ? FReadOnly:= Value;

    ? inherited ReadOnly:= Value;

    ? SetColor;

    end;

    ?

    ?

    ?

    SetReadOnly 在父層類別 TCustomEdit

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

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

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

    屬性,除了保有父類別 ReadOnly

    屬性的作用,並賦予它新的行為。在設計類別時,也許將

    Get/Set 存取方法宣告在 protected

    區段會比較方便,後代類別可以直接改寫 Get/Set

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

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

    Get/Set 放在 private 還是 protected

    區段實為見仁見智的問題,設計者可視情況選擇對自己最有利的方式。

    ?

    ?

    ?

    以下是 TMyEdit 所有實作的部分﹕

    ?

    ?

    ?

    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;

    ?

    ?

    寫好這個物件我們開始進行測試,看這個物件如何無聲無息的嵌入我們已

    經寫好的單元,首先我們拉一個 Form1 出來,在上面放一個 Edit1

    Button1 ,當然您還要建構這個 TMyEdit 的物件,為了方便起見,請將這

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

    ?

    ?

    ?

    TMyEdit(Edit1).ReadOnly := False;

    ?

    ?

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

    ?

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

    主站蜘蛛池模板: 国产午夜不卡AV免费| 亚洲αⅴ无码乱码在线观看性色| www永久免费视频| 亚洲av无码乱码在线观看野外 | 久久精品国产亚洲香蕉| 中文成人久久久久影院免费观看| 亚洲无码日韩精品第一页| 国产成人无码精品久久久免费| 国产亚洲视频在线播放| 成人性生交大片免费看中文| 亚洲AV无码久久精品狠狠爱浪潮| 久久久久久久99精品免费| 亚洲经典在线中文字幕| 69xx免费观看视频| 亚洲无吗在线视频| 国产一级理论免费版| 青青青视频免费观看| 国产亚洲综合色就色| 8x网站免费入口在线观看| 天堂亚洲国产中文在线| 国产美女无遮挡免费视频网站| 无遮挡国产高潮视频免费观看| 亚洲色婷婷六月亚洲婷婷6月| 无码人妻一区二区三区免费n鬼沢 无码人妻一区二区三区免费看 | 国产特黄一级一片免费| 亚洲成人午夜在线| 一二三四在线观看免费高清中文在线观看 | yellow视频免费看| 亚洲国产成人久久精品动漫| 一二三四免费观看在线视频中文版 | 久久精品国产亚洲精品| 99视频在线精品免费| 亚洲午夜精品久久久久久app| 亚洲国产天堂久久综合| 久久午夜伦鲁片免费无码| 亚洲色偷偷偷综合网| 亚洲国产精品福利片在线观看| 亚洲高清中文字幕免费| 一级A毛片免费观看久久精品| 亚洲尹人香蕉网在线视颅| 国产精品麻豆免费版|