考試大編輯整理C++編程知識(shí)
面向?qū)ο蟮木幊坦ぞ叩奶攸c(diǎn)之一就是要提高代碼重用性(Reuse),寶蘭的BCB當(dāng)然可以實(shí)現(xiàn)這一功能。我們都知道,在BCB中,大部分程序代碼都直接或間接的對(duì)應(yīng)著一個(gè)事件,此程序稱為事件處理句柄,它實(shí)際上就是一個(gè)過(guò)程。從應(yīng)用程序的工程到窗口、組件和程序,BCB強(qiáng)調(diào)的是其開發(fā)過(guò)程中每一層次的重用性,可以充分利用已編寫過(guò)的代碼來(lái)減少工作量,更會(huì)使你的程序變得優(yōu)美。代碼段間的共享都跟發(fā)生該事件的控件有關(guān)有關(guān),需要根據(jù)控件類型做出相應(yīng)的處理,這時(shí)就要用到Sender參數(shù)。
每個(gè)函數(shù)的開頭都有形如:
void _fastcall TForm1::Button1Click(TObject *Sender)
其中的Sender是一個(gè)TObject類型的參數(shù),它告訴BCB哪個(gè)控件接收到這個(gè)事件并調(diào)用相應(yīng)的處理過(guò)程。我們可以編寫一個(gè)單一的事件處理句柄,通過(guò)Sender參數(shù)和if語(yǔ)句或者case語(yǔ)句配合,來(lái)處理多個(gè)組件。在Delphi中可以用IS來(lái)測(cè)試Sender類型,或者用AS進(jìn)行類型轉(zhuǎn)換,BCB我們只在用dynamic_cast來(lái)進(jìn)行上面兩個(gè)工作,下面把dynamic_cast的用法說(shuō)明一下。
dynamic_cast 可以把某種對(duì)象強(qiáng)制轉(zhuǎn)成另一個(gè)類,這里所謂的強(qiáng)制仍有其局限,也就是說(shuō),如果類轉(zhuǎn)不過(guò)來(lái),那么系統(tǒng)將不會(huì)進(jìn)行轉(zhuǎn)換操作的。若類型轉(zhuǎn)換無(wú)法成功則返回一個(gè)值是0的指針。若參數(shù)T是一個(gè)參考類型,而類的轉(zhuǎn)換又失敗了,系統(tǒng)將會(huì)丟出一個(gè)異常處理信息:Bad_cast。但你放心這不會(huì)導(dǎo)致系統(tǒng)死機(jī),所以可以放心使用。其程式:
dynamic_cast (ptr)
T參數(shù)一定要是一個(gè)指針、void* 、或是已經(jīng)定義過(guò)的類,而ptr參數(shù)則必須是一個(gè)指針(pointer) 或是一個(gè)引用(reference)。如果T的類型是void*,那么ptr則是一個(gè)可以訪問(wèn)最下面類里的任何成員,當(dāng)然這樣的類將不可以是基礎(chǔ)類。
1.進(jìn)行判斷
我們用dynamic_case來(lái)測(cè)試Sender,以便找到調(diào)用這個(gè)事件的處理句柄或組件的類型。如,我們將窗口中的編輯框和標(biāo)簽的Click事件的處理句柄都指向窗口的xxx函數(shù)(其實(shí)你只要先把一個(gè)控件的Click事件命名為xxx,并在其中寫上共享代碼,其它控件的Click事件都指向xxx就行了),本例中的編輯框和標(biāo)簽對(duì)Click事件將有不同的反應(yīng),代碼如下:
void __fastcall TForm1::xxx(TObject *Sender)
{
if(dynamic_cast(Sender))
ShowMessage(\"This is a editbox\");
if(dynamic_cast(Sender))
ShowMessage(\"This is a label\");
}
當(dāng)然若是多個(gè)同類組件,只是想共用一個(gè)事件,那要比這簡(jiǎn)單多了。舉個(gè)例子,若你的很多編輯框(Edit),你想在輸入某一項(xiàng)的時(shí)候先把這一項(xiàng)清空,你只要寫一個(gè)OnEnter事件就可以了:
void __fastcall TForm1::Edit1Enter(TObject *Sender)
{
TEdit *Edittemp=(TEdit*)(Sender);//把不同的編輯框統(tǒng)一起來(lái)
Edittemp->Text=\"\";
}
其它的Edit組件的OnEnter事件都指向Edit1Enter,這樣就行了,試一下,是不是鼠標(biāo)放在編輯框里一點(diǎn)就清空了J其實(shí)這里只是把不同的編輯框(Sender清楚是那一個(gè)編輯框)統(tǒng)一起來(lái),好用一個(gè)共同的事件來(lái)處理。你在同一組件共用同一事件時(shí)一定要注意這一點(diǎn)。
2.強(qiáng)制進(jìn)行類型轉(zhuǎn)換
將若干繼承同一父類的子類強(qiáng)制轉(zhuǎn)換成該父類。如窗口中有一個(gè)TEdit類控件和一個(gè)TMemo控件,它們實(shí)際上都繼承于TCustomEdit類,如果你要為二者的某一事件提供同樣的處理,可以將二者的事件句柄都指向自定義的函數(shù)yyy,我們這里仍然是在OnEnter事件中(當(dāng)然你完全可以在其它事件中完成):
void __fastcall TForm1::yyy(TObject *Sender)
{
dynamic_cast(*Sender).Text=\"This is some demo text\";
}
或以下的格式:
void __fastcall TForm1::yyy(TObject *Sender)
{
dynamic_cast(Sender)->Text=\"This is some demo text\";
}
注意二者的區(qū)別,這其實(shí)這正是“.”與“->”的不同之處,仔細(xì)品味一下,你會(huì)清楚的。
上面的兩個(gè)程式均是先把TEdit類和TMemo類均強(qiáng)制轉(zhuǎn)換成TCustomEdit類,再對(duì)其父類的屬性進(jìn)行賦值。
使用Sender參數(shù)可以通過(guò)單一函數(shù)段處理多類組件,真正體現(xiàn)了BCB的面向?qū)ο蟮闹赜眯浴?BR>
面向?qū)ο蟮木幊坦ぞ叩奶攸c(diǎn)之一就是要提高代碼重用性(Reuse),寶蘭的BCB當(dāng)然可以實(shí)現(xiàn)這一功能。我們都知道,在BCB中,大部分程序代碼都直接或間接的對(duì)應(yīng)著一個(gè)事件,此程序稱為事件處理句柄,它實(shí)際上就是一個(gè)過(guò)程。從應(yīng)用程序的工程到窗口、組件和程序,BCB強(qiáng)調(diào)的是其開發(fā)過(guò)程中每一層次的重用性,可以充分利用已編寫過(guò)的代碼來(lái)減少工作量,更會(huì)使你的程序變得優(yōu)美。代碼段間的共享都跟發(fā)生該事件的控件有關(guān)有關(guān),需要根據(jù)控件類型做出相應(yīng)的處理,這時(shí)就要用到Sender參數(shù)。
每個(gè)函數(shù)的開頭都有形如:
void _fastcall TForm1::Button1Click(TObject *Sender)
其中的Sender是一個(gè)TObject類型的參數(shù),它告訴BCB哪個(gè)控件接收到這個(gè)事件并調(diào)用相應(yīng)的處理過(guò)程。我們可以編寫一個(gè)單一的事件處理句柄,通過(guò)Sender參數(shù)和if語(yǔ)句或者case語(yǔ)句配合,來(lái)處理多個(gè)組件。在Delphi中可以用IS來(lái)測(cè)試Sender類型,或者用AS進(jìn)行類型轉(zhuǎn)換,BCB我們只在用dynamic_cast來(lái)進(jìn)行上面兩個(gè)工作,下面把dynamic_cast的用法說(shuō)明一下。
dynamic_cast 可以把某種對(duì)象強(qiáng)制轉(zhuǎn)成另一個(gè)類,這里所謂的強(qiáng)制仍有其局限,也就是說(shuō),如果類轉(zhuǎn)不過(guò)來(lái),那么系統(tǒng)將不會(huì)進(jìn)行轉(zhuǎn)換操作的。若類型轉(zhuǎn)換無(wú)法成功則返回一個(gè)值是0的指針。若參數(shù)T是一個(gè)參考類型,而類的轉(zhuǎn)換又失敗了,系統(tǒng)將會(huì)丟出一個(gè)異常處理信息:Bad_cast。但你放心這不會(huì)導(dǎo)致系統(tǒng)死機(jī),所以可以放心使用。其程式:
dynamic_cast
T參數(shù)一定要是一個(gè)指針、void* 、或是已經(jīng)定義過(guò)的類,而ptr參數(shù)則必須是一個(gè)指針(pointer) 或是一個(gè)引用(reference)。如果T的類型是void*,那么ptr則是一個(gè)可以訪問(wèn)最下面類里的任何成員,當(dāng)然這樣的類將不可以是基礎(chǔ)類。
1.進(jìn)行判斷
我們用dynamic_case來(lái)測(cè)試Sender,以便找到調(diào)用這個(gè)事件的處理句柄或組件的類型。如,我們將窗口中的編輯框和標(biāo)簽的Click事件的處理句柄都指向窗口的xxx函數(shù)(其實(shí)你只要先把一個(gè)控件的Click事件命名為xxx,并在其中寫上共享代碼,其它控件的Click事件都指向xxx就行了),本例中的編輯框和標(biāo)簽對(duì)Click事件將有不同的反應(yīng),代碼如下:
void __fastcall TForm1::xxx(TObject *Sender)
{
if(dynamic_cast
ShowMessage(\"This is a editbox\");
if(dynamic_cast
ShowMessage(\"This is a label\");
}
當(dāng)然若是多個(gè)同類組件,只是想共用一個(gè)事件,那要比這簡(jiǎn)單多了。舉個(gè)例子,若你的很多編輯框(Edit),你想在輸入某一項(xiàng)的時(shí)候先把這一項(xiàng)清空,你只要寫一個(gè)OnEnter事件就可以了:
void __fastcall TForm1::Edit1Enter(TObject *Sender)
{
TEdit *Edittemp=(TEdit*)(Sender);//把不同的編輯框統(tǒng)一起來(lái)
Edittemp->Text=\"\";
}
其它的Edit組件的OnEnter事件都指向Edit1Enter,這樣就行了,試一下,是不是鼠標(biāo)放在編輯框里一點(diǎn)就清空了J其實(shí)這里只是把不同的編輯框(Sender清楚是那一個(gè)編輯框)統(tǒng)一起來(lái),好用一個(gè)共同的事件來(lái)處理。你在同一組件共用同一事件時(shí)一定要注意這一點(diǎn)。
2.強(qiáng)制進(jìn)行類型轉(zhuǎn)換
將若干繼承同一父類的子類強(qiáng)制轉(zhuǎn)換成該父類。如窗口中有一個(gè)TEdit類控件和一個(gè)TMemo控件,它們實(shí)際上都繼承于TCustomEdit類,如果你要為二者的某一事件提供同樣的處理,可以將二者的事件句柄都指向自定義的函數(shù)yyy,我們這里仍然是在OnEnter事件中(當(dāng)然你完全可以在其它事件中完成):
void __fastcall TForm1::yyy(TObject *Sender)
{
dynamic_cast
}
或以下的格式:
void __fastcall TForm1::yyy(TObject *Sender)
{
dynamic_cast
}
注意二者的區(qū)別,這其實(shí)這正是“.”與“->”的不同之處,仔細(xì)品味一下,你會(huì)清楚的。
上面的兩個(gè)程式均是先把TEdit類和TMemo類均強(qiáng)制轉(zhuǎn)換成TCustomEdit類,再對(duì)其父類的屬性進(jìn)行賦值。
使用Sender參數(shù)可以通過(guò)單一函數(shù)段處理多類組件,真正體現(xiàn)了BCB的面向?qū)ο蟮闹赜眯浴?BR>