面向物件開發工具的特色之一是提高程式碼重用性。BCB 中多數程式碼對應事件處理函數,Sender 參數 (TObject *Sender) 指出觸發事件的控制項,善用它可讓單一事件處理函數服務多個控制項,實現重用。
Delphi 用 is/as 檢測/轉型,BCB 使用 dynamic_cast:
dynamic_cast<T>(ptr)
T:目標型別(指標、void*、已定義類別)ptr:來源指標或參考0;參考拋出 bad_cast 例外 (不會當機)將多個控制項的同一事件 (如 OnClick) 指向同一函數 xxx:
void __fastcall TForm1::xxx(TObject *Sender) {
if (dynamic_cast<TEdit *>(Sender))
ShowMessage("This is an EditBox");
if (dynamic_cast<TLabel *>(Sender))
ShowMessage("This is a Label");
}
多個 TEdit 共用 OnEnter 事件,進入時清空內容:
void __fastcall TForm1::Edit1Enter(TObject *Sender) {
TEdit *Edittemp = (TEdit *)(Sender); // 統一型別
Edittemp->Text = "";
}
其他 Edit 的 OnEnter 皆指向 Edit1Enter,滑鼠點入即清空。
TEdit 與 TMemo 同繼承自 TCustomEdit,共用 OnEnter 設定文字:
void __fastcall TForm1::yyy(TObject *Sender) {
// 寫法一:參考轉型
dynamic_cast<TCustomEdit &>(*Sender).Text = "Demo text";
// 寫法二:指標轉型 (推薦)
dynamic_cast<TCustomEdit *>(Sender)->Text = "Demo text";
}
差異:. 用於參考/物件,-> 用於指標。*Sender 解參考取物件,故用 .;Sender 本身為指標,故用 ->。
善用 Sender 搭配 dynamic_cast,可讓單一函數處理多類控制項,真正體現 BCB 面向物件的重用性。程式碼在 Windows XP / BCB6 測試通過。