an other approach.

[pascal]TPojectile = record
x, y : single;
Image : TBitmap;
SpeedX, SpeedY : single;
end;[/pascal]

...or...

[pascal]TPojectile = class
Image: TBitmap;
SpeedX, SpeedY : single;
end;[/pascal]

...or...

[pascal]TPojectile = class(TBitmap)
SpeedX, SpeedY : single;
end;[/pascal]

...and...

I'm not really a fan of using fixed-arrays, but if you are sure you maximum have 10 projectiles (or a fixed maximum amount), that you can indeed use a fixed array. Here is dynamic a more dynamic approach with a TList object. (Would be nicer if pascal has generics, than you could declare it like TList<TProjectile>.
[pascal]Projectiles : TList;

procedure InitGame()
begin
Projectiles := TList.Create;
end;

procedure Shoot()
begin
Projectiles.Add(Projectile.Create(x, y, speed, etc...));
end;

procedure UpdateProjectiles()
var i : integer;
p : TProjectile;
begin
for i := 0 to Projectiles.Count-1 do
begin
p := TProjectile(Projectiles.Items[i]);
p.x := p.x + p.speedx;
p.y := p.y + p.speedy;
end;
end;

procedure OnProjectilehitSomething(ProjectileInstance : TProjectile)
begin
SpawnMagicalEffectThingy(ProjectileInstance .x, ProjectileInstance .y);
Projectiles.Remove(ProjectileInstance);
end;
[/pascal]