Sources
Delphi Russian Knowledge Base
DRKB - это самая большая и удобная в использовании база знаний по Дельфи в рунете, составленная Виталием Невзоровым

Как заставить кнопку Enter работать наподобие Tab?

01.01.2007

Автор: Khaled Shagrouni

Как-то бухгалтер, который пользовался моей программой, заявил, что ему не удобно перескакивать пустые поля в форме кнопкой Tab, и что намного удобнее это делать обычным Enter-ом. Предлагаю посмотреть, как я решил эту проблемму.

Совместимость: Все версии Delphi

Пример обработчика события:

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 подобным образом.

Взято из https://forum.sources.ru


Существует множество методов решения этой проблемы, но самый быстрый способ, это перехват нажатия клавиш, перед тем как их получит форма:

В секции формы PRIVATE добавьте:

Procedure CMDialogKey(Var Msg:TWMKey); message CM_DIALOGKEY; 

В секции IMPLEMENTATION добавьте:

Procedure TForm1.CMDialogKey(Var Msg: TWMKey); 
Begin
If NOT (ActiveControl Is TButton) Then
If Msg.Charcode = 13 Then
Msg.Charcode := 9;
inherited
;
End;

Тем самым мы исключаем срабатывания нашей подмены, если фокус находится на кнопке.

Чтобы ускорить работу приложения, не надо активизировать свойство формы KEYPREVIEW

Взято из https://forum.sources.ru


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;
https://delphiworld.narod.ru/

DelphiWorld 6.0


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;
https://delphiworld.narod.ru/

DelphiWorld 6.0


procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
begin
 
if Key = #13 then
 
begin
   
SelectNext(Sender as TWinControl, True, True);
   
Key := #0;
 
end;
end;
https://delphiworld.narod.ru/

DelphiWorld 6.0


{ 
 
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;

Взято с сайта: https://www.swissdelphicenter.ch