Phase 4: Formularmodell und Objektsprache

This commit is contained in:
2026-09-04 17:30:32 +02:00
parent 5cf5a6582c
commit 54488b5b67
35 changed files with 7195 additions and 627 deletions

View File

@@ -0,0 +1,106 @@
# 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
400403 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 400403 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.