首先我想提前道歉如果标题不清楚的话,我会解释的。我创建了一个形状,当你运行程序时,你可以通过移动鼠标来移动它:
procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); begin shape1.Left:=x; shape1.Top:=y; end; end.
事情是,我不喜欢它,用户必须使用他的鼠标移动的形状,所以我想这样做,按下键按钮向上,向下,左,右,键盘.谢谢
sycxhyv71#
只需将OnKeyDown事件处理程序添加到表单中:
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键来微调位置(具有像素精度)。
pokxtpni2#
好吧,我希望我能正确理解,因为我已经有一段时间没有做 Delphi 了,但是:- Form对象有一个KeyDown或KeyPressed事件,您可以对其做出React。- AFAIK表单上还有一个“KeyPreview”属性,必须设置为true才能正常工作。
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,然后使用以下代码:
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解决方案。
3条答案
按热度按时间sycxhyv71#
只需将
OnKeyDown
事件处理程序添加到表单中:你甚至可以
以便用户可以通过按住Shift键来微调位置(具有像素精度)。
pokxtpni2#
好吧,我希望我能正确理解,因为我已经有一段时间没有做 Delphi 了,但是:- Form对象有一个KeyDown或KeyPressed事件,您可以对其做出React。- AFAIK表单上还有一个“KeyPreview”属性,必须设置为true才能正常工作。
y3bcpkx13#
这是一个FireMonkey(FMX)解决方案。
只需将
OnKeyDown
事件处理程序添加到表单中:你甚至可以
以便用户可以通过按住Shift键来微调位置(具有像素精度)。
还有一种方法可以使用
TTimer
组件来实现这一点。将TTimer
组件放置到Form
上,并将Interval
设置为1
,然后使用以下代码:我个人更喜欢
TTimer
解决方案。