C++Builder 事件驅動模型中,每個事件處理函式都擁有 TObject *Sender 參數,指向觸發事件的元件。善用此參數,可讓單一事件處理函式服務多個元件,大幅提升代碼重用性。
dynamic_cast 執行安全的向下轉型:
dynamic_cast<T>(ptr):T 必須為指標、void* 或類別型別;ptr 為指標或參考。nullptr(指標版)或拋出 std::bad_cast(參考版)。-RTTI),且類別必須為多型(至少有一個虛擬函式)。編輯框 (TEdit) 與標籤 (TLabel) 共用 OnClick 事件:
void __fastcall TForm1::SharedClick(TObject *Sender) {
if (dynamic_cast<TEdit*>(Sender))
ShowMessage("This is an EditBox");
else if (dynamic_cast<TLabel*>(Sender))
ShowMessage("This is a Label");
}
在物件檢視器中,將多個元件的 OnClick 都指向 SharedClick 即可。
多個編輯框在進入時自動清空:
void __fastcall TForm1::EditEnter(TObject *Sender) {
TEdit *ed = dynamic_cast<TEdit*>(Sender);
if (ed) ed->Text = "";
}
所有 TEdit 的 OnEnter 指向此函式。Sender 自動識別具體是哪個編輯框。
TEdit 與 TMemo 同繼承自 TCustomEdit。共用 OnEnter 設定文字:
void __fastcall TForm1::CommonEnter(TObject *Sender) {
// 寫法一:參考轉型
dynamic_cast<TCustomEdit&>(*Sender).Text = "Demo Text";
// 寫法二:指標轉型(等效)
dynamic_cast<TCustomEdit*>(Sender)->Text = "Demo Text";
}
差別在於 . vs ->,本質相同。轉型後可存取基底類別公開/保護成員。
Tag 屬性儲存自訂 ID,配合 Sender 實現更靈活分派。TActionList 將共用邏輯封裝為 TAction,多元件共用同一 Action,更符合 MVC 精神。dynamic_cast 有微小執行期開銷,極高頻率事件(如 OnMouseMove)建議改用 Tag 或元件陣列索引判斷。Sender + dynamic_cast 是 C++Builder 實現多型事件處理的核心技巧。善用此法可減少重複代碼、統一邏輯、提升維護性,充分發揮物件導向重用優勢。