Files
TerminalBasic/docs/ide-bedienung.md

502 lines
31 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Terminal Basic IDE bedienen
`cargo run -p tb-ide -- [Projekt.mak|Modul.bas|Formular.frm]` startet die IDE.
Ohne Datei erscheint ein neues Projekt mit `[1] Untitled` und dem Project
Window rechts. Versions- und Copyright-Begrüßung blockieren keine Eingabe.
Bei bereits vorhandener `Untitled.bas` bekommt das neue Dokument einen
freien Namen. Es wird beim Start keine Datei angelegt.
Das Terminal muss mindestens 80×25 Zellen haben. Darunter erscheint nur
der Größenhinweis; Dokumente, Fokus und Fensterzustand bleiben erhalten.
Beim Vergrößern werden die Fenster wieder innerhalb der Terminalfläche
dargestellt. Normales Beenden und Fehlerpfade stellen Raw Mode, Cursor,
Mausmodus und Alternate Screen zurück.
## Menüs, Fenster und Dialoge
- Alt plus Menübuchstabe oder F11 öffnet die Menüleiste. Pfeile wählen
Menü/Eintrag, Enter führt aus; der unterstrichene Buchstabe wählt direkt.
Esc bricht ab. F11 ist die Alternative, wenn das Terminal Alt allein
nicht meldet. Menüs sind auch anklickbar, Help steht rechts.
- File enthält Projekt- und Dateiaktionen einschließlich New Form,
New Module, Add/Remove File, Save File/As, Load/Save Text und Exit.
Run → Set Start-up File speichert eine Auswahl oder den bisherigen Standard.
- Dialoge binden Tastatur und Maus an sich. Tab/Shift+Tab wechselt das Feld,
Links/Rechts ändert Auswahlwerte, Leertaste schaltet Kästchen. Textfelder
unterstützen Cursor, Pos1/Ende, Backspace/Entf und Ctrl+A zum Ersetzen.
Enter/OK übernimmt, Esc/Abbrechen verwirft den Dialog.
- F2 in einem Dateipfad öffnet die Dateiauswahl. Links/Rechts wählt einen
Eintrag, Enter öffnet ein Verzeichnis oder übernimmt eine Datei. Esc
kehrt zum vorherigen Dialog mit dessen Angaben zurück. Neue Dateinamen
lassen sich direkt ins Pfadfeld schreiben.
- F6/Ctrl+F6 bzw. Shift+F6 wechselt Fenster. Ctrl+F4 schließt eine Ansicht;
Dokument und Änderungen bleiben im Projektmodell erhalten. Alt+Minus
oder die Control-Menü-Box öffnet die Fensterbefehle.
- Ctrl+F7 verschiebt und Ctrl+F8 skaliert mit Pfeilen (Ctrl+Pfeile: fünf
Zellen); Enter bestätigt, Esc stellt die vorige Geometrie wieder her.
Ctrl+F9 minimiert, Ctrl+F10 maximiert, Ctrl+F5 stellt die Normalgeometrie
wieder her. Window → Arrange All kachelt, New Window öffnet eine weitere
Ansicht desselben Dokuments. Die Window-Liste markiert die aktive Ansicht.
- Im Project Window wählen Pfeile das Mitglied; Enter öffnet Code oder
Formular entsprechend dem Dateityp. Form/Code-Buttons öffnen die gewählte
Ansicht. View → Code/Form bietet zusätzlich einen Auswahldialog.
- Die Umgebung zeigt unten anklickbare Tastenkürzel und `00001:001` als
Zeile/Spalte. Der Designer besitzt stattdessen die Properties Bar.
F10 wechselt dort zwischen Menü- und Properties Bar, F2 fokussiert Value.
Die Formularbearbeitung ist unten beschrieben.
## Speichern und Wechseln
Save File nutzt den bestehenden Pfad; neue Dateien, Importziele und
Speicherkonflikte öffnen den Speicherdialog. Save Project zeigt Projektziel
und Dokumentziele mit separaten Überschreibentscheidungen. Eine Änderung
eines Pfades allein autorisiert kein Überschreiben einer vorhandenen Datei.
Binäre FRM-Originale bleiben auch mit gesetzter Überschreibentscheidung
geschützt; für bearbeitete Importe ist ein anderes Textziel erforderlich.
Beim Projektwechsel und Beenden stehen Abbrechen, Speichern und Verwerfen
zur Auswahl. Abbrechen ist vorausgewählt. Bei einem Teilspeicherfehler
bleibt der Dialog mit allen Angaben offen: erfolgreich gespeicherte Dateien
sind gespeichert, übrige Änderungen bleiben erhalten; die IDE schließt
nicht. Die MAK-Datei wird zuletzt geschrieben. Details stehen in
[Dateiformate](dateiformate.md#bearbeitete-dokumente-und-speichern).
Load Text fügt am Cursor als eine Undo-Aktion ein; Save Text exportiert im
Rahmen den gesamten Code. Der Dokumentvertrag unterstützt bereits
Auswahlexport des markierten Bereichs. Remove
File löscht keine Datei; beim Entfernen der Startdatei ist die Wahl eines
Ersatzes oder des bisherigen Standards ausdrücklich im Dialog enthalten.
## Display und Benutzereinstellungen
Options → Display bietet Vorder- und Hintergrund (015) für Menü, Desktop,
Code, aktiven Titel, Rahmen, Dialog/Projekt und Status. Default ist Schwarz
auf Hellgrau für Menüs/Dialogs, Hellgrau auf Blau für Code, Weiß auf Magenta
für aktive Titel und Schwarz auf Cyan für den Status. Desktop: `▒`,
Hellgrau auf Schwarz; Tabweite: 8. Ein Desktopzeichen muss genau eine
Terminalzelle belegen, Tabweite liegt zwischen 1 und 32. Änderungen gelten
sofort für die IDE; BASIC-Laufzeitfarben bleiben unabhängig.
Set Paths verwaltet Quellen-, Ausgabe- und Include-Verzeichnisse. Mehrere
Includes werden mit `|` getrennt; relative Optionspfade werden beim
Übernehmen relativ zum Projektverzeichnis absolut aufgelöst. Das Include
neben der Quelldatei hat Vorrang vor Suchverzeichnissen. Right Mouse
schaltet Kontext-Hilfe per Rechtsklick (Default an); die Hilfefunktion
folgt in Change 07. Syntax Checking ist zunächst an; seine Wirkung ist unten beschrieben.
Erst Options → Save… / OK schreibt die versionierte Benutzerdatei:
| System | Pfad |
| --- | --- |
| Unix mit absolutem XDG_CONFIG_HOME | `$XDG_CONFIG_HOME/TerminalBasic/options.ini` |
| macOS ohne XDG_CONFIG_HOME | `$HOME/Library/Application Support/TerminalBasic/options.ini` |
| anderes Unix ohne XDG_CONFIG_HOME | `$HOME/.config/TerminalBasic/options.ini` |
| Windows | `%APPDATA%/TerminalBasic/options.ini` |
Die Datei ist unabhängig vom Arbeitsverzeichnis. Ungültige Werte erhalten
eine Diagnose und behalten die Vorgabe; unbekannte Schlüssel werden mit
Hinweis ignoriert. Unbekannte Versionen/ungültige Textkodierung verwenden
Defaults. Schreibfehler erhalten die aktuellen, ungespeicherten Optionen.
Externe Änderungen der Optionsdatei werden vor dem Ersetzen erkannt.
## Native Exporte: UI in Phase 5, Erzeugung in Phase 6
Run → Make EXE File… (Alt+R, E) erzeugt ein eigenständiges natives
Executable. Unterstützt werden Windows x86_64, macOS aarch64 und Linux
x86_64/aarch64. Die passende `tbrt`-Vorlage samt `.meta` muss neben dem
IDE-Executable unter `runtimes/<target-triple>/` liegen. Fehlende Vorlagen
und Finalisierungsvoraussetzungen werden konkret gemeldet; macOS-Exporte
benötigen macOS mit `/usr/bin/codesign`.
Make Library… (Alt+R, L) erzeugt eine portable `.tbl`. Hier gibt es keine
System-/Architekturwahl und keine erforderliche Runtime-Vorlage. Add File
nimmt TBL als Binärabhängigkeit auf, Remove File entfernt nur den Verweis.
MAK-Speicherung und Save As erhalten die Reihenfolge und relativen Verweise.
Bibliotheken sind weder editierbare Quelltexte noch zulässige Startdateien.
Start, Check, Debugger und Export verwenden denselben Linker wie `tbc link`.
Fehlende Bibliotheksquellen werden im Debugger benannt; Fortsetzen und
Prozedurschritte bleiben möglich.
Erzeugen/Enter beziehungsweise der gleichnamige Mausknopf validiert den
Ausgabepfad und die Überschreibentscheidung. Projektdateien, Quelltexte,
Includes, binäre FRM-Originale und Bibliotheken sind geschützt. Leere oder
ungültige Pfade, fehlende Zielverzeichnisse, unzulässige EXE-Ziele und `.tbc`
als natives Exportziel liefern eine Diagnose und erhalten die Angaben.
Der Export verwendet den aktuellen Modul-/Form-/Include-Pufferstand ohne
implizites Speichern. Bibliotheksbytes gehören zum Auftragsstand. Während
der Hintergrundarbeit bleibt der Dialog bedienbar; Esc verwirft den Auftrag
und seine temporäre Ausgabe. Erfolg erscheint erst nach Veröffentlichung.
Projektänderungen, ausgetauschte Libraries, neuere Aufträge und extern
geänderte Ziele verhindern die Veröffentlichung eines alten Ergebnisses.
Das Schließen eines bereits erfolgreichen Dialogs macht den Erfolg nicht
rückwirkend zu einem Abbruch.
Absichtlich backendlose Oberflächentests zeigen weiterhin die
Phase-6-Abhängigkeit und erzeugen keine Dateien. Die echte Integration wird
zusätzlich mit nativer Ausführung und einem quellfreien TBL-Verbraucher
geprüft. Format und CLI-Beispiele: [P-Code-Bibliotheken](pcode-bibliotheken.md).
Die vollständige Zielsystem-/Terminalmatrix folgt gemäß [PLAN.md](../PLAN.md).
## Befehlsabdeckung nach Change 07
Alle Referenzbefehle sind in ihrer Menüfolge vorhanden und angebunden.
Nicht verfügbare Aktionen zeigen einen zustandsabhängigen Grund; ihre
Kürzel gelangen nicht versehentlich an BASIC.
Ctrl+C im Editor ist Kopieren, bei laufendem Programm mit
Output-Fokus unterbricht Ctrl+C sofort die Sitzung, ohne eine BASIC-Taste einzureihen.
| Bereich | Rahmenaktion jetzt | Fachaktion im Folgechange |
| --- | --- | --- |
| File | New/Open/Save Project, New Form/Module, Add/Remove File, Save File/As, Load/Save Text, Print (UTF-8-Datei), Shell, Exit | — |
| Edit | Undo, Cut/Copy/Paste/Clear, New Sub/Function, Event Procedures | — |
| View | Code/Form-Auswahl, Prozedurauswahl, Included File/Lines, Diagnostics, Designer Menu Bar/Value-Fokus, Grid Lines, Output Screen, Next Statement | — |
| Search | Find, Selected Text, Repeat Last Find, Change | — |
| Run | Start/Restart/Continue/Pause, COMMAND$, wirksame Startdatei und beide Make-Dialoge | Echte EXE-/TBL-Erzeugung; Vierzielabnahme in Phase 6 |
| Debug | Breakpoints, Schritte, Calls, Watches/Watchpoints, Direktfenster, Trace/History, Break on Errors und Set Next Statement | — |
| Options | Display, Set Paths, Right Mouse, Save, Syntax Checking einschließlich Zeilenprüfung | — |
| Window | New Window, Arrange All, Calls/Debug/Help/Immediate/Output/Project, aktive Codeliste, alle Fensterkürzel | — |
| Designer Tools/Window | Vollständige Toolbox einschließlich Spin, Formliste, Color Palette, Menu Design Window | — |
| Help | Index, Contents, Keyboard, Topic, Using Help, Tutorial, About | — |
Editor, inkrementelle Übersetzung, Ausführung, Formulardesigner, Debugger und Hilfe sind umgesetzt. Die gesamte
Phase-5-Abnahme erfolgt in Change 08.
## Programme ausführen
Shift+F5/Run → Start kompiliert den aktuellen Projektstand einschließlich
ungespeicherter Dokumente und startet eine frische TBVM. F5/Continue startet
im Bearbeitungsmodus oder setzt eine Pause fort. Run → Pause und Ctrl+Break
unterbrechen auch bei Editorfokus; Ctrl+C unterbricht ausschließlich bei
Programmfokus. Die Statusmeldung nennt Quelldatei und Unterbrechungszeile.
STOP pausiert. END/SYSTEM beenden die Sitzung, erhalten die letzte Ausgabe
und lassen die IDE offen. Natürliches Modulende hält sichtbare Formulare
weiter bedienbar. Laufzeitfehler erscheinen als Diagnose
mit Fehlernummer und Zeile; Kompilierfehler verhindern einen neuen Lauf.
Nach Quelländerungen während einer Pause verlangt Continue eine Entscheidung:
aktuellen Stand neu starten oder das alte Kompilat ausdrücklich fortsetzen.
Die zweite Wahl kennzeichnet das Output-Fenster mit **ALTES KOMPILAT**.
Laufender Code wird nicht nachträglich ersetzt. Der Dialog Modify COMMAND$
setzt Argumente für den nächsten Start. Restart und BASIC RUN erzeugen eine
neue VM samt Variablen, DATA-Zeiger, Fehlerzustand, Forms, Timern und Dateien.
RUN mit Dateiname löst das Ziel relativ zum Ausführungsziel auf; fremde Ziele
ersetzen das bearbeitete IDE-Projekt nicht. RUN auf dasselbe Ziel verwendet
den aktuellen Editorstand. Fehlende Ziele erhalten die Dokumente.
Eine ausgewählte Startdatei läuft zuerst; die übrigen Modulrümpfe behalten
ihre relative Reihenfolge. Ein ausgewähltes FRM wird Startformular, ein
ausgewähltes BAS verhindert den automatischen Formularstart allein aufgrund
der Projektmitgliedschaft. Ohne Auswahl bleiben Projektreihenfolge und erstes
Startformular wie bisher. CLI und gespeichertes TBC verwenden denselben Vertrag.
Window → Output und F4 zeigen denselben TextScreen. Das kleine Fenster schneidet
die Ansicht ab, verändert aber weder BASIC-Farben noch logische Bildschirmgröße.
Nur ein echtes Terminal-Resize verändert den Laufzeitbildschirm. Auch während
INPUT, LINE INPUT, INPUT$, RANDOMIZE ohne Argument, SLEEP und modaler Dialoge
bleiben Umschalten und Pausieren möglich; Eingabeteile, Prompt, Fokus und
Deadline bleiben erhalten. Eine Pause friert die Hostuhr nicht ein: Eine
verstrichene SLEEP-Deadline wird nach Continue sofort erkannt.
File → Shell und BASIC SHELL geben Raw Mode, Maus-/Paste-Erfassung und
Alternativschirm an ein Vordergrund-Kindprogramm mit geerbtem Standard-I/O ab.
Nach Ende, Fehler oder Ctrl+C werden Terminal und bisheriger IDE-Fokus
wiederhergestellt. SHELL als Funktion liefert den Exit-Code (bei unterbrochenem
Kind ohne regulären Exit-Code wie bisher: 0); ein fehlgeschlagener Prozessstart wird
BASIC-Fehler 53. Die IDE führt während der Übergabe keine VM-Schritte aus.
File → Print ist eine Plattformanpassung: Der Dialog schreibt Auswahl oder
Gesamttext als UTF-8 in eine wählbare Druckdatei (Vorgabe `LPT1.TXT`). Er nutzt
dieselben geschützten, atomaren Dateipfade wie Save Text. Überschreiben muss
explizit gewählt werden; Projekt-/Quelldateien und originale Binärdateien sind
weiter geschützt. Fehler halten den Dialog offen und verändern den Quelltext
nicht. Ein Druckertreiber ist dafür nicht erforderlich.
Die VM gibt nach einem festen Instruktionsbudget oder bei ausstehender Eingabe
die Kontrolle zurück. Synchrone Betriebssystemoperationen wie Öffnen, Lesen,
Schreiben, Datenbank-I/O oder Dateiauswahl lassen sich innerhalb eines laufenden
Systemaufrufs nicht unterbrechen. Sie sind keine Eingabewarte-Schleifen; nach
Rückkehr gelten wieder die normalen Unterbrechungsgrenzen. Es gibt keinen
VM-Hintergrundthread und keine zweite Kopie des Programmbildschirms.
## Reproduzierbarer Testpfad
`cargo test -p tb-ide` prüft denselben `App::handle(Event)`-Dispatcher und
dieselbe `App::render`-Funktion wie der Terminalprozess mit
`ratatui::TestBackend`. Die Tests bedienen Menü, Tastatur, Dialog und Maus;
sie prüfen Fokus, Dokumente, Fenster, sichtbare Texte und Farben. Dieser
Pfad steht den Folgechanges zur Verfügung. `TerminalGuard` prüft zusätzlich
Normalende, Fehlerende und teilweise fehlgeschlagene Initialisierung.
## Editor, Suche und Quelltextpflege
Einfügen/Überschreiben wechselt mit Insert. Shift mit Pfeilen, Pos1/Ende und
Bild auf/ab markiert Text; Ctrl+A markiert alles. Ctrl+Links/Rechts navigiert
wortweise, Ctrl+Pos1/Ende zum Dateianfang/-ende. Ctrl+Y löscht die aktuelle
Zeile. Unicode-Codepunkte und CRLF-Zeilenumbrüche bleiben unbeschädigt;
Tabs und breite Zeichen verwenden Bildschirmspalten für die Vertikalbewegung.
Markierungen werden invertiert dargestellt, der Cursor bleibt im sichtbaren Bereich.
Ctrl+C/X/V/Z sowie Ctrl+Insert, Shift+Delete/Insert und Alt+Backspace bedienen
Kopieren, Ausschneiden, Einfügen und Undo. Die Zwischenablage ist IDE-intern und
funktioniert zwischen Codefenstern. Terminal-Paste wird mit Bracketed Paste als
eine Aktion verarbeitet. Paste, Ausschneiden, Ersetzen aller Treffer,
Normalisierung und Prozedurerzeugung sind jeweils eine Undo-Einheit. Undo
stellt auch Cursor, Markierungen und Lesezeichen der gemeinsamen Ansichten her.
WordStar: Ctrl+Q, dann S/D setzt den Zeilenanfang/-ende, R/C den
Dateianfang/-ende. Ctrl+K, dann 03 setzt vier Lesezeichen je Ansicht;
Ctrl+Q, dann 03 springt dorthin. Esc oder eine unbekannte Folgetaste bricht
ab, ohne Quelltext einzufügen. Mausaktionen beenden einen begonnenen Chord.
Find und Change bieten Suchtext, Ersetzung, Richtung, Groß-/Kleinschreibung,
ganze Wörter und den Bereich „Dokument“ oder „Nur Auswahl“. Das Aktionsfeld
wählt Suchen, Einzeln ersetzen oder Alle ersetzen. Eine leere Ersetzung löscht
Treffer. Ctrl+Backslash übernimmt die Auswahl als Suchtext, F3 sucht weiter.
Am Bereichsende zeigt die Statusmeldung den angebotenen Rücksprung an;
erneutes F3 bestätigt ihn. Alle Treffer einer Ersetzungsaktion werden gemeinsam
rückgängig gemacht.
Shift+F2 beziehungsweise View → Procedures öffnet Modulrumpf und Prozeduren;
Ctrl+F2 kehrt zur vorherigen Codeposition zurück. New Sub/Function prüft Namen
auch gegen andere Projektmodule und übernimmt die am Erzeugungsort wirksamen
DEFtype-Regeln, einschließlich Includes und des aktuellen Prozedurkontexts.
View → Included File öffnet das Original der Include-Anweisung auf der
Cursorzeile. Included Lines zeigt die expandierte Übersetzungseinheit mit
Dateinamen und physischen Zeilen als schreibgeschützte Ansicht. Pfeile und
Bild auf/ab scrollen; erneuter Aufruf kehrt zum Quelltext zurück. Save File
speichert immer das physische Dokument. Eine Expansion wird niemals zur BAS-Datei.
View → Diagnostics ist eine ergänzende IDE-Funktion: Die Auswahl springt zur
richtigen physischen Datei, Zeile und Spalte, auch bei Includes und FRM-Code.
Syntax Checking prüft beim Verlassen einer geänderten Zeile. Der reguläre
Parser unterscheidet fehlende Blockabschlüsse am Dateiende von Syntaxfehlern.
Unvollständige Blöcke bleiben ohne modalen Fehlerdialog bearbeitbar. Gültige
Zeilen erhalten normalisierte Keywords und zulässige Abstände anhand der
Lexerpositionen; Tokenvergleich schützt Strings, Kommentare, DATA und Bezeichner.
Abschalten unterbindet automatische Prüfung, Formatierung und Fehlerdialoge.
Die explizite Übersetzungs-API prüft unabhängig davon den vollständigen Stand.
Save File/As und Save Project pflegen DECLAREs im kommentierten Bereich
`' $IDE DECLARE BEGIN` bis `' $IDE DECLARE END` unmittelbar vor den Prozeduren.
Die Prüfung nutzt den regulären Projektcompiler mit Includes und Forms. Passende
Handdeklarationen bleiben erhalten. Bei Konflikten oder unfertigem/fehlerhaftem
Projektstand wird die gesamte Pflege übersprungen, der Entwurf unverändert
gespeichert und der Grund mit Quellort ausgegeben. Auch FRM-Code benutzt diesen
Speicherhook. Wiederholtes Speichern erzeugt keine neuen Deklarationen oder Revisionen.
## Übersetzung und Revisionsbindung
`App::compile_current` lädt den aktuellen Projektstand und verwendet
`tb_vm::project::ProjectCompiler`. `CompileStats` zählt geparste, übersetzte und
wiederverwendete Module. Der Cache liegt nur im Speicher. Sein Verlust führt
zur vollständigen Neuübersetzung, ohne das Dateiformat zu ändern.
Die Schlüssel vergleichen Include-Inhalte und Herkunft, Modulidentität,
aufgelöste Importverträge und den Forms-Katalog. Private Rumpfänderungen lassen
andere Modulprodukte bestehen. Konstante Importwerte werden transitiv neu
aufgelöst; unbenutzte importierte Konstanten invalidieren keine unabhängigen
Module. Importierte TYPEs und Prozeduren gehören zu den unverketteten Tabellen
und damit zum Modulvertrag. Eigene Quellorte bleiben Bestandteil des Schlüssels;
verschobene fremde Prozedurzeilen sind keine Signaturänderung. Änderungen an
Quelltabellen oder Modulreihenfolge werden konservativ neu geparst. Der bestehende
Linker baut sämtliche globalen Tabellen aus unverknüpften Produkten neu auf und
prüft COMMON-Kompatibilität. Forms-Anfangswerte werden beim Link frisch eingesetzt.
Erfolge und Diagnosen gehören zu Projektrevision, expandierten Quellen und Forms.
`current_compilation` und `current_diagnostics` geben nur einen dazu passenden
Stand zurück; ein Fehler macht keinen früheren Erfolg aktuell. Geöffnete
Include-Puffer bleiben maßgeblich gegenüber externen Dateiänderungen. Noch nicht
geöffnete Includes werden erneut vom Loader gelesen und verglichen. Start und
Fortsetzen der VM verwenden diese Schnittstelle.
Release-Messungen und Aufruf stehen in [tbvm-design.md](tbvm-design.md).
Die Ausführungstests liegen in `crates/tb-ide/tests/execution.rs` und
`crates/tb-vm/tests/cooperative.rs`. Zusätzlich prüft
`cargo build -p tb-ide && python3 tests/support/ide-execution-pty.py` unter Unix
in einem unsichtbaren PTY die echten Shell-/Terminalübergaben und das Fortsetzen
nach STOP. Das Skript verwendet ausschließlich temporäre Projekte.
## Formulare gestalten
File → New Form öffnet ein neues FRM-Dokument mit 40×15 Zellen. Toolbox
links und Tools-Menü verwenden dieselben Klassenmetadaten: auch Datei-,
Verzeichnis- und Laufwerkslisten, Timer sowie VSpin/HSpin sind enthalten.
Doppelklick auf einen Toolboxeintrag platziert einen gültigen Standard im
gewählten Container (sonst auf der Form); mit Tastatur: Window → Toolbox,
Pfeile, Enter. Ein einfacher Klick oder Tools wählt das Werkzeug zum
Aufziehen auf der Designfläche. Esc beendet die Werkzeugwahl.
Die Vorschau verwendet FormsModel und TextScreen, führt aber keinen
Ereigniscode und keine Timer aus. Timer erscheinen als `[T]`-Marken.
Klicken wählt auch deaktivierte/unsichtbare Controls aus, Ctrl+Klick bildet
Mehrfachauswahlen. Tab/Shift+Tab folgt TabIndex. Drag verschiebt, die acht
Handles skalieren. Pfeile bewegen um eine, Ctrl+Pfeile um fünf Zellen;
Shift+Pfeile ändern die Größe (mit Ctrl ebenfalls fünf). View → Grid Lines
schaltet das Raster. Koordinaten sind relativ zum tatsächlichen Container.
Unzulässige Größen/Positionen werden vor der gesamten Änderung abgewiesen.
Oben wechseln F10 und F11 zwischen Properties Bar und Menü. Klicken auf
die Property-Auswahl öffnet die Klassenproperties; Bild auf/ab blättert
sie auf der Designfläche. F2 fokussiert Value, Ctrl+A ersetzt den Wert,
Enter übernimmt und Esc verwirft die Eingabe. Der rechte Bereich zeigt
Position und Größe auch bei langen Namen/Werten. Boolean-Werte sind
`true`/`false` beziehungsweise `-1`/`0`. Typen, Metadatenbereiche und
Laufzeitregeln werden geprüft; schreibgeschützte Properties bleiben erhalten.
Spin.Style wählt 0 (vertikal, 1×2) oder 1 (horizontal, 2×1); Width/Height
sind bei Spin schreibgeschützt. Explizites Index=0 erzeugt ein Control-Array. Weitere Controls derselben
Klasse und Form erhalten zuerst einen anderen eindeutigen Index und dann
denselben CtlName. Indexkollisionen oder doppelte Ereignisprozeduren werden
ohne Teiländerung abgewiesen; Undo stellt Namen und Codebindungen wieder her.
Cut/Copy/Paste/Clear und Undo wirken im Designer auf Controls; die
Textzwischenablage des Editors bleibt getrennt. Container nehmen ihre
Kinder mit. Paste verlangt einen Container und vergibt freie Namen,
wobei die Arraygruppen und expliziten Indizes erhalten bleiben. Eine
Mehrfachaktion ist genau eine Undo-Einheit. Nach Clear/Cut weist ein Dialog
auf erhaltenen, nun ungebundenen Code hin. Code wird nicht gelöscht.
CtlName/FormName ändern auch gebundene Codeverweise und Ereignisnamen
in betroffenen Projektdateien und Includes. Kommentare, Strings und
unabhängige Variablen bleiben erhalten. Beide Projektstände werden
übersetzt und ihre Objektbindungen verglichen. Konflikte oder mehrdeutige
Include-Verweise verhindern die gesamte Änderung. Undo aus einer beteiligten
Datei nimmt sie überall zurück; spätere Änderungen in einer anderen
beteiligten Datei müssen zuerst rückgängig gemacht werden.
Window → Menu Design Window zeigt die Menühierarchie. `+`/Insert fügt unter
dem gewählten Menü (sonst unter der Form) ein, Del löscht, Enter/Edit öffnet
Caption, CtlName, Tag, Index, Flags und Shortcut. `&` markiert Access-Keys,
`-` einen Separator. Leerer Index bedeutet skalar; `0` ist ein Arrayindex.
Die Pfeilbuttons beziehungsweise Ctrl+Links/Rechts ändern die Ebene,
Ctrl+Auf/Ab die Reihenfolge. Änderungen des Dialogs sind gemeinsam rücknehmbar.
Angeboten werden F1F10 mit unterstützten Modifikatoren sowie Ctrl+Buchstaben
außer Ctrl+C, das dem Programmabbruch vorbehalten bleibt. Unbekannte Importwerte
werden nicht als gültige Shortcuts angeboten; Menütitel und Separatoren tragen
keinen Shortcut.
Window → Color Palette bietet getrennte ForeColor-/BackColor-Zeilen. Eine
Farbfläche auf Form/Control ziehen trägt diese Farbe auf. Enter öffnet
zusätzlich den Dialog zum gemeinsamen Auftragen beider Farben auf die
Auswahl oder ausdrücklich die Form. Window bietet außerdem Toolbox, Help
und die Formliste; der Help-Inhalt folgt in Change 07.
F12/Edit → Event Procedures wählt Objekt und erlaubtes Ereignis. Eine
vorhandene gebundene Prozedur wird geöffnet; sonst entsteht ein New-Sub-Rumpf
mit den bestehenden Eventtypen, BYREF-Parametern und gegebenenfalls führendem
`Index AS INTEGER`. DEFtype aus Includes bleibt wirksam. Zweiter Aufruf
öffnet dieselbe Prozedur. Shift+F12/View → Form führt zum zugehörigen
Dokument und Control zurück; View → Code behält die Codeposition. Struktur
und Code bleiben dabei ungespeichert im gemeinsamen Dokument.
Save File/As/Project verwendet den vorhandenen FRM-Writer. Dieser lässt
überflüssige Defaultwerte aus, erhält aber explizites Index=0. Binärimporte
benötigen weiter ein separates Textziel. Die Designer-Tests prüfen alle
Klassen, Geometrie, Properties, Maus/Tastatur, Transaktionen, Ereignisse und
Speicher-Roundtrips. Der CLI-Integrationstest erzeugt eine FRM über dieselben
Designeraktionen und übersetzt sie mit dem echten `tbc build`-Prozess.
## Debugger und Direktfenster
F9 setzt oder entfernt eine Haltepunktmarke in der physischen Quelldatei.
Für Includes zuerst **View → Included File** öffnen; die schreibgeschützte
Gesamtansicht Included Lines ist kein eindeutiger Haltepunktort. Bei mehrfach
verwendeten Includes gehört die Marke zum ausgewählten Projektmodul.
**●** am Fensterrand bezeichnet einen gebundenen Haltepunkt, **○** eine
inaktive Marke. Textänderungen führen die Marken mit; eine gelöschte
Anweisung deaktiviert ihre Marke. Beim Start werden nur ausführbare Grenzen
der neuen Kompilatrevision gebunden. **Clear All Breakpoints** entfernt alle.
Ein Zeilenbreakpoint hält vor der ersten ausgeführten Anweisung der Zeile;
mehrere durch Doppelpunkt getrennte Anweisungen können einzeln geschritten werden.
| Aktion | Taste / Menü | Verhalten |
| --- | --- | --- |
| Continue | F5 | Führt die angehaltene Anweisung einmal aus; ein späterer Schleifendurchlauf kann erneut halten. |
| Single Step | F8 | Nächste BASIC-Anweisungsgrenze, auch innerhalb eines Aufrufs. |
| Procedure Step | F10 | Nächste Anweisung im ursprünglichen Frame nach dem Aufruf, einschließlich Rekursion und GOSUB; Breakpoints und Fehlerhalte haben Vorrang. |
| Run to Cursor | F7 | Temporäres Laufziel; ein anderer Halt oder das Ende beendet den Cursorlauf. |
| Next Statement | View → Next Statement | Zeigt den tatsächlichen aktuellen Ausführungsort. |
| Calls | Window → Calls | Aufrufkette mit Prozedur und Quelldatei/-zeile. Maus oder Pfeile wählen einen Inspektionsrahmen; der aktive VM-Frame bleibt unverändert. |
**Add Watch**, **Instant Watch / Shift+F9** und **Watchpoint** nehmen einen
BASIC-Ausdruck entgegen. **Window → Debug** zeigt Werte mit Typen und
Diagnosen pro Eintrag. Delete Watch/Delete All Watch löschen Definitionen;
das Debug-Fenster bearbeitet keinen Quelltext. Lokale Variablen, Arrays und
UDT-Felder beziehen sich auf den in Calls gewählten erreichbaren Frame.
`Modul!Variable` qualifiziert einen globalen Namen, beispielsweise
`Daten!satz.Preis` oder `Daten!preise(2)`. Arithmetik und Konvertierungen
stammen aus demselben Frontend und Bytecode wie normale BASIC-Anweisungen.
Automatische Watches sind nebenwirkungsfrei: Literale, Operatoren, vorhandene
Variablen, Array-/Feldzugriffe, String-/Mathematik-Intrinsics, FORMAT$, Arraygrenzen
sowie ERR/ERL sind erlaubt. Benutzerprozeduren, RND, Eingabe-/Datei-/Uhrfunktionen
und andere nicht als rein nachgewiesene Aufrufe liefern eine Diagnose.
Ein noch nicht initialisiertes Array wird durch einen Watch nicht angelegt.
Solche Aufrufe sind über das Direktfenster möglich. Watchpoints benötigen eine
numerische BASIC-Bedingung und halten an der nächsten Anweisungsgrenze, an der
sie wahr ist. Continue überspringt die aktuelle Prüfung einmal; bleibt die
Bedingung wahr, kann die folgende Grenze erneut halten. Ein fehlerhafter
Eintrag löst keinen Halt aus.
**Window → Immediate** öffnet das Direktfenster. Im Break-Modus führt Enter
PRINT, Zuweisungen, Prozeduraufrufe und ERROR aus; Doppelpunkte verbinden
mehrere Anweisungen. Vor der Ausführung wird das gesamte Kommando übersetzt.
Syntax-/Typfehler verändern weder Variablen noch Fortsetzungspunkt.
Erfolgreiche Kommandos kehren zur ursprünglichen Pause zurück. PRINT ist im
Direktfenster und im gemeinsamen Programmbildschirm sichtbar. Zuweisungen,
BYREF-Aufrufe und normale Laufzeitnebenwirkungen bleiben wirksam. Laufzeitfehler
nutzen die bestehenden Handler und RESUME-Regeln; unbehandelte Direktfehler
werden angezeigt, während die ursprüngliche Pause erhalten bleibt.
Run → Pause/Ctrl+Break unterbricht auch ein laufendes Direktkommando. Ein
wartender Prozeduraufruf bleibt fortsetzbar; seine Programmeingaben werden über
Window → Output zugestellt. F5 setzt zunächst das noch aktive Kommando fort;
nach dessen Abschluss setzt ein weiteres F5 das ursprüngliche Programm fort.
END/SYSTEM beenden die Sitzung, RUN startet über den normalen Sitzungsreset.
Direktcode hat den Quellort `<Immediate>` und wird nie im Projekt gespeichert.
**Trace On** verfolgt die aktuelle Quellstelle. **History On** hält höchstens
1.024 tatsächlich begonnene Anweisungen; die ältesten Einträge fallen heraus.
Shift+F8/Shift+F10 navigieren zurück/vorwärts. Die Meldung **HISTORIE** bezeichnet
nur eine historische Quellstelle: Watchwerte gehören weiterhin zum aktuellen
Halt. Variablen, Dateien, Uhr und andere Nebenwirkungen werden nicht zurückgesetzt.
Ein Neustart verwirft Frameauswahl, Verlauf, Instant-Watch und alte Werte,
erhält Watchdefinitionen und bindet Breakpoints neu.
**Break on Errors** hält nach der Handlerwahl und nötigem Stack-Unwinding vor
der ersten Handleranweisung. Die Anzeige nennt Fehlernummer, Ursache und
Handlerziel; Continue führt den Handler einmal aus. ERR/ERL und RESUME behalten
ihren normalen Vertrag. Unbehandelte Programmfehler beenden die Sitzung mit
Fehlerdiagnose; unbehandelte Direktfehler sind ausdrücklich als solche sichtbar.
**Set Next Statement** ist nur an einer freien Anweisungsgrenze im aktiven
Frame zulässig. Das Ziel muss ausführbar sein und denselben Kontroll- und
Schleifenkontext besitzen. Fremde Frames, Eintritt in Handler/GOSUB-Bereiche,
aktive GOSUB-/Fehlerbehandlung, Warteoperationen und ein aktives Direktkommando
werden mit Begründung abgewiesen. Die Prüfung erfolgt vor jeder Änderung.
Ein erlaubter Sprung führt keine übersprungenen Anweisungen aus.
Cursorziele setzen den unveränderten Quellstand der pausierten Sitzung voraus;
nach Änderungen zuerst neu starten. F5 kann weiterhin nach ausdrücklicher
Auswahl das gekennzeichnete alte Kompilat fortsetzen; seine Watches verwenden
die ursprünglichen Symbole und Slots.
## Offline-Hilfe
Help → Contents zeigt die eingebetteten Dokumente mit ihren Abschnitten,
Help → Index dieselben Ziele alphabetisch. F1 öffnet den Kontext zum
BASIC-Wort, zur Designerklasse/-eigenschaft oder zum markierten Menübefehl.
Shift+F1 erklärt die [Hilfebedienung](hilfe.md); [Tastatur](tastatur.md) und
[Tutorial](tutorial.md) beschreiben die implementierten Arbeitsabläufe.
Tab/Shift+Tab wählen Links, Enter folgt, Alt+F1 stellt bis zu 20 vorherige
Lesepositionen wieder her. Ctrl+F1 folgt der Contents-Dateireihenfolge.
Pfeile und Page Up/Down scrollen; links/rechts verschiebt breite Code- und
Tabellenzeilen. Größenänderungen behalten Thema, Leseanker und Linkfokus.
Esc kehrt zum vorherigen Fenster zurück. Die Hilfe braucht keinen Checkout
und öffnet externe Links ausschließlich als sichtbaren Hinweis.