大型檔案下載常需數小時,使用者希望設定好關機時間後即可安心就寢。本工具提供直觀介面,支援日期/時間精準設定、倒數計時顯示、自動關機執行。
| 群組 | 元件 | 屬性關鍵設定 | 用途 |
|---|---|---|---|
| GroupBox1「目前系統時間」 | DateTimePicker1 | Kind=dtkDate | 即時顯示系統日期/時間 |
| DateTimePicker2 | Kind=dtkTime | ||
| GroupBox2「預設關機時間」 | DateTimePicker3 | Kind=dtkDate | 設定目標關機日期/時間 |
| DateTimePicker4 | Kind=dtkTime | ||
| CheckBox1 | Caption="自動關機生效", Enabled=False | 啟用/關閉定時任務 | |
| Timer1 | Interval=1000 (1秒) | 核心輪詢邏輯 |
void __fastcall TForm1::FormCreate(TObject *Sender)
{
CheckBox1->Checked = false;
CheckBox1->Enabled = false; // 預設禁用,待時間合法才啟用
DateTimePicker1->DateTime = Now(); // 系統日期
DateTimePicker2->DateTime = Now(); // 系統時間
DateTimePicker3->DateTime = Now(); // 關機日期初值
DateTimePicker4->DateTime = Now(); // 關機時間初值
}
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
// 1. 即時更新系統時間顯示
DateTimePicker1->DateTime = Now();
DateTimePicker2->DateTime = Now();
// 2. 驗證設定時間是否已過期
if (DateTimePicker4->DateTime < Now()) {
CheckBox1->Checked = false;
CheckBox1->Enabled = false;
} else {
CheckBox1->Enabled = true;
}
// 3. 觸發關機條件判斷
if (CheckBox1->Checked &&
DateTimeToStr(DateTimePicker4->DateTime) == DateTimeToStr(Now()))
{
DWORD tmp;
ExitWindowsEx(EWX_SHUTDOWN, tmp); // 呼叫 Win32 API 關機
}
}
DateTimePicker3/4 的 OnChange 事件雙向同步,確保日期與時間元件一致,並即時檢查有效性:
void __fastcall TForm1::DateTimePicker3Change(TObject *Sender)
{
DateTimePicker4->DateTime = DateTimePicker3->DateTime; // 日期聯動
if (DateTimePicker4->DateTime < Now()) {
CheckBox1->Checked = false;
CheckBox1->Enabled = false;
} else CheckBox1->Enabled = true;
}
// DateTimePicker4Change 邏輯對稱
在 Timer1Timer 中新增:
TDateTime preset = DateTimePicker3->DateTime;
TDateTime current = Now();
Edit1->Text = IntToStr((int)((preset - current) * 86400)); // 剩餘秒數
放置一個 Edit1 即可顯示動態倒數。
ExitWindowsEx(EWX_SHUTDOWN, ...) 實現系統級關機。DateTimeToStr 將精度對齊至秒,避免毫秒誤差導致漏觸發。
此專案展示了 C++Builder 快速構建系統工具的能力,核心邏輯清晰,易於擴展(如新增休眠、重啟、鎖定工作站等選項)。