I think I might have a solution to your problem. Compiled in Delphi 6 and I changed the following:

In your bullet.move procedure instead of calling free, call dead and then in your onTimer event call engine.dead.

Let me know if this works

But...even though the error is fixed your game seems to run slower after a while so something is not freed properly....