Ich habe das gefühl du strukturierst dein Programm wie ein Kommandozeilen-Programm bzw,. Konsolen-Programm.
Die
GUI ist aber Ereignis getrieben, bzw. Thread getrieben.
Das Application Framework hat eine Message Queue.
Wenn du "MessageDlg" oder "showmessage" aufrufst ist das Non-Blocking. Das heißt, die Funktion hinterlegt in der Warteschlange, dass du nen Dialog angezeigt haben willst, wie der konfiguriert wird und welcher Code danach ausgeführt werden soll.
Wenn dein For-Schleifen Code abgearbeitet ist und das Ereignis das deinen Code aufgerufen hat abgearbeitet ist, dann wird das nächste Ereignis aus der Warteschleife abgearbeitet, und irgendwann kommen dann deine Dialoge dran.
Der Timer setzt wenn er enabled wird alle so und so viel millisekunden eine Nachricht auf die Warteschlange, dass ein Ereignis ausgeführt werden soll.
Du musst nicht eine "Eingabe-Verarbeitung-Ausgabe-Wiederholen" struktur anlegen, denn das Framework hat das alles schon. Das Framework erlaubt dir Callback Proceduren zu hinterlegen , sogenannte Events.