formular lesen (binär) und openspec für codex
This commit is contained in:
114
openspec/changes/phase-4-steuerelemente/design.md
Normal file
114
openspec/changes/phase-4-steuerelemente/design.md
Normal file
@@ -0,0 +1,114 @@
|
||||
# Design — Steuerelemente, Menüs, Dialoge
|
||||
|
||||
## Context
|
||||
|
||||
Siehe proposal.md — Why. Dieser Change setzt auf drei fertigen Stücken
|
||||
auf: dem Zellenpuffer aus Phase 3, der Ereignisschleife samt Mausquelle
|
||||
(`phase-4-ereignisschleife`) und dem Objektmodell
|
||||
(`phase-4-objektmodell`). Er ist der breiteste Change der Phase — 15
|
||||
Klassen, Menüs, Dialoge —, aber der mit den wenigsten offenen
|
||||
Architekturfragen.
|
||||
|
||||
Die Forms-Referenz lässt drei Detailfragen offen, die hier beantwortet
|
||||
werden müssen: die Optik je Zustand, die Z-Reihenfolge bei Überlappung
|
||||
und die Reihenfolge gleichzeitig fälliger Timer.
|
||||
|
||||
## Goals / Non-Goals
|
||||
|
||||
**Goals:**
|
||||
|
||||
- Eine Darstellung, die im Zellenpuffer entsteht und deshalb mit dem
|
||||
bestehenden Snapshot-Vergleich prüfbar ist.
|
||||
- Eingabebehandlung, die je Klasse an einer Stelle steht, statt über
|
||||
Sonderfälle in der Schleife verteilt zu sein.
|
||||
|
||||
**Non-Goals:**
|
||||
|
||||
- Pixelgenaue Nachbildung der Originaloptik; maßgeblich sind Aufbau und
|
||||
Zeichen, nicht der Farbton eines Schattens.
|
||||
- Ein Layoutalgorithmus. Steuerelemente stehen, wo ihre Koordinaten sie
|
||||
hinstellen.
|
||||
|
||||
## Decisions
|
||||
|
||||
### D1 — Zeichnen ist eine Funktion des Zustands, kein Nebeneffekt
|
||||
|
||||
Jede Klasse zeichnet sich vollständig aus ihren Eigenschaften in den
|
||||
Zellenpuffer. Es gibt keinen inkrementellen Zeichenpfad und kein
|
||||
Merken zuvor gezeichneter Bereiche.
|
||||
|
||||
| Alternative | Warum nicht |
|
||||
|---|---|
|
||||
| Nur veränderte Bereiche neu zeichnen | Bei 80×25 Zellen ist das Neuzeichnen ohnehin billig; der Zustandsabgleich wäre die zweite Quelle der Wahrheit neben den Eigenschaften |
|
||||
|
||||
Neu gezeichnet wird an den Zustellpunkten der Ereignisschleife, wenn
|
||||
eine Eigenschaft sich geändert hat — dieselbe Bedingung, die der
|
||||
Bildschirmpuffer heute schon für `present` nutzt.
|
||||
|
||||
### D2 — Eingabe geht durch eine Kette, nicht durch eine Fallunterscheidung
|
||||
|
||||
Ein Tastenereignis läuft: Menü (wenn offen) → modaler Dialog (wenn
|
||||
offen) → Access-Key des Formulars → fokussiertes Steuerelement →
|
||||
`Default`/`Cancel`-Schaltfläche → Formular. Jede Station nimmt das
|
||||
Ereignis an oder gibt es weiter. Für die Maus entsprechend: Menü →
|
||||
Dialog → Trefferprüfung über die Z-Reihenfolge → Formular.
|
||||
|
||||
Die Kette ist die einzige Stelle, an der Vorrang entschieden wird; die
|
||||
Klassen selbst wissen nichts über einander.
|
||||
|
||||
### D3 — Antworten auf die offenen Detailfragen der Forms-Referenz
|
||||
|
||||
- **Optik je Zustand**: aus den Original-Screenshots abgeleitet und je
|
||||
Klasse in der Forms-Referenz als Zeichenbild festgehalten, bevor
|
||||
gezeichnet wird — sonst legt der erste Implementierungsversuch sie
|
||||
stillschweigend fest.
|
||||
- **Z-Reihenfolge**: Reihenfolge der Erzeugung, später Erzeugtes liegt
|
||||
oben; Steuerelement-Arrays nach Index. Das ist die Regel, die aus einer
|
||||
`.FRM` reproduzierbar folgt.
|
||||
- **Gleichzeitig fällige Timer**: in aufsteigender Reihenfolge ihres
|
||||
Namens im Formular, damit die Ausgabe eines Korpusprogramms nicht von
|
||||
einer Hashreihenfolge abhängt.
|
||||
|
||||
Alle drei werden in `docs/forms-referenz.md` als unsere Festlegung
|
||||
gekennzeichnet, nicht als Referenzverhalten ausgegeben.
|
||||
|
||||
### D4 — Dialoge sind Formulare, keine Sonderfälle
|
||||
|
||||
`MSGBOX` und `INPUTBOX$` bauen ein Formular mit Label und Schaltflächen
|
||||
und zeigen es modal über den Weg aus `phase-4-objektmodell` (Frame-Marke,
|
||||
D4 dort). Damit gelten Fokus, Access-Keys und Esc ohne Sonderbehandlung,
|
||||
und die Dialoge sind mit demselben Snapshot-Vergleich prüfbar wie jedes
|
||||
andere Formular.
|
||||
|
||||
### D5 — Menü hält die Ereigniszustellung an
|
||||
|
||||
Die Forms-Referenz nennt es für das Vorbild: Zeitereignisse und Trapping
|
||||
ruhen, solange ein Menü den Fokus hat. Umgesetzt wird das über den
|
||||
`STOP`-Zustand der Ereignissteuerung — kein neuer Mechanismus, sondern
|
||||
der vorhandene, vom Menü gesetzt und beim Schließen zurückgenommen.
|
||||
|
||||
### D6 — Dateisystem-Steuerelemente werden plattformneutral abgebildet
|
||||
|
||||
DriveListBox zeigt keine Laufwerksbuchstaben, sondern die Wurzeln bzw.
|
||||
Einhängepunkte der Plattform; DirListBox und FileListBox arbeiten auf
|
||||
Pfaden. `Pattern` bleibt das Muster des Vorbilds. Die Abweichung wird in
|
||||
der Sprachreferenz festgehalten.
|
||||
|
||||
## Risks / Trade-offs
|
||||
|
||||
- **Breite statt Tiefe** → 15 Klassen sind viel Fläche für Flüchtigkeit;
|
||||
jede Klasse bekommt ihren eigenen Korpusnachweis, nicht nur einen
|
||||
gemeinsamen Sammeltest.
|
||||
- **Vollständiges Neuzeichnen bei großen Terminals** → bei 200×60 sind es
|
||||
12 000 Zellen je Anzeige; falls das messbar stört, greift die
|
||||
Bedingung „nur bei Änderung" bereits heute, und ein Ausbau bleibt
|
||||
möglich, ohne die Klassen anzufassen.
|
||||
- **Fremdprogramme scheitern aus unerwartetem Grund** → jeder Befund wird
|
||||
festgehalten statt umgangen; er ist das eigentliche Ergebnis des
|
||||
Kompatibilitätstests.
|
||||
|
||||
## Open Questions
|
||||
|
||||
- Ob die PictureBox als Container für OptionButton-Gruppen dieselbe
|
||||
Fokuslogik wie der Frame braucht, zeigt der erste Korpusnachweis mit
|
||||
gruppierten Optionsfeldern.
|
||||
Reference in New Issue
Block a user