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

5.1 KiB
Raw Blame History

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.