Application.OnIdle 在訊息佇列空閒時觸發,適合執行低優先度的 UI 狀態同步(如工具列按鈕啟用/停用、選單項目可見性),避免在每個事件處理器中重複更新。
class TForm1 : public TForm {
__published: // IDE 管理元件
// ...
private:
void __fastcall OnIdle(TObject* Sender, bool& Done);
public:
__fastcall TForm1(TComponent* Owner);
};
#include // 需包含
void __fastcall TForm1::OnIdle(TObject* Sender, bool& Done) {
// 範例:根據 RichEdit 選取狀態啟用剪貼相關選單
bool textSelected = DBRichEdit1->SelLength > 0;
N17->Enabled = textSelected; // 剪下
N18->Enabled = textSelected; // 複製
N20->Enabled = textSelected; // 清除
// 剪貼板是否有文字
bool cbHasText = Clipboard()->HasFormat(CF_TEXT);
N19->Enabled = cbHasText; // 貼上
// 文件是否有內容
bool hasText = RichEdit1->Lines->Count > 0;
N21->Enabled = hasText; // 全選
// 文件是否修改過
bool hasChanged = RichEdit1->Modified;
ToolButton2->Enabled = hasChanged; // 存檔
ToolButton4->Enabled = hasChanged; // 另存新檔
Done = false; // false 讓 OnIdle 持續被呼叫,true 則只呼叫一次
}
void __fastcall TForm1::FormCreate(TObject *Sender) {
Application->OnIdle = OnIdle;
}
Application->Run()) 在處理完所有訊息、佇列空閒時呼叫 OnIdle。Done = false 表示「還有閒置工作要做」,訊息泵會持續呼叫 OnIdle 直到回傳 true 或有新訊息到達。OnIdle 執行時間應 < 1ms,避免影響訊息處理延遲。TThread 或 TTask (PPL) 背景執行,完成後 Synchronize 更新 UI。OnIdle。