Hola,
Me váis a perdonar la tontería, al Hilo de lo que habéis propuesto:
Código Delphi
[-]
program PelotaLoca;
{$APPTYPE CONSOLE}
uses
Forms,
Windows,
Classes,
SysUtils,
Controls,
ExtCtrls,
Graphics;
const
MOVIMIENTO = 15;
var
FForm : TForm;
FShape : TShape;
type
TAuxiliar = class
private
FTimer: TTimer;
procedure TimerTick(Sender: TObject);
procedure KeyDownEvent(Sender: TObject;
var Key: Word; Shift: TShiftState);
public
constructor Create;
destructor Destroy; override;
end;
constructor TAuxiliar.Create;
begin
FTimer := TTimer.Create(nil);
FTimer.Enabled := true;
FTimer.Interval := 100;
FTimer.OnTimer := TimerTick;
end;
destructor TAuxiliar.Destroy;
begin
FTimer.Free;
inherited Destroy;
end;
procedure TAuxiliar.KeyDownEvent(Sender: TObject;
var Key: Word; Shift: TShiftState);
begin
with FShape do case Key of
VK_UP: Top := Top - MOVIMIENTO;
VK_RIGHT: Left := Left + MOVIMIENTO;
VK_DOWN: Top := Top + MOVIMIENTO;
VK_LEFT: Left := Left - MOVIMIENTO;
end;
end;
procedure TAuxiliar.TimerTick(Sender: TObject);
resourcestring
rsCaption = 'Top: %d - Left: %d';
begin
with FShape do
begin
FForm.Caption := Format(rsCaption, [Top, Left]);
if (Left > FForm.Width) then Left := 2;
if (Top > FForm.Height) then Top := 2;
if (Left < 0) then Left := (FForm.Width - Width);
if (Top < 0) then Top := (FForm.Height - Height);
if (GetKeyState(VK_UP) and $4000) > 0 then Top := Top - MOVIMIENTO;
if (GetKeyState(VK_DOWN) and $4000) > 0 then Top := Top + MOVIMIENTO;
if (GetKeyState(VK_LEFT) and $4000) > 0 then Left := Left - MOVIMIENTO;
if (GetKeyState(VK_RIGHT) and $4000) > 0 then Left := Left + MOVIMIENTO;
end;
end;
procedure Inicializar();
var
FAuxilar: TAuxiliar;
begin
FAuxilar := TAuxiliar.Create;
FForm := TForm.Create(nil);
FShape := TShape.Create(FForm);
with FForm do
begin
Width := 400;
Height := 300;
Color := clWhite;
KeyPreview := true;
BorderStyle := bsDialog;
Position := poDesktopCenter;
OnKeyDown := FAuxilar.KeyDownEvent;
end;
with FShape do
begin
Width := 20;
Height := 20;
Parent := FForm;
Brush.Color := clRed;
Pen.Color := clWhite;
Shape := stCircle;
Top := MOVIMIENTO;
Left := MOVIMIENTO;
end;
try
FForm.ShowModal;
finally
FForm.Free;
FAuxilar.Free;
end;
end;
begin
Inicializar();
end.