程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> VC >> vc教程 >> BCB中用Sender參數實現代碼重用

BCB中用Sender參數實現代碼重用

編輯:vc教程

面向對象的編程工具的特點之一就是要提高代碼重用性(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

------------------

作者:ch_builder

信箱:[email protected]

QQ:116001522

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved