107 lines
5.1 KiB
Markdown
107 lines
5.1 KiB
Markdown
# 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.
|