Как заставить кнопку Enter работать наподобие Tab? |
Previous Top Next |
Автор: Khaled Shagrouni
Как-то бухгалтер, который пользовался моей программой, заявил, что ему не удобно перескакивать пустые поля в форме кнопкой Tab, и что намного удобнее это делать обычным Enter-ом. Предлагаю посмотреть, как я решил эту проблемму.
Совместимость: Все версии Delphi
Пример обработчика события:
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 подобным образом.
©Drkb::01484
Взято из http://forum.sources.ru
Существует множество методов решения этой проблемы, но самый быстрый способ, это перехват нажатия клавиш, перед тем как их получит форма:
В секции формы 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
©Drkb::01485
Взято из http://forum.sources.ru
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; |
©Drkb::01486
DelphiWorld 6.0
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; |
©Drkb::01487
DelphiWorld 6.0
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; |
©Drkb::01488
DelphiWorld 6.0
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; |
©Drkb::01489
Взято с сайта: http://www.swissdelphicenter.ch