# Phase 4 — Formularmodell und Objektsprache ## Why Nach der Ereignisschleife (`phase-4-ereignisschleife`) fehlt der Sprache alles, worauf ein Formularprogramm zugreift: Formulare als Objekte, Steuerelemente als benannte Eigenschaftsträger, Ereignisprozeduren `Name_Ereignis` und die Sprachmittel aus Sprachreferenz §12 (`FORM`/`CONTROL`, `IF TYPEOF`, `$FORM`, `form!steuerelement`, `SCREEN`-Objekt). Heute kompiliert ein Formularprogramm nicht etwa mit einer Ablehnung, sondern **falsch**. Belegt an einem Dreizeiler: ``` Text1.Text = "hallo" -> Type mismatch (implizite SINGLE-Variable "Text1.Text") Form1.Show 1 -> Subprogram not defined UNLOAD Form1 -> Subprogram not defined ``` Der Lexer faltet den Punkt in den Bezeichner, die Semantik löst Punktpfade nur auf, wenn die Basis ein benutzerdefinierter Typ ist — sonst entsteht stillschweigend eine Variable namens `Text1.Text`. Das ist genau der Fall, den der Guiding Principle als Bug definiert: ein dokumentiertes Element wird ohne Namensnennung abgewiesen. Zusätzlich kollidiert der Container-Operator `form!steuerelement` mit dem Typsuffix `!` für SINGLE. Dazu kommt eine Lücke im Messinstrument: das Inventar führt zum Forms-Objektmodell **null** Einträge — weder `SHOW` noch `TYPEOF`, keine Eigenschaft, keine Steuerelementklasse. Es ist Abnahmekriterium für Phase 6 und läuft für den größten Teil der Phase 4 ins Leere. ## What Changes - **Objektsprache im Frontend**: Punktpfade auf Formulare und Steuerelemente (`Form1.Caption`, `Text1.Text`), der Container-Operator `form!steuerelement.eigenschaft` mit einer Auflösung der Kollision zum SINGLE-Suffix, die Datentypen `FORM` und `CONTROL` als Parametertypen, `IF TYPEOF ctl IS klasse`, der Metabefehl `$FORM` und die Ereignisprozeduren `SUB Name_Ereignis (…)` mit den Signaturen der Forms-Referenz. - **Namentliche Abweisung statt Falschübersetzung** (**BREAKING** für bestehende Diagnosen): Ein Punktpfad auf ein unbekanntes Objekt oder eine unbekannte Eigenschaft MUST das Objekt und die Eigenschaft namentlich nennen; eine implizite Variable mit Punkt im Namen MUST NOT mehr entstehen. - **Formularmodell zur Laufzeit**: Formulare mit Eigenschaften, Steuerelementbaum, Steuerelement-Arrays (`ctl(index%)`), Lade-/Entladezyklus (`LOAD`/`UNLOAD` mit `Form_Load`/`Form_Unload` und wirksamem `Cancel`), `SHOW [style%]` modeless und modal, `HIDE`, Sichtbarkeit und Z-Reihenfolge. - **Modalität**: `form.SHOW 1` gibt die Kontrolle erst zurück, wenn das Formular entladen oder verborgen wird; die Ereignisschleife läuft währenddessen weiter. Die Stapelregeln des Vorbilds lösen die Fehler 400–403 aus. - **Ereignisdispatch**: Ein Ereignis der Warteschlange findet die Prozedur `Name_Ereignis` des betroffenen Objekts und ruft sie mit den Argumenten ihrer Signatur auf; fehlt die Prozedur, verfällt das Ereignis wirkungslos. Die Zustellpunkte sind die der Ereignissteuerung, nicht neue. - **`SCREEN`-Objekt**: `ActiveControl`, `ActiveForm`, `Height`, `Width` (aktuelle Terminalgröße, Abweichung vom Vorbild), `MousePointer`, `ControlPanel`, `SHOW`/`HIDE`. - **Inventar deckt das Objektmodell** (**BREAKING** für das Inventarformat): Eigenschaften, Methoden und Ereignisse je Klasse werden mit eigener Quellenangabe (Forms-Referenz statt Themenliste der Hilfe) als Einträge geführt, damit die Leitplanke „Vollständigkeit ist das Soll" auch für Forms ein Maß hat. **Non-Goals:** Darstellung, Fokus, Tastatur- und Maussteuerung der einzelnen Steuerelemente sowie Menüs und Dialoge (Change `phase-4-steuerelemente`); das `.FRM`-Dateiformat (Change `phase-4-frm`); native Erweiterungssteuerelemente (Stufe 2). ## Capabilities ### New Capabilities - `forms-objektmodell`: Formulare und Steuerelemente als benannte Objekte mit Eigenschaften, Lade-/Entladezyklus, Sichtbarkeit und Modalität, Steuerelement-Arrays, Ereignisprozeduren und ihr Dispatch, `SCREEN`-Objekt. ### Modified Capabilities - `sprach-frontend`: Grammatik und Semantik SHALL Punktpfade auf Objekte, den Container-Operator, `FORM`/`CONTROL`, `TYPEOF`, `$FORM` und Ereignisprozeduren umfassen; ein Punktpfad MUST NOT mehr zu einer impliziten Variablen mit Punkt im Namen werden. - `sprachinventar`: Das Inventar SHALL neben den Elementen der Original-Hilfe auch das Forms-Objektmodell führen. ## Impact - `crates/tb-frontend`: Lexer (Punkt und `!` im Objektkontext), Parser (`TYPEOF`, `$FORM`, Ereignisprozedur-Signaturen), Semantik (Objektauflösung, Eigenschaftstypen, Ereignisprozedur-Erkennung). - `crates/tb-ui`: Formularmodell, Steuerelementbaum, Lade-/Entladezyklus, Dispatch — der Platzhalter `forms.rs` wird ausgefüllt. - `crates/tb-vm`: Aufruf von Ereignisprozeduren über den Rückrufweg aus `phase-4-ereignisschleife`; Fortsetzungspunkt für modales `SHOW`. - `crates/tb-runtime`: Fehler 362 und 400–403 als Auslöser. - `docs/`: `inventar.md` um das Objektmodell erweitert; `forms-referenz.md` um die belegten Detailfragen ergänzt; `sprachreferenz.md` §12 ausformuliert. - PLAN.md: Punkte „Formular-Modell" und „Ereignisdispatch" der Phase 4.