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 阅读(353) 评论(0)  编辑  收藏 所属分类: Delphi


只有注册用户登录后才能发表评论。


网站导航: