加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

delphi – 如何读取键输入?

发布时间:2020-12-15 09:18:40 所属栏目:大数据 来源:网络整理
导读:我想要一个关键控制相机. 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
我想要一个关键控制相机. 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;

解决方法

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

请改用TForm.OnKeyDown或TForm.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的请求添加;他是找到它并在评论中发布到我的答案的人):

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;

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读