如何使用按键移动形状:上,左,下,右在 Delphi

xu3bshqb  于 2023-05-06  发布在  其他
关注(0)|答案(3)|浏览(225)

首先我想提前道歉如果标题不清楚的话,我会解释的。
我创建了一个形状,当你运行程序时,你可以通过移动鼠标来移动它:

procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
shape1.Left:=x;
shape1.Top:=y;
end;

end.

事情是,我不喜欢它,用户必须使用他的鼠标移动的形状,所以我想这样做,按下键按钮向上,向下,左,右,键盘.
谢谢

sycxhyv7

sycxhyv71#

只需将OnKeyDown事件处理程序添加到表单中:

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  case Key of
    VK_UP:
      Shape1.Top := Shape1.Top - 10;
    VK_DOWN:
      Shape1.Top := Shape1.Top + 10;
    VK_LEFT:
      Shape1.Left := Shape1.Left - 10;
    VK_RIGHT:
      Shape1.Left := Shape1.Left + 10;
  end;
end;

你甚至可以

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
var
  Delta: integer;
begin
  if ssShift in Shift then
    Delta := 1
  else
    Delta := 10;
  case Key of
    VK_UP:
      Shape1.Top := Shape1.Top - Delta;
    VK_DOWN:
      Shape1.Top := Shape1.Top + Delta;
    VK_LEFT:
      Shape1.Left := Shape1.Left - Delta;
    VK_RIGHT:
      Shape1.Left := Shape1.Left + Delta;
  end;
end;

以便用户可以通过按住Shift键来微调位置(具有像素精度)。

pokxtpni

pokxtpni2#

好吧,我希望我能正确理解,因为我已经有一段时间没有做 Delphi 了,但是:- Form对象有一个KeyDown或KeyPressed事件,您可以对其做出React。- AFAIK表单上还有一个“KeyPreview”属性,必须设置为true才能正常工作。

y3bcpkx1

y3bcpkx13#

这是一个FireMonkey(FMX)解决方案。
只需将OnKeyDown事件处理程序添加到表单中:

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; var KeyChar: Char; Shift: TShiftState);
begin
  case Key of
    vkUp: Shape1.Position.Y := Shape1.Position.Y - 10;
    vkDown: Shape1.Position.Y := Shape1.Position.Y + 10;
    vkLeft: Shape1.Position.X := Shape1.Position.X - 10;
    vkRight: Shape1.Position.X := Shape1.Position.X + 10;
  end;
end;

你甚至可以

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; var KeyChar: Char; Shift: TShiftState);
begin
  var Delta: Integer := 10;
  if ssShift in Shift then Delta := 1;

  case Key of
    vkUp: Shape1.Position.Y := Shape1.Position.Y - Delta;
    vkDown: Shape1.Position.Y := Shape1.Position.Y + Delta;
    vkLeft: Shape1.Position.X := Shape1.Position.X  - Delta;
    vkRight: Shape1.Position.X := Shape1.Position.X  + Delta;
  end;
end;

以便用户可以通过按住Shift键来微调位置(具有像素精度)。
还有一种方法可以使用TTimer组件来实现这一点。将TTimer组件放置到Form上,并将Interval设置为1,然后使用以下代码:

var
  Form1: TMainForm;
  UpPressed: Boolean;
  DownPressed: Boolean;
  LeftPressed: Boolean;
  RightPressed: Boolean;

implementation

{$R *.fmx}

procedure TForm1.FormCreate(Sender: TObject);
begin
  UpPressed := False;
  DownPressed := False;
  LeftPressed := False;
  RightPressed := False;
end;

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; var KeyChar: Char; Shift: TShiftState);
begin
  case Key of
    vkUp: UpPressed := True;
    vkDown: DownPressed := True;
    vkLeft: LeftPressed := True;
    vkRight: RightPressed := True;
  end;
end;

procedure TForm1.FormKeyUp(Sender: TObject; var Key: Word; var KeyChar: Char; Shift: TShiftState);
begin
  case Key of
    vkUp: UpPressed := False;
    vkDown: DownPressed := False;
    vkLeft: LeftPressed := False;
    vkRight: RightPressed := False;
  end;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  if UpPressed then Shape1.Position.Y := Shape1.Position.Y - 10;
  if LeftPressed then Shape1.Position.X := Shape1.Position.X - 10;
  if RightPressed then Shape1.Position.X := Shape1.Position.X + 10;
  if DownPressed then Shape1.Position.Y := Shape1.Position.Y + 10;
end;

我个人更喜欢TTimer解决方案。

相关问题