Is there a way of automatically stopping a timer after a certain time without using a button click or another timer?
Like others said, you can use a simple counter inside the timer. Or, to account for time drifts (since TTimer is not a real-time timer), I would get the current time/ticks when starting the timer and then inside the timer check if the desired end time/ticks has passed.
I assume I can't use
from inside the Timer1.Timer procedure.
You assume incorrectly. You most certainly CAN do that.
because then the Timer1.Timer procedure can't complete since the timer will have been disabled.
The timer has ALREADY elapsed and your procedure is ALREADY running. Disabling the timer from inside your procedure won't change that. All it will do is stop the timer from firing any further events.
I had assumed that it was a bad idea to interrupt procedures in the middle of their execution before they have reached the final 'end; - i.e. have not completed (produces spaghetti code?).
You are not interrupting anything. You are simply telling the timer to remove itself from being scheduled by the OS for any further OnTimer events. Your procedure itself is still running and will continue running its code to its end naturally, eg:
procedure TForm1.Timer1Timer(Sender: TObject);
begin
// code here runs normally...
// code here runs normally...
Timer1.Enabled := false;
// code here runs normally...
// code here runs normally...
// code here runs normally...
end;