Und hier die Erklärung, warum hier ein Timer genutzt werden soll/muss:
Zunächst einmal Terminologie: Diese "Objekte" heißen
Controls (die Basis dafür ist
TControl).
Das
VCL-Framework arbeitet wie folgt:
Ändert sich etwas an einem Control, dass für die Darstellung relevant ist, dann wird dieses Control für das erneute Zeichnen vorgemerkt (
TControl.Invalidate).
Dieses Neuzeichnen erfolgt genau dann, wenn die Anwendung in den
Idle-Zustand kommt.
Der
Idle-Zustand wird immer dann erreicht, wenn die Nachrichten-Warteschlange komplett abgearbeitet wurde.
Beim Aufruf einer Routine wird diese Warteschlange
nicht abgearbeitet.
Man kann dieses erzwingen durch den Aufruf von
Application.ProcessMessages
(
TApplication.ProcessMessages) innerhalb der Routine.
Ein Neuzeichnen kann man auch direkt erzwingen durch den Aufruf von
TControl.Repaint.
Das ist aber alles insgesamt
nicht zu empfehlen, denn die Anwendung reagiert entweder evtl. unkontrolliert durch
Application.ProcessMessages
(Mehrfachaufruf der Bewegungsroutine) oder reagiert auf gar nichts mehr, bis die Routine abgearbeitet ist.
Eine Anwendung soll aber in keinem Fall
unkontrolliert oder
eingefroren wirken.
Generell soll eine Anwendung im UI (
User
Interface) immer reagieren können und bei Bedarf nur gewisse Aktionen verbieten.