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

Автор: 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:= FindControl(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.
Как Вы можете видеть; этот код использует функцию FindControl, которая ищет следующий свободный контрол.
так как все формы в моём приложении наследуются от одной, то достаточно поместить этот код в главную форму и после этого все формы будут реагировать на нажатие Enter подобным образом.

Взято из http://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
Взято из http://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.FindControl(Form1.ActiveControl, true, true, true);
  (c as TWinControl).SetFocus;
 until
  c is TEdit;
end;

http://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;

http://delphiworld.narod.ru/ DelphiWorld 6.0

procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
begin
 if Key = #13 then
 begin
  Select(Sender as TWinControl, True, True);
  Key := #0;
 end;
end;

http://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;
Взято с сайта: http://www.swissdelphicenter.ch

Отправить комментарий

Проверка
Антиспам проверка
Image CAPTCHA
...