Control-Menüs öffnen für alle Fensterarten am [≡]-Symbol des aktiven Fensters: eigener Auswahlzustand statt Kopplung an die Menüleiste, bevorzugt unter der Titelzeile, bei Platzmangel nach oben aufgeklappt, am rechten Rand nur so weit nach links wie nötig. Regressionstest über TestBackend für Code-, Projekt-, Output-, Immediate-, Debug- und Hilfefenster, maximiert, minimiert, Rand und Maus. Nebenbefunde der Windows-Testausführung: Temporärdatei vor sync_all schreibend öffnen (Zugriff verweigert), relative Projektverweise immer mit / schreiben, zeilenendenneutrale Vergleiche in Referenzmatrix-, Kompatibilitäts- und MAK-Beispieltests, DriveListBox-Zeichenbild plattformneutral. Korpus-Sollausgaben per .gitattributes auf LF. Specs ide-oberflaeche und ide-projekte synchronisiert, Change archiviert. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
17 KiB
Forms-Referenz Terminal Basic
Rekonstruierte Referenz der Forms-Engine des Vorbilds (VBDOS 1.0) —
Grundlage für tb-ui::forms und den Formular-Designer. Primärquellen:
Original-Hilfedatei (dekodiert), CONSTANT.BI, Stringtabellen der
Original-Programme, Beispielprojekte. Aussagen ohne TODO sind daraus belegt.
Die zeilenweise Matrix mit Typ, Bereich, Vorgabe, Laufzeit-Schreibbarkeit
und Klassenquelle liegt im Change-Dokument
openspec/changes/phase-4-objektmodell/klassen-und-eigenschaften.md.
Als Beispiel-Gegenprobe dient cout/vbdos Commit
1cdd2b32b829fe1721d0b6aecc433abc47a96fb6; dessen binäre Formulare
microsoft/check.frm, notepad.frm, qlbview.frm, seek.frm,
spindemo.frm, graphics/graphics.frm und misc/mentors/mentors.frm
enthalten die dort ausgewiesenen Eigenschaften und Ereignisprozeduren.
Koordinatenmodell
Einheit ist durchgängig die Textzelle (Spalte/Zeile), keine Twips.
Left/Top relativ zum Container, gültiger Bereich 0–254; Height/Width
für Controls 1–254, für Formulare bis Bildschirmgröße. ScaleHeight/
ScaleWidth (nur Form/PictureBox, read-only) = Innenmaß ohne Rahmen/Menü.
Maus-Koordinaten in Ereignissen sind SINGLE, aber in Zellen.
Steuerelemente (exakte Klassennamen)
CheckBox, ComboBox, CommandButton, DirListBox, DriveListBox, FileListBox, Frame, HScrollBar, Label, ListBox, Menu, OptionButton, PictureBox, Spin, TextBox, Timer, VScrollBar — alle außer Menu über die Toolbox platzierbar
(Menüs entstehen im Menu Design Window). Default-Namen: Check1, Combo1,
Command1, Dir1, Drive1, File1, Frame1, HScroll1, Label1,
List1, Option1, Picture1, Text1, Timer1, VScroll1.
Eigenschaften/Methoden/Ereignisse je Steuerelement
Form
Ereignisse: Click, DblClick, DragDrop, DragOver, GotFocus, KeyDown, KeyPress, KeyUp, Load, LostFocus, MouseDown, MouseMove, MouseUp, Paint, Resize, Unload. Methoden: CLS, DRAG, HIDE, LOAD, MOVE, PRINT, PRINTFORM, REFRESH, SHOW, TEXTHEIGHT, TEXTWIDTH, UNLOAD. Eigenschaften: AutoRedraw, BackColor, BorderStyle, Caption, ControlBox, CurrentX, CurrentY, DragMode, Enabled, ForeColor, FormName, FormType, Height, Left, MaxButton, MinButton, MousePointer, Parent, ScaleHeight, ScaleWidth, Tag, Top, Visible, Width, WindowState.
CommandButton
Ereignisse: Click, DragDrop, DragOver, GotFocus,
KeyDown, KeyPress, KeyUp, LostFocus. Methoden: DRAG, MOVE, REFRESH,
SETFOCUS. Eigenschaften: BackColor, Cancel, Caption, CtlName, Default,
DragMode, Enabled, Height, Index, Left, MousePointer, Parent, TabIndex,
TabStop, Tag, Top, Value, Visible, Width. Darstellung nach Höhe:
1 = <Text>, 2 = einzeiliger Rahmen, ≥3 = Kasten; Mindestgröße 1×3.
TextBox
Ereignisse: Change, DragDrop, DragOver, GotFocus, KeyDown, KeyPress, KeyUp, LostFocus. Methoden: DRAG, MOVE, REFRESH, SETFOCUS. Eigenschaften: BackColor, BorderStyle, CtlName, DragMode, Enabled, ForeColor, Height, Index, Left, MousePointer, MultiLine, Parent, ScrollBars, SelLength, SelStart, SelText, TabIndex, TabStop, Tag, Text, Top, Visible, Width.
ListBox
Ereignisse: Click, DblClick, DragDrop, DragOver, GotFocus, Key*, LostFocus, Mouse*. Methoden: ADDITEM, DRAG, MOVE, REFRESH, REMOVEITEM, SETFOCUS. Eigenschaften: BackColor, CtlName, DragMode, Enabled, ForeColor, Height, Index, Left, List, ListCount, ListIndex, MousePointer, Parent, Sorted, TabIndex, TabStop, Tag, Text, Top, Visible, Width.
ComboBox
wie ListBox plus Change, DropDown (Ereignisse), SelLength/ SelStart/SelText/Style/Text (Eigenschaften).
ListIndex = -1 hebt die Auswahl auch bei leerer Liste auf. ADDITEM vor dem
ausgewählten Eintrag verschiebt seinen Index nach rechts, REMOVEITEM davor
nach links; Entfernen des ausgewählten Eintrags setzt ihn auf −1. Das gilt
auch für sortierte Listen. ListCount und List(i) spiegeln die geänderte
Liste unmittelbar wider. Ohne Auswahl liefern ListBox und ComboBox.Style 2
leeren Text. Die editierbaren ComboBox-Stile 0 und 1 erhalten ihren separaten
Eingabetext; ihre Anzeige entspricht auch ohne Auswahl diesem Text.
Nachträgliches Sorted = -1 sortiert den vorhandenen Inhalt ohne Beachtung
der Groß-/Kleinschreibung. Gleich sortierte Einträge behalten ihre relative
Reihenfolge; die Auswahl bleibt beim selben Eintrag, auch bei Duplikaten.
Die Simple-ComboBox zeigt unter dem Eingabefeld ihre Listeneinträge samt
Auswahlmarkierung; Inhalt wird auf den verfügbaren Listenbereich begrenzt.
CheckBox / OptionButton
Ereignisse: Click (Option auch DblClick), Drag*, GotFocus, Key*, LostFocus. Methoden: DRAG, MOVE, REFRESH, SETFOCUS. Eigenschaften: BackColor, Caption, CtlName, DragMode, Enabled, ForeColor, Height, Index, Left, MousePointer, Parent, TabIndex, TabStop, Tag, Top, Value, Visible, Width.
Frame
nur DragDrop/DragOver; DRAG, MOVE, REFRESH (kein SetFocus);
Container für Gruppierung (OptionButton-Gruppen). Index und TabIndex
werden in den Originaldateien auch für Frames gespeichert.
Label
Ereignisse: Change, Click, DblClick, Drag*, Mouse*. Methoden: DRAG, MOVE, REFRESH. Eigenschaften: zusätzlich Index, TabIndex, Alignment, AutoSize, BorderStyle.
HScrollBar/VScrollBar
Ereignisse: Change, Drag*, GotFocus, Key*, LostFocus (kein separates Scroll-Ereignis). Eigenschaften: zusätzlich Attached (VBDOS-Spezifikum: am Formularrand angedockt; Laufzeit read-only), LargeChange, Min, Max, SmallChange, Value.
Spin
Ereignisse: Custom(EventType), Drag*, GotFocus, Key*, LostFocus.
Style wählt vertikal/horizontal, Interval steuert die Wiederholung; Value
läuft zyklisch zwischen Min und Max. BorderStyle, Width und Height
sind zur Laufzeit schreibgeschützt.
PictureBox
Text-Zeichenfläche (PRINT/CLS aufs Control) und Container für OptionButton-Gruppen. Ereignisse: Click, DblClick, Drag*, GotFocus, Key*, LostFocus, Mouse*, Paint. Methoden: CLS, DRAG, MOVE, PRINT, REFRESH, SETFOCUS, TEXTHEIGHT, TEXTWIDTH. Eigenschaften: zusätzlich Index, TabIndex, TabStop, AutoRedraw, CurrentX, CurrentY, ScaleHeight, ScaleWidth.
Timer
Ereignis Timer, keine Methoden; Eigenschaften: CtlName, Enabled, Index, Interval (0 = aus … 65 535 ms), Parent, Tag.
Die erste Frist beginnt mit der Aktivierung auf einem sichtbaren Formular oder dem Zuweisen eines positiven Intervalls an der aktuellen Hostzeit. Erneutes Zuweisen von Enabled = −1 an einen bereits aktiven Timer verändert die Frist nicht. Intervalländerungen beginnen eine neue Phase und verwerfen alte wartende Timerereignisse; Enabled = 0 und Interval = 0 verwerfen sie ebenfalls. Verstecken/Entladen beendet die aktive Phase. Ein durchgehend aktiver 100-ms-Timer erzeugt bei einem Fortschritt um 250 ms zwei Ereignisse. Zeiten vor Aktivierung oder während einer inaktiven Phase werden nicht nachgeholt.
Einbetter, die das Forms-Modell direkt verändern, rufen nach der Änderung
sync_timers(|| host.jetzt_ms()) auf. Die Closure wird ausschließlich bei
neu beginnenden aktiven Timern ausgewertet. Die VM erledigt dies nach
Property-Zuweisungen, SHOW und dem Laden von Arrayelementen sowie beim
Übernehmen eines vorbereiteten Modells; es gibt keinen globalen Zeitcache.
Menu
Ereignis Click; Eigenschaften Caption, Checked, CtlName, Enabled, Index, Parent, Separator, Shortcut, Tag, Visible.
DirListBox/DriveListBox/FileListBox
Datei-Browser-Controls (Path/Drive/FileName/Pattern/Archive/Hidden/Normal/ReadOnly/System; Ereignisse u. a. Change, PathChange, PatternChange). Terminal Basic bildet sie plattformneutral nach (Laufwerksliste → Wurzeln/Mounts).
Ereignisquellen im Terminal
Eine Hosttaste liefert KeyDown und KeyUp; eine Zeichentaste zusätzlich KeyPress. Ohne behandelndes Control gilt derselbe Ablauf für das aktive Formular. Show/Hide und Formularwechsel liefern GotFocus/LostFocus, geänderte Formularmaße Resize; Show und Refresh liefern Paint, bei PictureBox liefert Refresh Paint. Label.Caption löst bei Änderung Change aus. Nicht registrierte Ereignisse verfallen; Change, Timer und Paint verändern den Eingabefokus nicht. Menüs und Labels werden dadurch nicht zum aktiven Eingabe-Control.
Alt+Pfeil-ab öffnet bzw. schließt die Liste einer ComboBox und löst beim Öffnen DropDown aus. Enter oder Esc schließt sie. Der sichtbare Listenbereich bleibt durch die Control-Höhe begrenzt. DirListBox.Path meldet PathChange und Change, FileListBox.Path meldet PathChange und FileListBox.Pattern meldet PatternChange; DriveListBox.Drive meldet Change.
Standardwerte und Wertebereiche
| Eigenschaft | Bereich | Default |
|---|---|---|
| CheckBox.Value | 0 Unchecked · 1 Checked · 2 Grayed | 0 |
| OptionButton.Value | 0/−1 | 0 |
| CommandButton.Value | True löst Click aus | False |
| ComboBox.Style | 0 Dropdown · 1 Simple · 2 Dropdown List | 0 |
| BorderStyle (Form) | 0 None · 1 Fixed Single · 2 Sizable Single · 3 Fixed Double · 4 Sizable Double · 5 Fixed Solid · 6 Sizable Solid | 2 |
| BorderStyle (Control) | 0 None · 1 Single · 2 Double (nur Label/PictureBox) | Label 0; TextBox/PictureBox 1 |
| WindowState | 0 Normal · 1 Minimized · 2 Maximized | 0 |
| FormType | 0 Normal · 1 MDI-Container | 0 |
| Timer.Interval | 0–65 535 ms | 0 |
| ScrollBar Min/Max | −32 768…32 767 | 0 / 32 767 |
| Small-/LargeChange | 1…32 767 | 1 |
| TextBox.ScrollBars | 0 None · 1 H · 2 V · 3 Both | 0 |
| MultiLine/Sorted/Attached | Boolean, Laufzeit read-only | False |
| Alignment (Label) | 0 Left · 1 Right · 2 Center | 0 |
| DragMode | 0 Manual · 1 Automatic | 0 |
| MousePointer | 0–12 (Default, Block, Cross, I-Beam, …) | 0 |
| ForeColor/BackColor | 0–15 | 0 / 7 |
| Text (TextBox/ComboBox) | — | Entwurfszeit = CtlName |
| ListIndex | −1 = keine Auswahl | −1 |
Zeichenbilder und Zustände
Die Originalquellen belegen Aufbau und Rahmenformen, enthalten aber keine
vollständige Screenshot-Reihe für jede Klasse und jeden Zustand. Die folgende
einheitliche Umsetzung ist deshalb unsere Festlegung: normal = die Werte
aus ForeColor/BackColor, fokussiert = Farbe 15 auf 1, deaktiviert = Farbe
8 auf 0. & kennzeichnet
nur den Access-Key und wird nicht ausgegeben. Die Beispiele zeigen jeweils
normal · fokussiert · deaktiviert; Inhalt wird auf die verfügbare Breite
gekürzt und der Rest mit Leerzeichen gefüllt.
Listenrahmen bleiben auch bei Width = 1 oder Height = 1 innerhalb des Steuerelements; nicht passende Rahmenstücke und Zeilen entfallen. Die Kürzung von Listen- und Combo-Inhalten zählt Bildschirmzellen: breite Unicode-Zeichen werden nur vollständig ausgegeben, Steuerzeichen als Leerzeichen dargestellt. Am Bildschirmrand wird die Forms-Ausgabe ohne Umbruch oder Scrollen abgeschnitten.
| Klasse | normal | fokussiert | deaktiviert |
|---|---|---|---|
| CommandButton, Höhe 1 | <OK> |
<OK> |
<OK> |
| CommandButton, Höhe 2 | ┌OK──┐ / └────┘ |
ebenso | ebenso |
| CommandButton, Höhe ≥ 3 | ┌────┐ / │ OK │ / └────┘ |
ebenso | ebenso |
| Label | Text |
Text |
Text |
| Frame | ┌ Titel ─┐ / │ │ / └────────┘ |
ebenso | ebenso |
| CheckBox | [ ] Text |
[ ] Text |
[ ] Text |
| CheckBox, gewählt/grau | [x] Text / [-] Text |
ebenso | ebenso |
| OptionButton | ( ) Text |
( ) Text |
( ) Text |
| OptionButton, gewählt | (•) Text |
(•) Text |
(•) Text |
| TextBox | ┌──────┐ / │Text │ / └──────┘ |
ebenso, Cursor an SelStart |
ebenso, ohne Cursor |
| ListBox | ┌──────┐ / │eins │ / │zwei │ / └──────┘ |
ebenso, aktuelle Zeile in Fokusfarben | ebenso |
| ComboBox, Dropdown | [Text ▼] |
ebenso in Fokusfarben | ebenso |
| ComboBox, Simple | [Text ▼] / ┌──────┐ / │eins │ / └──────┘ |
ebenso in Fokusfarben | ebenso |
| HScrollBar | ◄──□──► |
ebenso in Fokusfarben | ebenso |
| VScrollBar | ▲ / │ / □ / │ / ▼ |
ebenso in Fokusfarben | ebenso |
| Spin | ▲ / ▼ oder ◄ ► |
ebenso in Fokusfarben | ebenso |
| PictureBox | ┌──────┐ / │Text │ / └──────┘ |
ebenso in Fokusfarben | ebenso |
| DirListBox | ┌──────┐ / │[dir] │ / └──────┘ |
ebenso, aktuelle Zeile in Fokusfarben | ebenso |
| DriveListBox | [ / ▼] (unter Windows [ \ ▼], Wurzeltrenner der Plattform) |
ebenso in Fokusfarben | ebenso |
| FileListBox | ┌──────┐ / │a.bas │ / └──────┘ |
ebenso, aktuelle Zeile in Fokusfarben | ebenso |
| Menu | Datei Bearbeiten |
gewählter Titel/Eintrag in Fokusfarben | Text in Farbe 8 |
| Timer | keine sichtbaren Zellen | keine sichtbaren Zellen | keine sichtbaren Zellen |
BorderStyle = 0 unterdrückt den Rahmen von Label, TextBox und PictureBox;
BorderStyle = 2 nutzt ╔═╗║╚╝. Scrollbars erscheinen nur in den von
ScrollBars genannten Richtungen. Ein unsichtbares Steuerelement zeichnet
keine Zelle.
Festgelegte Reihenfolgen
Die folgenden Regeln sind unsere Festlegung, nicht nachgewiesenes Referenzverhalten:
- Z-Reihenfolge: Ein Container liegt stets hinter seinen Kindern, auch bei indizierten Eltern. Im Übrigen gilt Erzeugungsreihenfolge; später erzeugte Elemente liegen oben. Bei Steuerelement-Arrays entscheidet bei sonst gleicher Position der aufsteigende Index, sodass der höchste Index oben liegt. Gezeichnet wird von unten nach oben, die Trefferprüfung läuft umgekehrt.
- Timer-Reihenfolge: Sind mehrere Timer am selben Zustellpunkt fällig,
werden ihre Ereignisse in aufsteigender, ASCII-unabhängig
großgeschriebener
CtlName-Reihenfolge zugestellt. Mehrere verstrichene Intervalle desselben Timers bleiben in zeitlicher Reihenfolge davor. Bei gleichem Arraynamen folgt der aufsteigende numerische Index.
Die Korpusfälle listenauswahl.frm und timer-aktivierung.frm prüfen diese
Verträge mit festgelegten Sollausgaben: Listenauswahl/Combo-Eingabetext und
späte Timeraktivierung bei 1000 ms mit erster Zustellung bei 1100 ms.
Dies sind Vertragsregressionen, keine neu aufgenommenen VBDOS-Referenzläufe.
Keine Default-Eigenschaften: Text1 = "x" gibt es nicht — Zugriff
immer explizit (Text1.Text). „Default" ist nur die CommandButton-
Eigenschaft (Enter-Taste); „Cancel" analog für Esc.
Ereignis-Signaturen
SUB Form_KeyDown (KeyCode AS INTEGER, Shift AS INTEGER)
SUB ctl_KeyPress ([Index AS INTEGER,] KeyAscii AS INTEGER)
SUB Form_MouseDown (Button AS INTEGER, Shift AS INTEGER, X AS SINGLE, Y AS SINGLE)
SUB Form_DragDrop (Source AS CONTROL, X AS SINGLE, Y AS SINGLE)
SUB Form_DragOver (Source AS CONTROL, X AS SINGLE, Y AS SINGLE, State AS INTEGER)
SUB Form_Unload (Cancel AS INTEGER) ' Cancel <> 0 verhindert Entladen
Shift-Bitfeld 1 Shift · 2 Ctrl · 4 Alt; Button 1 links · 2 rechts;
DragOver-State 0 Enter · 1 Leave · 2 Over. Bei Steuerelement-Arrays steht
Index AS INTEGER immer vorn. KeyAscii ist bei uns ein Unicode-Codepoint
(UTF-8-Abweichung); klassische KeyCode-Konstanten bleiben gültig
(Vorbild-Eigenheit: Entf = 127).
Ereignisse ohne eine der oben genannten Argumentfamilien haben keine
Parameter. Bei Arrays wird ausschließlich Index AS INTEGER vorangestellt;
die restliche Signatur bleibt unverändert.
SCREEN-Objekt
Eigenschaften: ActiveControl, ActiveForm, AutoRedraw, ControlPanel,
Height, Width (Zeichen, read-only — bei uns die aktuelle Terminalgröße,
Abweichung: das Vorbild lieferte fest 25/43/50 × 80), MousePointer.
Methoden: HIDE, SHOW (alle sichtbaren Formulare ein-/ausblenden). SCREEN.ControlPanel(0–17)
konfiguriert Systemfarben/-effekte (AccessKey-/Desktop-/Menü-/Titel-
Farben, Schatten, 3D-Effekte, Desktop-Füllzeichen) — Konstanten in der
Konstanten-Include-Datei.
Show/Hide/Load/Unload und Modalität
form.SHOW [style%]: 0 = modeless (Standard), 1 = modal; lädt bei
Bedarf. Bei modal läuft der Code nach SHOW erst nach Schließen weiter.
Modal-Stacking-Regeln → Fehler 400–403 (u. a. „MDI form cannot be shown
modally"). HIDE setzt nur Visible = False; LOAD/UNLOAD mit
Load-/Unload-Ereignis (Cancel-Parameter). LOAD/UNLOAD ctl(index%) für
Steuerelement-Arrays (Entwurfszeit-Elemente sind nicht entladbar,
Fehler 362); deren Eigenschaften sind über ctl(index%).Eigenschaft
adressierbar und werden beim LOAD vom Entwurfszeit-Element 0 geklont.
Menüsystem
Definition pro Formular im Menu Design Window, bis zu 6 Ebenen.
Felder: Caption (& Access-Key, - Separator), CtlName, Tag, Index,
Checked/Enabled/Visible/Separator, Shortcut-Dropdown. Regeln: Separatoren
nicht checked/disabled/mit Shortcut; Menütitel ohne Shortcut.
Menü-Steuerelement-Arrays sind möglich.
Steuerelement-Arrays, Drag & Drop, Custom Controls
- Control-Arrays: gleiche CtlName + Index; Laufzeit-Erzeugung per
LOAD ctl(index%). - Drag & Drop: DragMode 0/1, Methode
DRAG action%(0 Cancel · 1 Begin · 2 Drop), Ereignisse DragDrop/DragOver mitSource AS CONTROL. - Custom Controls: das Vorbild lud sie aus Quick-Libraries; für Terminal Basic ist ein natives Erweiterungsmodell Stufe 2 (PLAN.md).
Offene Detailfragen
.FRM-Textformat: exakte Serialisierung (siehe dateiformate.md)