Phase 0: Referenzdokumente, Fehlerkatalog, Testkorpus, Ratatui-Spike

Entscheidungen festgehalten: TBVM bestaetigt und eingebettet in die
Executables; durchgaengig UTF-8 statt CP437 (dokumentierte Abweichung).

- docs/: Sprachreferenz, Forms-Referenz, Dateiformate, TBVM-Design
- tb-runtime::errors: klassischer Laufzeitfehler-Katalog (implementiert)
- tb-ui::screen: 80x25-Unicode-Zellenpuffer mit 16-Farben-Abbildung,
  Scrollbereich (VIEW PRINT), Letterboxing; Ratatui-Widget + Tests
- Spike: cargo run -p tb-ui --example spike (Farben, Unicode, Tasten, Maus)
- tests/compat/: erste Referenzprogramme mit byte-genauer Sollausgabe

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
2026-09-01 16:36:45 +02:00
parent 5821ace0cf
commit 7e6fa6ea88
24 changed files with 1148 additions and 25 deletions

85
docs/forms-referenz.md Normal file
View File

@@ -0,0 +1,85 @@
# Forms-Referenz Terminal Basic
Rekonstruierte Referenz der Forms-Engine des Vorbilds (textbasierte,
ereignisgesteuerte Oberflächen). Grundlage für `tb-ui::forms` und den
Formular-Designer der IDE. Unklare Punkte sind mit `TODO` markiert.
## Koordinatenmodell
Alle Maße in **Textzellen** (Zeilen/Spalten), Ursprung links oben.
Formulare liegen auf dem 80×25-Bildschirm; Steuerelemente relativ zum
Formular-Innenbereich. Eigenschaften `Top`, `Left`, `Height`, `Width`.
## Steuerelemente (Übersicht)
| Steuerelement | Zweck | Schlüssel-Ereignisse |
|---|---|---|
| Form | Fenster (mit/ohne Rahmen, Titel, verschiebbar) | Load, Unload, Activate, Deactivate, Resize, Paint, Click, KeyPress |
| Label | statischer Text | Click |
| TextBox | ein-/mehrzeilige Texteingabe | Change, KeyPress, GotFocus, LostFocus |
| CommandButton | Schaltfläche | Click |
| CheckBox | Mehrfachauswahl (Value 0/1/2) | Click |
| OptionButton | Einfachauswahl in Gruppe (Value TRUE/FALSE) | Click |
| Frame | Gruppierungsrahmen (Container) | — |
| ListBox | Liste (List, ListCount, ListIndex, AddItem/RemoveItem) | Click, DblClick |
| ComboBox | Eingabe + Liste (Style 0/1/2) | Change, Click, DblClick |
| HScrollBar / VScrollBar | Bildlauf (Min, Max, Value, SmallChange, LargeChange) | Change, Scroll |
| PictureBox | Text-Zeichenfläche (PRINT/CLS auf Steuerelement) | Click, Paint |
| Timer | unsichtbar; Interval in ms (Vorbild: 55-ms-Ticks) | Timer |
| Menu | Menüleiste/-einträge (Designer-definiert) | Click |
## Gemeinsame Eigenschaften
`Name` (Entwurfszeit), `Caption`/`Text`, `Top`/`Left`/`Height`/`Width`,
`Visible`, `Enabled`, `TabIndex`, `TabStop`, `Tag`, `Index` (Steuerelement-
Arrays), `ForeColor`/`BackColor` (015 bzw. 07), `MousePointer` (TODO).
Zugriff zur Laufzeit: `form.eigenschaft`, `form!element.eigenschaft`;
Standard-Eigenschaft (z. B. `Text` bei TextBox, `Caption` bei Label) bei
Zuweisung ohne Eigenschaftsname. TODO: exakte Standard-Eigenschaften prüfen.
## Gemeinsame Methoden
`Move top, left [, height, width]` · `SetFocus` · `Refresh` · `Drag` (Nicht-
Ziel?) · Form zusätzlich: `Show [modal]`, `Hide`, `Cls`, `Print`, `Line`
(Textmodus-Variante? TODO). ListBox/ComboBox: `AddItem text$ [, index]`,
`RemoveItem index`, `Clear` (TODO: hieß es `Clear`?).
## Ereignismodell
- Ereignisprozeduren heißen `SUB elementname_Ereignis (argumente)` und liegen
im Formular-Modul.
- Tastatur: `KeyDown(KeyCode%, Shift%)`, `KeyPress(KeyAscii%)`, `KeyUp`
KeyAscii ist bei uns ein Unicode-Codepoint (Abweichung UTF-8).
- Maus: `MouseDown/MouseMove/MouseUp(Button%, Shift%, X!, Y!)` in Zellen.
- Fokusreihenfolge über `TabIndex`; Tab/Shift+Tab wechseln, Access-Keys per
`&` im Caption (z. B. `"&OK"` → Alt+O).
- Zentrale Schleife: Ereignisse werden nur bei `DOEVENTS`, `SLEEP`, `INPUT`-
artigen Wartezuständen oder nach Ende einer Ereignisprozedur zugestellt
(kooperativ, wie im Vorbild — keine Präemption).
## Globale Objekte und Funktionen
- `SCREEN`-Objekt: `SCREEN.ActiveForm`, `SCREEN.ActiveControl`,
`SCREEN.Height`/`Width` (25/80), `SCREEN.MousePointer` (TODO: Umfang).
- `MSGBOX(text$ [, typ% [, titel$]])` als Anweisung und Funktion
(Rückgabe: gedrückte Schaltfläche), `INPUTBOX$(prompt$ [, titel$
[, standard$ [, spalte%, zeile%]]])`.
- `LOAD form` (Load-Ereignis, unsichtbar), `UNLOAD form` (Unload-Ereignis),
Formular-Referenzen sind statisch (keine Instanziierung wie in späteren
Nachfolgern).
## Farben und Zeichensatz
Rahmen, Schatten und Bedienelemente werden mit Unicode-Box-Drawing gezeichnet
(Abweichung: UTF-8 statt CP437, identische Optik). Standard-Farbschema des
Vorbilds (grauer Dialog, schwarze Schrift, weiße Akzente) wird als Default
nachgebildet. TODO: exakte Attributtabelle je Steuerelement-Zustand
(normal/fokussiert/deaktiviert) aus Screenshots/Emulator ableiten.
## Offene Detailfragen (per Emulator-Session zu klären)
- Exakte Standardwerte aller Eigenschaften je Steuerelement
- Z-Reihenfolge/Überlappung von Steuerelementen und Formularen
- Verhalten `Show 1` (modal): welche Ereignisse laufen weiter?
- Timer-Auflösung und -Reihenfolge bei mehreren Timern
- Genauer Umfang von PictureBox im Textmodus