| 導購 | 订阅 | 在线投稿
分享
 
 
 

BCB中用Sender參數實現代碼重用(修正版)

來源:互聯網網民  2008-06-01 01:47:43  評論

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

每個函數的開頭都有形如:

void _fastcall TForm1::Button1Click(TObject *Sender)

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

dynamic_cast 可以把某種對象強制轉成另一個類,這裏所謂的強制仍有其局限,也就是說,假如類轉不過來,那麽系統將不會進行轉換操作的。若類型轉換無法成功則返回一個值是0的指針。若參數T是一個參考類型,而類的轉換又失敗了,系統將會丟出一個異常處理信息:Bad_cast。但你放心這不會導致系統死機,所以可以放心使用。其程式:

dynamic_cast <T> (ptr)

T參數一定要是一個指針、void* 、或是已經定義過的類,而ptr參數則必須是一個指針(pointer) 或是一個引用(reference)。假如T的類型是void*,那麽ptr則是一個可以訪問最下面類裏的任何成員,當然這樣的類將不可以是基礎類。

1.進行判定

我們用dynamic_case來測試Sender,以便找到調用這個事件的處理句柄或組件的類型。如,我們將窗口中的編輯框和標簽的Click事件的處理句柄都指向窗口的xxx函數(其實你只要先把一個控件的Click事件命名爲xxx,並在其中寫上共享代碼,其它控件的Click事件都指向xxx就行了),本例中的編輯框和標簽對Click事件將有不同的反應,代碼如下:

void __fastcall TForm1::xxx(TObject *Sender)

{

if(dynamic_cast<TEdit *>(Sender))

ShowMessage("This is a editbox");

if(dynamic_cast<TLabel *>(Sender))

ShowMessage("This is a label");

}

當然若是多個同類組件,只是想共用一個事件,那要比這簡單多了。舉個例子,若你的很多編輯框(Edit),你想在輸入某一項的時候先把這一項清空,你只要寫一個OnEnter事件就可以了:

void __fastcall TForm1::Edit1Enter(TObject *Sender)

{

TEdit *Edittemp=(TEdit*)(Sender);//把不同的編輯框統一起來

Edittemp->Text="";

}

其它的Edit組件的OnEnter事件都指向Edit1Enter,這樣就行了,試一下,是不是鼠標放在編輯框裏一點就清空了J其實這裏只是把不同的編輯框(Sender清楚是那一個編輯框)統一起來,好用一個共同的事件來處理。你在同一組件共用同一事件時一定要注重這一點。

2.強制進行類型轉換

將若幹繼續同一父類的子類強制轉換成該父類。如窗口中有一個TEdit類控件和一個TMemo控件,它們實際上都繼續于TCustomEdit類,假如你要爲二者的某一事件提供同樣的處理,可以將二者的事件句柄都指向自定義的函數yyy,我們這裏仍然是在OnEnter事件中(當然你完全可以在其它事件中完成):

void __fastcall TForm1::yyy(TObject *Sender)

{

dynamic_cast<TCustomEdit &>(*Sender).Text="This is some demo text";

}

或以下的格式:

void __fastcall TForm1::yyy(TObject *Sender)

{

dynamic_cast<TCustomEdit* >(Sender)->Text="This is some demo text";

}

注重二者的區別,這其實這正是「.」與「->」的不同之處,仔細品味一下,你會清楚的。

上面的兩個程式均是先把TEdit類和TMemo類均強制轉換成TCustomEdit類,再對其父類的屬性進行賦值。

使用Sender參數可以通過單一函數段處理多類組件,真正體現了BCB的面向對象的重用性。

(以上程式以上XP系統、BCB6中編譯通過)

原來的文章寫時有了一些錯誤,這裏向大家說聲對不起,更要感謝一些熱心網友的指正J

但同時我嚴正聲明本文除了CSDN與CCRUN外沒有同意過其它任何人或網站使用。但「BCB高手進階(十)用Sender參數實現代碼重用 nxyc_twz(原作)」,竟然錯得和我一樣,並且每個字都不差,我希望你能公開向我及關心我的網友們道歉,否則我將保留向CSDN投訴你的權利L

 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
面向對象的編程工具的特點之一就是要提高代碼重用性(Reuse),寶蘭的BCB當然可以實現這一功能。我們都知道,在BCB中,大部分程序代碼都直接或間接的對應著一個事件,此程序稱爲事件處理句柄,它實際上就是一個過程。從應用程序的工程到窗口、組件和程序,BCB強調的是其開發過程中每一層次的重用性,可以充分利用已編寫過的代碼來減少工作量,更會使你的程序變得美麗。代碼段間的共享都跟發生該事件的控件有關有關,需要根據控件類型做出相應的處理,這時就要用到Sender參數。 每個函數的開頭都有形如: void _fastcall TForm1::Button1Click(TObject *Sender) 其中的Sender是一個TObject類型的參數,它告訴BCB哪個控件接收到這個事件並調用相應的處理過程。我們可以編寫一個單一的事件處理句柄,通過Sender參數和if語句或者case語句配合,來處理多個組件。在Delphi中可以用IS來測試Sender類型,或者用AS進行類型轉換,BCB我們只在用dynamic_cast來進行上面兩個工作,下面把dynamic_cast的用法說明一下。 dynamic_cast 可以把某種對象強制轉成另一個類,這裏所謂的強制仍有其局限,也就是說,假如類轉不過來,那麽系統將不會進行轉換操作的。若類型轉換無法成功則返回一個值是0的指針。若參數T是一個參考類型,而類的轉換又失敗了,系統將會丟出一個異常處理信息:Bad_cast。但你放心這不會導致系統死機,所以可以放心使用。其程式: dynamic_cast <T> (ptr) T參數一定要是一個指針、void* 、或是已經定義過的類,而ptr參數則必須是一個指針(pointer) 或是一個引用(reference)。假如T的類型是void*,那麽ptr則是一個可以訪問最下面類裏的任何成員,當然這樣的類將不可以是基礎類。 1.進行判定 我們用dynamic_case來測試Sender,以便找到調用這個事件的處理句柄或組件的類型。如,我們將窗口中的編輯框和標簽的Click事件的處理句柄都指向窗口的xxx函數(其實你只要先把一個控件的Click事件命名爲xxx,並在其中寫上共享代碼,其它控件的Click事件都指向xxx就行了),本例中的編輯框和標簽對Click事件將有不同的反應,代碼如下: void __fastcall TForm1::xxx(TObject *Sender) { if(dynamic_cast<TEdit *>(Sender)) ShowMessage("This is a editbox"); if(dynamic_cast<TLabel *>(Sender)) ShowMessage("This is a label"); } 當然若是多個同類組件,只是想共用一個事件,那要比這簡單多了。舉個例子,若你的很多編輯框(Edit),你想在輸入某一項的時候先把這一項清空,你只要寫一個OnEnter事件就可以了: void __fastcall TForm1::Edit1Enter(TObject *Sender) { TEdit *Edittemp=(TEdit*)(Sender);//把不同的編輯框統一起來 Edittemp->Text=""; } 其它的Edit組件的OnEnter事件都指向Edit1Enter,這樣就行了,試一下,是不是鼠標放在編輯框裏一點就清空了J其實這裏只是把不同的編輯框(Sender清楚是那一個編輯框)統一起來,好用一個共同的事件來處理。你在同一組件共用同一事件時一定要注重這一點。 2.強制進行類型轉換 將若幹繼續同一父類的子類強制轉換成該父類。如窗口中有一個TEdit類控件和一個TMemo控件,它們實際上都繼續于TCustomEdit類,假如你要爲二者的某一事件提供同樣的處理,可以將二者的事件句柄都指向自定義的函數yyy,我們這裏仍然是在OnEnter事件中(當然你完全可以在其它事件中完成): void __fastcall TForm1::yyy(TObject *Sender) { dynamic_cast<TCustomEdit &>(*Sender).Text="This is some demo text"; } 或以下的格式: void __fastcall TForm1::yyy(TObject *Sender) { dynamic_cast<TCustomEdit* >(Sender)->Text="This is some demo text"; } 注重二者的區別,這其實這正是「.」與「->」的不同之處,仔細品味一下,你會清楚的。 上面的兩個程式均是先把TEdit類和TMemo類均強制轉換成TCustomEdit類,再對其父類的屬性進行賦值。 使用Sender參數可以通過單一函數段處理多類組件,真正體現了BCB的面向對象的重用性。 (以上程式以上XP系統、BCB6中編譯通過) 原來的文章寫時有了一些錯誤,這裏向大家說聲對不起,更要感謝一些熱心網友的指正J 但同時我嚴正聲明本文除了CSDN與CCRUN外沒有同意過其它任何人或網站使用。但「BCB高手進階(十)用Sender參數實現代碼重用 nxyc_twz(原作)」,竟然錯得和我一樣,並且每個字都不差,我希望你能公開向我及關心我的網友們道歉,否則我將保留向CSDN投訴你的權利L
󰈣󰈤
王朝萬家燈火計劃
期待原創作者加盟
 
 
 
>>返回首頁<<
 
 
 
 
 
 熱帖排行
 
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有