Как заставить кнопку Enter работать наподобие Tab?
Автор: Khaled Shagrouni
Как-то бухгалтер, который пользовался моей программой, заявил, что ему не удобно перескакивать пустые поля в форме кнопкой Tab, и что намного удобнее это делать обычным Enter-ом. Предлагаю посмотреть, как я решил эту проблемму.
Совместимость: Все версии Delphi
Пример обработчика события:
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 добавьте:
В секции IMPLEMENTATION добавьте:
Begin
If NOT (ActiveControl Is TButton) Then
If Msg.Charcode = 13 Then
Msg.Charcode := 9;
inherited;
End;
Тем самым мы исключаем срабатывания нашей подмены, если фокус находится на кнопке.
Чтобы ускорить работу приложения, не надо активизировать свойство формы KEYPREVIEW
Взято из http://forum.sources.ru
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
begin
if Key = Chr(VK_RETURN) then
begin
Perform(WM_NEXTDLGCTL,0,0);
key:= #0;
end;
end;
http://delphiworld.narod.ru/ DelphiWorld 6.0
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;
Отправить комментарий