Phase 4: Steuerelemente implementieren

This commit is contained in:
2026-09-05 12:49:46 +02:00
parent 1cb6ae8fd9
commit 19804e0e2d
36 changed files with 6472 additions and 689 deletions

31
PLAN.md
View File

@@ -393,6 +393,10 @@ Maßgeblich ist seit 2026-09-03 das Inventar, nicht diese Liste.
Transaktion verfällt.
## Phase 4 — Forms-Engine (`tb-ui::forms`)
**Status: abgeschlossen (2026-09-05).** Alle sieben Programme des
öffentlichen VBDOS-Bestands kompilieren ohne Diagnose und starten im PipeHost.
- [x] Eingangsaufgabe (aus Phase 0 übernommen): Ereignisschleifen-
Architektur — Terminal-Events → Event-Queue → VM-Ticks, kooperative
Zustellpunkte (`DOEVENTS`, `SLEEP`, blockierende Eingabe, Ende einer
@@ -401,11 +405,12 @@ Maßgeblich ist seit 2026-09-03 das Inventar, nicht diese Liste.
Forms-Ereignisprozeduren verwenden später denselben Rückrufweg.
- [x] Formular-Modell: Eigenschaften, Lade-/Entladezyklus, `SHOW`/`HIDE`
(modal/nicht-modal)
- [ ] Steuerelemente: CommandButton, TextBox, ListBox, ComboBox, CheckBox,
- [x] Steuerelemente: CommandButton, TextBox, ListBox, ComboBox, CheckBox,
OptionButton, Frame, Label, HScrollBar/VScrollBar, PictureBox (Text),
Timer — mit allen Eigenschaften/Methoden/Ereignissen des Vorbilds
- [ ] Menüsystem (Menüleiste, Shortcuts, Access Keys)
- [ ] Fokus-/Tab-Reihenfolge, Access-Keys, Maussteuerung
Timer und VSpin/HSpin — mit ihren Eigenschaften, Methoden und
Ereignissen
- [x] Menüsystem (Menüleiste, Shortcuts, Access Keys)
- [x] Fokus-/Tab-Reihenfolge, Access-Keys, Maussteuerung
- [x] `.FRM`-Textformat: Serialisierung **definieren** (kein Original-
Beispiel verfügbar — Windows-1.0-Schema, siehe dateiformate.md),
dokumentieren, dann lesen/schreiben implementieren
@@ -413,9 +418,14 @@ Maßgeblich ist seit 2026-09-03 das Inventar, nicht diese Liste.
(Gegenstück zu FT.EXE des Vorbilds; Magic `FC 08 01 00`): als
`tbc convert-frm`. Format per Reverse Engineering aus den
Beispieldateien des Originalpakets und des cout/vbdos-Repos
- [ ] Meilenstein (erster Kompatibilitätstest): die Programme aus
- [x] Meilenstein (erster Kompatibilitätstest): die Programme aus
https://github.com/cout/vbdos ohne Non-Features kompilieren und
sind nutzbar (Konsolenprogramme bereits ab Phase 3)
Befund: Alle sieben Programme wurden gegen Commit `1cdd2b3` als
`.MAK` bzw. `.FRM` ohne Diagnosen geprüft und im PipeHost gestartet.
Dafür wurden Projekt-/Include-Auflösung, P-Code-Dekodierung,
Zellgrafik und VSpin/HSpin vollständig geschlossen. Einzelheiten:
`openspec/changes/phase-4-steuerelemente/vbdos-befunde.md`.
- [x] Ereignisdispatch: Event-Queue ↔ VM (Ereignisprozeduren `Name_Ereignis`)
- [x] **Klassische Ereignis-Traps** (ohne Forms, Sprachreferenz §8) —
`ON TIMER(n)`, `ON KEY(n)`, `ON UEVENT` und `ON SIGNAL(n)` je mit
@@ -426,11 +436,14 @@ Maßgeblich ist seit 2026-09-03 das Inventar, nicht diese Liste.
(Fehler 73). **10 Inventareinträge**
Befund: `EVENT` besitzt nur `ON`/`OFF`; `SIGNAL(1/2)` bildet
plattformübergreifend `SIGINT`/`SIGTERM` ab.
- [ ] **Vordefinierte Dialoge**: `MSGBOX` als Anweisung **und** als
- [x] **Vordefinierte Dialoge**: `MSGBOX` als Anweisung **und** als
Funktion (liefert die gedrückte Schaltfläche) sowie `INPUTBOX$`.
Sie hängen am Formularmodell, nicht an der Steuerelementliste, und
fallen deshalb sonst zwischen die Aufgaben. **3 Inventareinträge**
- [ ] Meilenstein: Beispiel-Formularprogramme aus dem Testkorpus laufen
- [x] Meilenstein: Beispiel-Formularprogramme aus dem Testkorpus laufen
Befund: `formular.frm` speist Fokus, Tab, Access-Key, Mausklick,
Menüwahl, Liste, Timer und modalen Dialog über eine deklarierte,
virtuelle Ereignisfolge reproduzierbar ein.
## Phase 5 — IDE (`tb-ide`)
- [ ] IDE-Rahmen: Menüleiste, MDI-artige Fensterverwaltung, Statuszeile,
@@ -441,11 +454,11 @@ Maßgeblich ist seit 2026-09-03 das Inventar, nicht diese Liste.
- [ ] Formular-Designer: Steuerelemente platzieren/verschieben/skalieren,
Eigenschaftenfenster
- [ ] Ausführen aus der IDE: Start/Unterbrechen/Fortsetzen/Neustart
- [ ] **`$INCLUDE`** im Compile-Treiber auflösen — der Lexer liefert den
- [x] **`$INCLUDE`** im Compile-Treiber auflösen — der Lexer liefert den
Metabefehl bereits als Token. Datei einlesen, Pfade relativ zur
einschließenden Datei, Zyklen erkennen und namentlich abweisen.
**1 Inventareintrag**
- [ ] **`RUN`** — Programm neu starten bzw. ein anderes laden und starten.
- [x] **`RUN`** — Programm neu starten bzw. ein anderes laden und starten.
Nutzt denselben Zurücksetzpfad der VM wie „Neustart" oben.
**1 Inventareintrag**
- [ ] Debugger: Breakpoints, Einzelschritt/Prozedurschritt, Direktfenster,