【问题标题】:How to read key input?如何读取按键输入?
【发布时间】:2013-07-31 12:36:01
【问题描述】:

我正在尝试拥有一个键控摄像头。 TForm 没有 Onkeypress,所以我如何从键盘读取此输入?

procedure TForm2.FormKeyPress(Sender: TObject; var Key: Char);
var
  ok: boolean;
begin
  ok := true;
  case Key of
    'a': camera1.Position.y:=camera1.Position.y+1;
    'A': camera1.Position.y:=camera1.Position.y+1;
    'd': camera1.Position.y:=camera1.Position.y-1;
    'D': camera1.Position.y:=camera1.Position.y-1;
    'w': camera1.Position.X:=camera1.Position.X-1;
    'W': camera1.Position.X:=camera1.Position.X-1;
    'x': camera1.Position.X:=camera1.Position.X+1;
    'X': camera1.Position.X:=camera1.Position.X+1;
    'q': camera1.RotationAngle.z := camera1.RotationAngle.z-1;
    'Q': camera1.RotationAngle.z := camera1.RotationAngle.z-1;
    'e': camera1.RotationAngle.z := camera1.RotationAngle.z+1;
    'E': camera1.RotationAngle.z := camera1.RotationAngle.z+1;
    'z': camera1.Position.z:=camera1.Position.z+1;
    'Z': camera1.Position.z:=camera1.Position.z+1;
    'c': camera1.Position.z:=camera1.Position.z-1;
    'C': camera1.Position.z:=camera1.Position.z-1;
    else
      ok := false;
  end; {case}
  //if ok then
   // Invalidate;
  positionChange(camera1);
  RotationAngleChange(camera1);
end;

【问题讨论】:

  • TForm 有事件 OnKeyDown 和 OnKeyUp (XE3, XE4)。
  • 使用 xe2 将添加该标签 :(
  • 事件中也缺少 OnKeyDown
  • @TLama 我认为文档非常真实......并讲述了公开的事件,但它们必须发布才能成为在 OI 内可见
  • Ok XE2 Update 4 Hotfix 1 并且在 OI OnKeyDown,OnKeyUp,OnKeyUp,OnMouse... 中可见更多事件,所以这个问题针对的是一个已修复的错误

标签: delphi delphi-xe2 firemonkey


【解决方案1】:

更新到最新版本的 XE2(AFAIK Update 4 Hotfix 1)和

请改用 TForm.OnKeyDownTForm.OnKeyUp 事件。这是我使用的快速测试:

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; var KeyChar: Char;
  Shift: TShiftState);
begin
  case KeyChar of
    'A'..'Z', 'a'..'z': Caption := 'Got an alpha ' + KeyChar;
    '0'..'9': Caption := 'Got a number ' + KeyChar;
  else
    Caption := 'Got something else ' + KeyChar;
  end;
  KeyChar := #0;
end;

根据Embarcadero forums post,在没有上述更新的 XE2 中,您需要实际覆盖 TForm.KeyDown 事件(根据 @TLama 的请求添加;他是找到它并在 cmets 中发布我的答案的人):

type
  TForm1 = class(TForm)
    Memo1: TMemo;
  private
  public
    procedure KeyDown(var Key: Word; var KeyChar: Char; 
      Shift: TShiftState); override;
  end;

implementation

procedure TForm1.KeyDown(Sender: TObject; var Key: Word; var KeyChar: Char;
  Shift: TShiftState);
begin
  case KeyChar of
    'A'..'Z', 'a'..'z': Caption := 'Got an alpha ' + KeyChar;
    '0'..'9': Caption := 'Got a number ' + KeyChar;
  else
    Caption := 'Got something else ' + KeyChar;
  end;
  KeyChar := #0;
end;

(请注意,您可以稍微缩短代码):

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; var KeyChar: Char;
  Shift: TShiftState);
begin
  ok := true;
  case KeyChar of
    'A', 'a': camera1.Position.y:=camera1.Position.y+1;
    'D', 'd': camera1.Position.y:=camera1.Position.y-1;
    'W', 'w': camera1.Position.X:=camera1.Position.X-1;
    'X', 'x': camera1.Position.X:=camera1.Position.X+1;
    'Q', 'q': camera1.RotationAngle.z := camera1.RotationAngle.z-1;
    'E', 'e': camera1.RotationAngle.z := camera1.RotationAngle.z+1;
    'Z', 'z': camera1.Position.z:=camera1.Position.z+1;
    'C', 'c': camera1.Position.z:=camera1.Position.z-1;
  else
    ok := false;
  end; {case}
  if ok then
  begin
   // Invalidate;
   KeyChar := #0;  // Remove keystroke, because you've handled it
  end;
  positionChange(camera1);
  RotationAngleChange(camera1);      
end;

【讨论】:

  • Treid 刚才,同样的事情......我已经添加了一个 showmessage() 来查看是否甚至调用了该事件而不是它。在事件下的对象检查器中也看不到 formkeydown 或 formkeyup
  • 那么你还有其他事情发生,因为(正如我所说)我用我发布的代码进行了测试,并在我输入一个字母、一个数字和一个 @ 符号时看到了标题更新.
  • 你用 fmx 和 xe2 测试过吗?
  • 等等。我站得更正了。它不在 XE2 中(我错过了那个标签,并且错误地使用了 XE4)。我会尽快删除我的答案,除非我能找到解决方法。
  • 我得到了 TLama 和 Rufo 爵士的帮助,将这些碎片拼凑在一起。 :-)
猜你喜欢
  • 1970-01-01
  • 2015-05-01
  • 1970-01-01
  • 2018-12-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-21
相关资源
最近更新 更多