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

善用 C++Builder Application.OnIdle 事件即時更新 UI 狀態

     編輯:VC 教學

Application.OnIdle 在訊息佇列空閒時觸發,適合執行低優先度的 UI 狀態同步(如工具列按鈕啟用/停用、選單項目可見性),避免在每個事件處理器中重複更新。

實作步驟

1. 表單標頭檔宣告處理函式


class TForm1 : public TForm {
__published: // IDE 管理元件
    // ...
private:
    void __fastcall OnIdle(TObject* Sender, bool& Done);
public:
    __fastcall TForm1(TComponent* Owner);
};

2. 實作 OnIdle 邏輯


#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 則只呼叫一次
}

3. 在 FormCreate 中掛鉤


void __fastcall TForm1::FormCreate(TObject *Sender) {
    Application->OnIdle = OnIdle;
}

運作原理

  • 訊息泵 (Application->Run()) 在處理完所有訊息、佇列空閒時呼叫 OnIdle。
  • Done = false 表示「還有閒置工作要做」,訊息泵會持續呼叫 OnIdle 直到回傳 true 或有新訊息到達。
  • 適合輕量、頻繁、狀態同步任務;耗時運算請移至背景執行緒,否則阻塞 UI 回應。

常見應用場景

  • 工具列/選單項目啟用狀態同步(如範例)。
  • 狀態列資訊更新(游標位置、修改標記、編碼格式)。
  • 背景拼寫檢查、語法高亮增量更新。
  • 定期檢查外部資源狀態(網路連線、檔案變更)。

效能提示

  • OnIdle 執行時間應 < 1ms,避免影響訊息處理延遲。
  • 複雜計算改用 TThread 或 TTask (PPL) 背景執行,完成後 Synchronize 更新 UI。
  • 若多表單共用邏輯,可建立基底表單類別統一實作 OnIdle。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved