# 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.
