BCB高手進階  (十)用Sender引數實現程式碼重用 (轉)

amyz發表於2007-11-16
BCB高手進階  (十)用Sender引數實現程式碼重用 (轉)[@more@]

BCB高手進階

(十)用Sender引數實現程式碼重用

to:nxyc_twz@163.com">nxyc_twz@163.com

  面向的工具的特點之一就是要提高程式碼重用性(Reuse),BCB當然可以實現這一功能。我們都知道,在BCB中,大部分程式碼都直接或間接的對應著一個事件,此程式稱為事件處理控制程式碼,它實際上就是一個過程。從應用程式的工程到視窗、和程式,BCB強調的是其開發過程中每一層次的重用性,可以充分利用已編寫過的程式碼來減少工作量,更會使你的程式變得優美。程式碼段間的共享都跟發生該事件的有關,需要根據控制元件型別做出相應的處理,這時就要用到Sender引數。

每個的開頭都有形如:
void _fastcall Tform1::Button1Click(T *Sender)

其中的Sender是一個Tobject型別的引數,它告訴BCB哪個控制元件接收到這個事件並相應的處理過程。我們可以編寫一個單一的事件處理控制程式碼,透過Sender引數和if語句或者case語句配合,來處理多個元件。在中可以用IS來測試Sender型別,或者用AS進行型別轉換,BCB我們只在用dynamic_cast來進行上面兩個工作,下面把dynamic_cast的用法說明一下。

dynamic_cast 可以把某種物件強制轉成另一個類,型別轉換成功則返回一個值是0的指標,失敗則丟出一個異常處理資訊:Bad_cast,但你放心不會導致當機,所以可以放心使用。其程式:
dynamic_cast (ptr)
T引數一定要是一個指標、void 、或是已經定義過的類,而ptr引數則必須是一個指標(pointer) 或是一個引用(reference)。如果T的型別是void,那麼ptr則是一個可以訪問最下面類裡的任何成員,當然這樣的類將不可以是基礎類。

1.進行判斷
我們用dynamic_case來測試Sender,以便找到呼叫這個事件的處理控制程式碼或元件的型別。如,並視窗編輯框和標籤的Click事件的處理控制程式碼都指向視窗的xxx函式,編輯框和標籤對Click事件有不同的反應:
void _fastcall TForm1::xxx(Tobject *Sender)
{
if(dynamic_cast(Sender)
showmessage(“This is a editbox”);
if(dynamic_cast(Sender)
showmessage(“This is a label”);
}

2.強制進行型別轉換
將若干繼承同一父類的子類強制轉換成該父類。如視窗中有一個TEdit類控制元件和一個TMemo控制元件,它們實際上都繼承於TCustomEdit類,如果你要為二者的某一事件提供同樣的處理,可以將二者事件控制程式碼都指向自定義的函式yyy:
void _fastcall TForm1::yyy(Tobject *Sender)
{
dynamic_cast(Sender).text=”This is some demo text”;
}
在這裡,先把TEdit類和TMemo類均強制轉換成TCustomEdit類,再對其父類的屬性進行賦值。
使用Sender引數可以透過單一函式段處理多類元件,真正體現了BCB的物件導向的重用性。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752019/viewspace-982759/,如需轉載,請註明出處,否則將追究法律責任。

相關文章