Files
TerminalBasic/openspec/changes/archive/2026-09-04-phase-4-objektmodell/proposal.md

107 lines
5.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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.