Содержание материала

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

 Совместимость: Все версии Delphi. Автор: Khaled Shagrouni

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

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

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

 


В секции формы 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

 

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;

 


 

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;

 

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;

  

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;

Добавить комментарий

Не использовать не нормативную лексику.

Просьба писать ваши замечания, наблюдения и все остальное,
что поможет улучшить предоставляемую информацию на этом сайте.

ВСЕ КОММЕНТАРИИ МОДЕРИРУЮТСЯ ВРУЧНУЮ, ТАК ЧТО СПАМИТЬ БЕСПОЛЕЗНО!


Защитный код
Обновить