在 C++Builder 應用程式開發中,OnIdle 事件是一個強大卻常被忽視的機制。當應用程式處於閒置狀態(無訊息需處理)時,會持續觸發此事件。本文示範如何利用 OnIdle 即時監控剪貼簿內容與編輯器狀態,動態啟用/停用選單項目與工具列按鈕,提升使用者體驗。
在 Form1.h 的 private 區段加入事件處理函數宣告:
void __fastcall OnIdle(TObject* Sender, bool& Done);
在 Form1.cpp 中撰寫具體邏輯:
void __fastcall TForm1::OnIdle(TObject* Sender, bool& Done)
{
// 檢查 DBRichEdit1 是否有文字被選取
bool TextSelected = DBRichEdit1->SelLength > 0;
N17->Enabled = TextSelected; // 剪下
N18->Enabled = TextSelected; // 複製
N20->Enabled = TextSelected; // 清除
// 檢查剪貼簿是否包含文字格式(需 #include <Clipbrd.hpp>)
bool CBHasText = Clipboard()->HasFormat(CF_TEXT);
N19->Enabled = CBHasText; // 貼上
// 檢查 RichEdit1 是否有內容
bool HasText = RichEdit1->Lines->Count > 0;
N21->Enabled = HasText; // 全選
// 檢查內容是否已修改
bool HasChanged = RichEdit1->Modified;
ToolButton2->Enabled = HasChanged; // 存檔
ToolButton4->Enabled = HasChanged; // 另存新檔
}
在 Form1 的 OnCreate 事件中註冊:
Application->OnIdle = OnIdle;
OnIdle 在訊息佇列為空時高頻觸發,能確保 UI 狀態與實際資料同步。Clipboard()->HasFormat(CF_TEXT) 判斷是否有文字可貼上,需引入 Clipbrd.hpp。OnIdle 執行耗時運算導致介面卡頓。true,應用程式將在下一次進入閒置前不再呼叫 OnIdle;通常保持 false 以持續監控。此模式同樣適用於:工具列按鈕狀態更新、狀態列資訊刷新、背景自動儲存觸發條件檢查、網路連線狀態輪詢等。善用 OnIdle 可讓介面更貼近使用者操作脈絡。