表單上有 `Edit1`、`Edit2` 兩個編輯框與一個 `BitBtn1`。
`Edit1.OnKeyPress`:按 Enter 時設 `Edit2.Text := 'Edit1有效'`。
`BitBtn1.OnClick`:設 `Edit2.Text := 'Edit1無效'`。
當 `BitBtn1.Kind = bkOK`(顯示綠色勾號)時,在 `Edit1` 按 Enter,**竟觸發 `BitBtn1.OnClick`**,導致顯示「Edit1無效」,`Edit1` 的 `OnKeyPress` 完全失效。
Delphi 表單的預設按鈕機制:
當某按鈕的 `Kind` 為 `bkOK`、`bkYes` 等「確認類」時,該按鈕成為表單的 **Default Button**(對應 `Form.DefaultButton` 屬性)。使用者在表單任一編輯框按 Enter,系統會模擬點擊該預設按鈕,直接觸發其 `OnClick` 事件,**繞過** 當前控制項的 `OnKeyPress`/`OnKeyDown` 等鍵盤事件。
| 方法 | 適用情境 | 操作步驟 |
|---|---|---|
| 移除預設按鈕行為 | 不需要 Enter 觸發按鈕 | 設 `BitBtn1.Kind = bkCustom`,或在 `FormCreate` 設 `Form1.DefaultButton := nil`。 |
| 在 OnKeyPress 處理 Enter 並設 Key = #0 | 需保留編輯框自行處理 Enter | procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
if Key = #13 then
begin
Edit2.Text := 'Edit1有效';
Key := #0; // 吞掉 Enter,阻止表單預設按鈕處理
end;
end; |
| 使用 Form.KeyPreview = True | 集中在表單層級攔截鍵盤 | 設 `Form.KeyPreview := True`,在 `FormKeyPress` 判斷 `ActiveControl` 為 `Edit1` 時處理 Enter。 |
同樣地,`Kind = bkCancel` 的按鈕會成為 `Form.CancelButton`,按 Esc 會觸發其 `OnClick`。此機制源自 Windows 對話框標準行為,Delphi 透過 `TForm` 封裝實現。