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 閱讀(358) 評論(0)  編輯  收藏 所屬分類: Delphi

          主站蜘蛛池模板: 建平县| 房产| 肥东县| 肃南| 保靖县| 静乐县| 遵义市| 五寨县| 定南县| 南郑县| 托克逊县| 思茅市| 体育| 抚顺市| 浦北县| 南川市| 枣阳市| 黄浦区| 阿荣旗| 比如县| 紫金县| 吉安县| 前郭尔| 永川市| 大庆市| 北川| 伊川县| 且末县| 获嘉县| 高碑店市| 江门市| 固始县| 永济市| 旺苍县| 清河县| 阿拉善盟| 鄢陵县| 炉霍县| 定边县| 图木舒克市| 沙田区|