返回

Delphi FMX Android 上如何检测 Enter 键?

Android

如何在Delphi FMX Android上检测Enter键

问题概述

在Delphi FMX中,当物理键盘上的Enter键被按下时,在OnKeyDownOnKeyUp事件中无法获取该键值,因为没有收到任何值表示vkReturn键已被按下。

解决方法

1. 禁用硬件键盘

首先,禁用硬件键盘,这样我们就可以使用键盘组件来处理按键事件:

Keyboard.HandleHardwareKeyboard := False;

2. 订阅OnKeyUp事件

接下来,订阅Form.OnKeyUp事件,并在其中检查是否按下了Enter键:

procedure TMyForm.FormKeyUp(Sender: TObject; var Key: Word; var Shift: TShiftState);
begin
  if Key = VK_RETURN then
  begin
    // Enter键按下时执行的操作
  end;
end;

代码示例

unit Unit1;

interface

uses
  System.SysUtils, System.Classes, System.UITypes,
  FMX.Forms, FMX.Controls, FMX.Edit;

type
  TMyForm = class(TForm)
    private
      procedure FormCreate(Sender: TObject);
      procedure FormKeyUp(Sender: TObject; var Key: Word; var Shift: TShiftState);
  public
  end;

var
  MyForm: TMyForm;

implementation

{$R *.fmx}

procedure TMyForm.FormCreate(Sender: TObject);
begin
  inherited;
  // 禁用硬件键盘
  Keyboard.HandleHardwareKeyboard := False;
end;

procedure TMyForm.FormKeyUp(Sender: TObject; var Key: Word; var Shift: TShiftState);
begin
  if Key = VK_RETURN then
  begin
    // Enter键按下时执行的操作
  end;
end;

end.

优势

此方法的主要优点是,它不需要修改Android设备的Generic.kl文件,也不依赖于设备是否已植根。

其他注意事项

  • 确保在Form.Create事件中禁用硬件键盘。
  • Form.KeyUp事件中检查VK_RETURN键值以检测Enter键是否被按下。
  • 此方法依赖于Keyboard.HandleHardwareKeyboard,它仅在FMX 3+版本中可用。

常见问题解答

  • 为什么我的代码不起作用?

    • 确保已禁用硬件键盘,并在Form.KeyUp事件中正确检查了VK_RETURN键值。
  • 我收到编译错误,说Keyboard未定义。

    • 确保已包含System.UITypes单元。
  • 为什么我无法在Form.KeyDown事件中捕获Enter键?

    • 此方法仅在Form.KeyUp事件中有效,因为当Enter键按下时,硬件键盘不会发送任何按键事件。
  • 我是否可以将此方法用于其他键?

    • 是的,您可以使用相同的技术来检测其他按键,只需在Form.KeyUp事件中检查适当的键值即可。
  • 我需要了解哪些其他技术来处理键盘事件?

    • 除了OnKeyUpOnKeyDown事件外,你还可以使用OnKeyPress事件来检测键盘事件。