interface // ラベルを1個貼り付けて そのラベルを動かすコード
uses Windows, Messages, SysUtils,Classes, Graphics, Controls, Forms, StdCtrls;
type TMoveItem= record
   x,y,vx,vy,ax,ay:double;
   obj:TObject;
end;
TForm1 = class(TForm)
  Label1: TLabel;
  procedure FormCreate(Sender: TObject);
 private
  oldTime:DWORD;
  items:array [0..0] of TMoveItem;
 procedure Idle(Sender: TObject; var Done: Boolean);
 public
 end;
var Form1: TForm1;
implementation
{$R *.dfm}
var Clip:TRect;
procedure ExecMoveItem(var items:TMoveItem;dt:double);
begin
with items do begin
x:=x+vx*dt;    y:=y+vy*dt;
vx:=vx+ax*dt; vy:=vy+ay*dt;
if (round(x)<Clip.Left ) and (vx<0) then vx:=-vx;
if (round(x)>Clip.Right ) and (vx>0) then vx:=-vx;
if (round(y)<Clip.Top  ) and (vy<0) then vy:=-vy;
if (round(y)>Clip.Bottom) and (vy>0) then vy:=-vy;
   if  obj is TControl then
   with obj as TControl do begin Top:=Round(y);Left:=Round(x);end
else //ここに他のアイテムの動きを増やしてゆく
   ;
end;
end;

procedure TForm1.Idle(Sender: TObject; var Done: Boolean);
var t:DWORD; dt:Double; i:Integer;
begin
t:=GetTickCount; dt:=(t-oldTime)/1000.0;oldTime:=t;
if dt>0 then begin
 for i:=0 to High(items) do ExecMoveItem(Items[i],dt);
 end else  Sleep(33);
Done:= False;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin  Application.OnIdle:=Idle;
oldTime:=GetTickCount;
Clip:=ClientRect;
  with items[0] do begin
  obj:=Label1;
  x:=Label1.Left;
  y:=Label1.Top;
  vx:=20; vy:=-13;
  ay:=9.8; ax:=0.001;
  end;
 // ちらつきを減らすなら DoubleBuffered:=True;
end;
end.