首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> VC 教學

善用 C++Builder Sender 參數實現事件處理代碼重用

     編輯:VC 教學

C++Builder 事件驅動模型中,每個事件處理函式都擁有 TObject *Sender 參數,指向觸發事件的元件。善用此參數,可讓單一事件處理函式服務多個元件,大幅提升代碼重用性。

dynamic_cast 核心用法

dynamic_cast 執行安全的向下轉型:

  • dynamic_cast<T>(ptr):T 必須為指標、void* 或類別型別;ptr 為指標或參考。
  • 轉型成功返回轉換後指標;失敗返回 nullptr(指標版)或拋出 std::bad_cast(參考版)。
  • 需啟用 RTTI(專案選項 -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 實現多型事件處理的核心技巧。善用此法可減少重複代碼、統一邏輯、提升維護性,充分發揮物件導向重用優勢。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved