首先,如果标题不清楚,我想提前道歉,所以我会解释。
我创建了一个形状,您可以在运行程序时通过四处移动鼠标来移动它:
procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
shape1.Left:=x;
shape1.Top:=y;
end;
end.
问题是,我不喜欢用户必须使用他的鼠标来移动形状,所以我想通过按键盘上、下、左、右的键按钮来完成。
谢谢
只需在表单中添加一个
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 键来微调位置(具有像素精度)。
好吧,我希望我做对了,因为自从我不得不使用 Delphi 以来已经有一段时间了,但是: - Form 对象有一个您可以响应的 KeyDown 或 KeyPressed 事件。 - AFAIK 表单上还有一个“KeyPreview”属性,必须将其设置为 true 才能正常工作。
这是一个 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
解决方案。