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

Материал из DRKB

Как заставить кнопку 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