国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

BCB中用Sender參數(shù)實(shí)現(xiàn)代碼重用(修正版)

2019-11-17 05:22:07
字體:
供稿:網(wǎng)友
    面向?qū)ο蟮木幊坦ぞ叩奶攸c(diǎn)之一就是要提高代碼重用性(Reuse),寶蘭的BCB當(dāng)然可以實(shí)現(xiàn)這一功能。我們都知道,在BCB中,大部分程序代碼都直接或間接的對應(yīng)著一個事件,此程序稱為事件處理句柄,它實(shí)際上就是一個過程。從應(yīng)用程序的工程到窗口、組件和程序,BCB強(qiáng)調(diào)的是其開發(fā)過程中每一層次的重用性,可以充分利用已編寫過的代碼來減少工作量,更會使你的程序變得美麗。代碼段間的共享都跟發(fā)生該事件的控件有關(guān)有關(guān),需要根據(jù)控件類型做出相應(yīng)的處理,這時(shí)就要用到Sender參數(shù)。

每個函數(shù)的開頭都有形如:

void _fastcall TForm1::Button1Click(TObject *Sender)

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

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

dynamic_cast <T> (ptr)

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

1.進(jìn)行判定

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

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");

}

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

void __fastcall TForm1::Edit1Enter(TObject *Sender)

{

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

  Edittemp->Text="";



}

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

2.強(qiáng)制進(jìn)行類型轉(zhuǎn)換

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

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";

}

注重二者的區(qū)別,這其實(shí)這正是“.”與“->”的不同之處,仔細(xì)品味一下,你會清楚的。

上面的兩個程式均是先把TEdit類和TMemo類均強(qiáng)制轉(zhuǎn)換成TCustomEdit類,再對其父類的屬性進(jìn)行賦值。

使用Sender參數(shù)可以通過單一函數(shù)段處理多類組件,真正體現(xiàn)了BCB的面向?qū)ο蟮闹赜眯浴?br />
(以上程式以上XP系統(tǒng)、BCB6中編譯通過)


原來的文章寫時(shí)有了一些錯誤,這里向大家說聲對不起,更要感謝一些熱心網(wǎng)友的指正J

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


發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 格尔木市| 黔西县| 当雄县| 花莲市| 扶风县| 丹棱县| 庄浪县| 伊通| 安国市| 什邡市| 阿鲁科尔沁旗| 诏安县| 华阴市| 绩溪县| 墨玉县| 军事| 沙坪坝区| 青铜峡市| 色达县| 上饶市| 修水县| 丰宁| 文成县| 闽侯县| 江永县| 建水县| 嫩江县| 晴隆县| 阜阳市| 和硕县| 乐都县| 都安| 乐安县| 安国市| 赫章县| 奈曼旗| 柳州市| 屏东县| 民乐县| 克什克腾旗| 南投市|