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

 

http://delphiworld.narod.ru/

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

http://delphiworld.narod.ru/

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

http://delphiworld.narod.ru/

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