Sources
Delphi Russian Knowledge Base
DRKB - это самая большая и удобная в использовании база знаний по Дельфи в рунете, составленная Виталием Невзоровым

Как перехватить нажатия функциональных клавиш и стрелок?

01.01.2007

Автор: Arx ( http://arxoft.tora.ru )

Проверяйте значение переменной key на равенство VK_RIGHT, VK_LEFT, VK_F1 и т.д. на событии KeyDown формы

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
 
if Key = VK_RIGHT then
    Form1
.Caption := 'Right';
 
if Key = VK_F1 then
    Form1
.Caption := 'F1';
end;

Взято из https://forum.sources.ru


Обработка нажатий клавиш вверх-вниз

Автор: Галимарзанов Фанис 

Почти всегда требуется обработка нажатий клавиш "вверх-вниз" для смены фокуса ввода - мои "тетки-юзеры" боются мышей, да и сам я не любитель комбинаций мышь-клавиатура.

procedure TfmAbProps.edNameKeyDown(Sender: TObject; var Key: Word;
 
Shift: TShiftState);
begin
 
if (Key = vk_down) and
   
not (ssAlt in Shift)
     
{// здесь обработка для "выпадающих" окошек типа TRxDBCalcEdit} then
 
begin
   
Key := 0;
   
SelectNext(Sender as TWinControl, true, true);
 
end
 
else if Key = vk_up then
 
begin
   
Key := 0;
   
SelectNext(Sender as TWinControl, false, true);
 
end;
end;

Для элементов редактирования типа TDbEdit, TRxDBCalcEdit or TDBDateEdit назначим

OnKeyDown:=edNameKeyDown 

Сложнее с типами вроде TRxDBLookupCombo. Наш прежний обработчик для них не подходит. Я пытался изменить характер TRxDBLookupCombo - но вовремя опомнился - есть же FormKeyDown;

procedure TfmAbProps.FormKeyDown(Sender: TObject; var Key: Word;
 
Shift: TShiftState);
begin
 
if (ActiveControl is TRxDBLookupCombo) then
 
begin
   
if Key = vk_down then
   
begin
     
if not (ssAlt in Shift) and not
       
// здесь нельзя обработать нажатие при вызове "выпадающего"
     
(ActiveControl as TRxDBLookupCombo).IsDropDown then
     
begin // и в случае уже "выпвшего"
       
Key := 0;
        selectnext
(ActiveControl, true, true);
     
end;
   
end
   
else if Key = vk_up then
   
begin
     
if not (ActiveControl as TRxDBLookupCombo).IsDropDown then
     
begin
       
Key := 0;
        selectnext
(ActiveControl, false, true);
     
end;
   
end;
 
end;
end;
https://delphiworld.narod.ru/

DelphiWorld 6.0


//Автор: Cheers, Julian (TeamB & TurboPower Software) 
 
 
 
procedure
WMGetDlgCode(var Msg : TMessage); message WM_GETDLGCODE;
 
...
 
procedure
TMyControl.WMGetDlgCode(var Msg : TMessage);
begin
 
Msg.Result := DLGC_WANTARROWS;
end;
https://delphiworld.narod.ru/

DelphiWorld 6.0


Автор: Robert Wittig

Вы можете перехватывать нажатие курсорных клавиш на уровне приложения:

Создайте HandleMessages как метод формы и затем назначьте его Application.HandleMessages.

procedure tForm1.HandleMessages(var Msg: tMsg; var Handled: Boolean);
begin
 
if (Msg.Message = WM_KeyDown) and
   
(Msg.wParam in [VK_UP, VK_DOWN, VK_LEFT, VK_RIGHT]) then
 
begin
   
case Msg.wParam of
      VK_UP
: ShowMessage('Нажата стрелка вверх');
      VK_DOWN
: ShowMessage('Нажата стрелка вниз');
      VK_LEFT
: ShowMessage('Нажата стрелка влево');
      VK_RIGHT
: ShowMessage('Нажата стрелка вправо');
   
end;
   
Handled := True;
 
end;
end;
 
procedure TForm1
.FormCreate(Sender: TObject);
begin
 
Application.OnMessage := HandleMessages;
end;
https://delphiworld.narod.ru/

DelphiWorld 6.0