Как-то бухгалтер, который пользовался моей программой, заявил, что ему не удобно перескакивать пустые поля в форме кнопкой Tab, и что намного удобнее это делать обычным Enter-ом. Предлагаю посмотреть, как я решил эту проблемму.
Совместимость: Все версии Delphi. Автор: Khaled Shagrouni
Пример обработчика события:
Code: |
procedure Tform1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); var ACtrl: TWinControl; begin if key = 13 then begin ACtrl := ActiveControl; if ACtrl is TCustomMemo then exit; repeat ACtrl:= FindNextControl(ACtrl,true,true,false); until (ACtrl is TCustomEdit) or (ACtrl is TCustomComboBox) or (ACtrl is TCustomListBox) or (ACtrl is TCustomCheckBox) or (ACtrl is TRadioButton); ACtrl.SetFocus ; end; end; |
Не забудьте установить свойство формы KeyPreview в true.
Как Вы можете видеть; этот код использует функцию FindNextControl, которая ищет следующий свободный контрол.
так как все формы в моём приложении наследуются от одной, то достаточно поместить этот код в главную форму и после этого все формы будут реагировать на нажатие Enter подобным образом.
Существует множество методов решения этой проблемы, но самый быстрый способ, это перехват нажатия клавиш, перед тем как их получит форма:
В секции формы PRIVATE добавьте:
Code: |
Procedure CMDialogKey(Var Msg:TWMKey); message CM_DIALOGKEY; |
В секции IMPLEMENTATION добавьте:
Code: |
Procedure TForm1.CMDialogKey(Var Msg: TWMKey); Begin If NOT (ActiveControl Is TButton) Then If Msg.Charcode = 13 Then Msg.Charcode := 9; inherited; End; |
Тем самым мы исключаем срабатывания нашей подмены, если фокус находится на кнопке.
Чтобы ускорить работу приложения, не надо активизировать свойство формы KEYPREVIEW
Code: |
procedure TForm1.FormCreate(Sender: TObject); begin Form1.KeyPreview := true; end;
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); var c: TControl; begin if Key <> 13 then Exit; repeat c := Form1.FindNextControl(Form1.ActiveControl, true, true, true); (c as TWinControl).SetFocus; until c is TEdit; end; |
Code: |
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char); begin if Key = Chr(VK_RETURN) then begin Perform(WM_NEXTDLGCTL,0,0); key:= #0; end; end; |
Code: |
procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char); begin if Key = #13 then begin SelectNext(Sender as TWinControl, True, True); Key := #0; end; end; |
Code: |
{ This code gives the key the same habbit as the key to change focus between Controls. }
// Form1.KeyPreview := True !
procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char); begin if Key = #13 then begin Key := #0; { check if SHIFT - Key is pressed } if GetKeyState(VK_Shift) and $8000 <> 0 then PostMessage(Handle, WM_NEXTDLGCTL, 1, 0) else PostMessage(Handle, WM_NEXTDLGCTL, 0, 0); end; end; |
Просьба писать ваши замечания, наблюдения и все остальное,
что поможет улучшить предоставляемую информацию на этом сайте.
ВСЕ КОММЕНТАРИИ МОДЕРИРУЮТСЯ ВРУЧНУЮ, ТАК ЧТО СПАМИТЬ БЕСПОЛЕЗНО!