Frame1.Label1 := 'a'; <<< erkennt er nicht
Der Grund ist recht einfach. Es kann ja sein das du mehrere Formulare hast und wenn du einfach Frame1.Irgendwas schreibst weiß weder der Compiler noch sonst wer wo sich der Frame befindet (er könnte ja auch auf Form2 liegen).
Daher muss es dann natürlich heißen
Form1.Frame1.Label1 := 'a';
Das funktioniert natürlich nur wenn der Frame auch auf Form1 liegt.
ALLERDINGS solltest du das niemals direkt aus dem Thread heraus machen sondern nur innerhalb einer Methode die du vorher mit Syncronize aufgerufen hast. Ansonsten passiert es ganz schnell das an irgendwelchen unerwarteten Stellen plötzlich Fehler auftreten.
Der Grund dafür ist das die
VCL größtenteils nicht Threadsicher ist. Das heißt die Grafikkomponenten auf deinem Formular laufen in einem Thread und wenn du von einem anderen Thread aus direkt darauf zugreifst entstehen "wunderschöne" Fehler. Mit Syncronize innerhalb des Threads erreichst du das der Thread mit dem Formular-Thread (also dem Hauptthread) syncronisiert wird bzw. deine Befehle im Kontext des Hauptthreads ausgeführt werden.