TApplication 封裝 Windows 應用程式的核心行為:訊息泵、例外處理、說明系統、提示顯示、主視窗管理等。每個 C++Builder 專案自動建立全域實例 Application,是 VCL 架構的中樞。
TObject
└── TPersistent
└── TComponent
└── TApplication
| 屬性 | 型別 | 說明 |
|---|---|---|
| Active | bool | 應用程式是否為前景作用中 |
| Terminated | bool | 是否收到 WM_QUIT 訊息 |
| ShowMainForm | bool | 啟動時是否顯示主表單 |
| MainForm | TForm* | 主表單實例(專案選項設定) |
| 屬性 | 型別 | 說明 |
|---|---|---|
| Title | string | 工作列圖示下的標題文字 |
| Icon | TIcon* | 工作列圖示 |
| Hint / HintColor | string / TColor | 提示文字與背景色 |
| HintPause / HintHidePause / HintShortPause | int | 提示顯示/隱藏/再次顯示延遲(毫秒) |
| ShowHint | bool | 全域啟用/停用提示 |
| 屬性 | 型別 | 說明 |
|---|---|---|
| ExeName | string | 執行檔完整路徑 |
| HelpFile | string | 說明檔路徑(.chm/.hlp) |
| Handle | HWND | 應用程式主視窗控制代碼 |
| 屬性 | 型別 | 說明 |
|---|---|---|
| UpdateFormatSettings | bool | 自動更新地區格式設定(日期/數字) |
| UpdateMetricSettings | bool | 自動更新提示字體/圖示標題字體 |
| 方法 | 說明 |
|---|---|
| Run() | 啟動訊息循環,進入主迴圈(WinMain 呼叫) |
| Terminate() | 發送 WM_QUIT,結束 Run() |
| ProcessMessages() | 處理佇列中所有待決訊息(保持 UI 回應) |
| HandleMessage() | 處理單一訊息並返回 |
| CreateForm() | 建立並註冊表單(自動產生程式碼呼叫) |
| MessageBox() | 顯示系統訊息方塊 |
| Minimize() / Restore() | 最小化/還原應用程式 |
| NormalizeTopMosts() / RestoreTopMosts() | 管理 fsStayOnTop 視窗行為 |
| HelpCommand() / HelpContext() / HelpJump() | 說明系統導航 |
| ShowException() | 顯示未捕捉例外對話框 |
| HookMainWindow() / UnhookMainWindow() | 掛鉤/解除主視窗訊息(非 VCL 對話框用) |
Application->Run() 內部實現近似:
while (GetMessage(&msg, NULL, 0, 0)) {
TranslateMessage(&msg); // 產生 WM_CHAR 等字元訊息
DispatchMessage(&msg); // 分發至對應視窗程序
}
ProcessMessages() 同樣循環但處理完佇列即返回,常用於長時間運算中保持 UI 回應。
AnsiString exeDir = ExtractFileDir(Application->ExeName);
void __fastcall TForm1::AppException(TObject* Sender, Exception* E) {
LogError(E->Message);
Application->ShowException(E); // 仍顯示預設對話框
}
// 專案原始碼中設定
Application->OnException = AppException;
Application->HintPause = 500; // 0.5 秒後顯示
Application->HintHidePause = 3000; // 3 秒後隱藏
Application->HintColor = clInfoBk; // 背景色
AnsiString cmd = "notepad.exe readme.txt";
if (ShellExecute(Application->Handle, "open", cmd.c_str(), NULL, NULL, SW_SHOWNORMAL) <= 32)
ShowMessage("啟動失敗");
IDE 選單 Project → Options → Application 可視化設定:
Application 為全域單例,**不可手動建構/解構**TWebApplication),屬性部分差異Synchronize,Application 方法同樣適用ProcessMessages() 可能導致重進入,謹慎使用,優先考慮執行緒TApplication 是 C++Builder 應用程式的大腦,掌握其訊息循環、例外處理、提示系統與全域資源管理,能讓開發者從容應對啟動流程客製化、跨執行緒 UI 安全、外部程式整合等進階需求。