Hi, krull!
I really like that you're making a computer game! It's really fun!
I'll make you some code suggestions, if you don't mind.
1. Never call Enemy1.destroy(); explicitly. Always use FreeAndNil(Enemy1) or Enemy1.Free.
2. "random( 8 )=8" will never happen, because Random( 8 ) provides random numbers from 0 to 7. 8 is not included.
3. Don't forget to FreeAndNil(heartPosTimer) in THeart.destroy.
Disabling heartPosTimer works because heartPosTimer calls back to THeart which may already be destroyed. Freeing heartPosTimer in THeart.destroy should solve this issue correctly. However, I'm not sure you're doing the right program "structure".
Maybe, you'd better make some global game-cycle which will draw all the sprites on-screen once per frame, not based on timers or threads, which are hard to debug.