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

=== Как заставить кнопку Enter работать наподобие Tab? ===
Как-то бухгалтер, который пользовался моей программой, заявил, что ему не удобно перескакивать пустые поля в форме кнопкой 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 подобным образом. 
Source: Взято из http://forum.sources.ru
ID: 01484
----
Существует множество методов решения этой проблемы, но самый быстрый способ, это перехват нажатия клавиш, перед тем как их получит форма:
В секции формы 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
Source: Взято из http://forum.sources.ru
ID: 01485
----
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;
Source: http://delphiworld.narod.ru/
ID: 01486
----
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;
Source: http://delphiworld.narod.ru/
ID: 01487
----
procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
begin
 if Key = #13 then
 begin
 SelectNext(Sender as TWinControl, True, True);
 Key := #0;
 end;
end;
Source: http://delphiworld.narod.ru/
ID: 01488
----
{ 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;
Source: Взято с сайта: http://www.swissdelphicenter.ch
ID: 01489