7.9 KiB
Verification Report: phase-5-05-formular-designer
Stand: 2026-09-06. Geprüft wurden Proposal, Design, alle zwölf Tasks und alle sechs Anforderungen samt Szenarien gegen den aktuellen Arbeitsstand.
Ergebnis
| Dimension | Ergebnis |
|---|---|
| Completeness | 12/12 Aufgaben; 6/6 Anforderungen umgesetzt |
| Correctness | Alle sechs Spec-Szenarien durch ausführbare Prüfungen abgedeckt |
| Coherence | Gemeinsames FRM-Dokument, vorhandene Metadaten, FormsModel/TextScreen, gemeinsamer Prozedur- und Undo-Pfad |
| Offene Befunde | 0 CRITICAL, 0 WARNING, 0 SUGGESTION |
Anforderungen und Szenarien
Die Designerprüfungen liegen in crates/tb-ide/tests/designer.rs und bedienen
die produktiven App-Aktionen sowie den realen Event-Dispatcher/Renderer.
| Anforderung / Scenario | Implementierung | Nachweis |
|---|---|---|
| Designfläche und vollständige Toolbox / Jede Controlklasse | designer::tools, design_place, preview, design_mouse, design_render; commands::menus |
all_metadata_tools_persist_and_preview_matches_runtime_without_events: alle 17 Toolboxvarianten, einschließlich VSpin/HSpin, Browserklassen und Timer, persistieren mit gleichen wirksamen Properties. Pixelvergleich mit FormsModel-Rendering; aktivierter 1-ms-Timer bleibt in der Vorschau ohne Deadline/Ereignis, Load-/Timer-Code wird nicht ausgeführt. toolbox_double_click_tool_drag_grid_and_window_form_selection prüft Doppelklick und Tools-Aufziehen. Menu wird durch die Menütests abgedeckt. |
| Auswahl und Geometrie / Container und Mehrfachauswahl | design_select, design_geometry, design_resize, design_tab, design_mouse; öffentliche Laufzeitgeometrie FormsModel::rect |
container_multiselect_keyboard_drag_resize_and_undo: tatsächliche Framekoordinaten, Ctrl+Klick, Tab/Shift+Tab, 1-/5-Zellen-Bewegungen, Shift-Skalierung, Drag und gemeinsames Undo. all_eight_handles_resize_transactionally_and_preserve_identity_after_structure_edits: alle acht Handles, Ablehnung unzulässiger Geometrie und stabile IDs über Indexänderung, Löschen, Neuanlage und Undo. |
| Properties Bar und Bearbeitungsaktionen / Ungültige Eigenschaft | design_property, design_value_focus, design_bar, design_copy/paste/delete; Project::edit_form/undo |
property_bar_types_readonly_and_no_status_line: Typen/Bereiche/readonly, F2/F10, sichtbare Geometrie, keine Statuszeile, Spin-Größenvertrag. Runtime-Setter validieren zusätzlich kontextabhängige Propertyregeln in einer isolierten Vorschau. clipboard_children_arrays_and_delete_preserve_code: Containerkinder, neue Namen, erhaltene Array-Indizes, Cut/Paste/Clear und vollständiges Undo. |
| Menüdesigner und Farbpalette / Menü mit Array und Untermenü | design_action, design_submit, design_menu_move/commit, design_tool_render; forms::menu_shortcuts |
menu_hierarchy_arrays_shortcuts_and_palette_use_events: Access-Key, Separator, Index=0, Shortcut, Hierarchie/Reihenfolge, FRM-Roundtrip und Kompilierung; Fore-/BackColor-Auftrag. menu_indent_outdent_rename_and_field_changes_have_one_undo: Ebenenwechsel und eine Undo-Einheit für Name und Dialogfelder. property_menu_buttons_palette_drag_and_modal_mouse_are_connected: echte Property-/Menübuttons, Farbdrop und Modalität. |
| Dokumentkonsistenz und Umbenennen / Umbenennen mit Ereigniscode | design_rename_with; ProjectCompiler::bound_form_references; opt-in Referenzaufzeichnung im regulären Sema; Project::commit_transaction/undo |
bound_rename_across_documents_is_atomic_and_undo_restores_all: Control, Handler und qualifizierte Verweise in anderen Modulen; Undo aus einer beteiligten Datei; Konflikt-/Syntaxabbruch ohne Teiländerung. rename_preserves_shadowed_names_and_handles_form_aliases_and_include_calls, shared_include_ambiguity_aborts_rename_and_event_defaults_use_includes, imported_type_shadow_is_not_an_object_reference_during_rename: Kommentare/Strings, gleichnamige Variablen, importierte UDT-Felder, Prototypen/Aufrufe, Formularalias und mehrdeutig gemeinsam genutzte Includes. Löschen erhält Code und meldet ungebundene Handler sichtbar. |
| Ereignisprozeduren und Moduswechsel / Ereignis zweimal öffnen | design_event, event_parameters, gemeinsames App::new_procedure_text; show_document/design_enter |
clipboard_children_arrays_and_delete_preserve_code öffnet Array-Click zweimal ohne Duplikat. event_array_signature_twice_and_shared_form_identity prüft außerdem DragOver zweimal mit Index/CONTROL/SINGLE/INTEGER, gleiche Dokumentidentität, Cursor und Controlauswahl. existing_default_typed_event_and_all_metadata_signatures_compile: vorhandene DEFtype-Signatur und alle CommandButton-Events kompilieren. events_with_the_same_name_are_local_to_their_form: gleichnamige Ereignisse zweier Formulare bleiben getrennt. |
Persistenz und Compilergrenze
binary_designer_import_requires_text_target_and_compilesbearbeitet einen echten Binärimport, verlangt ein separates Textziel, erhält die Originalbytes und lädt das Ergebnis über den bestehenden Compilerpfad.crates/tb-cli/tests/project.rs::designer_frm_is_accepted_by_the_standalone_cli_compilererzeugt ein Formular samt Control-Array und Ereigniscode über App-Aktionen, speichert es mit dem vorhandenen Writer, startet den echtentbc build-Prozess und lädt das erzeugte TBC erneut. Die zusätzliche Abhängigkeit auf tb-ide gilt ausschließlich für CLI-Tests; es gibt keine neue externe Bibliothek.- Der FRM-Writer lässt explizite Defaultwerte weg. Die Roundtripprüfung vergleicht Klassen, Namen, Hierarchie, explizite Array-Indizes und sämtliche wirksamen Metadatenproperties, statt unterschiedliche interne Maps als Formatfehler zu behandeln.
Behobene Befunde während der Verifikation
-
Acht Größenhandles einschließlich linker/oberer Kanten und zusammenfallender Handles kleiner Controls werden korrekt aufgelöst.
-
Designerzeichen erreichen den Quelltexteditor nicht. Property-/Menübuttons sind im nichtmodalen Dispatcher angebunden; Dialoge sperren Hintergrundaktionen.
-
Fenster-/Formwechsel aktualisieren die Designeridentität. Die ursprüngliche Befehlsidentität beim Weiterschalten eines Fensters bleibt erhalten.
-
Positions-/Größenanzeige bleibt rechts sichtbar, auch wenn Propertytext lang ist.
-
Umbenennen nutzt die Importkontexte der tatsächlich übersetzten Module. Synthetische Importprototypen ohne physische Quellposition werden nicht editiert. Echte Prototypen und Prozeduraufrufe werden semantisch erfasst; keine globale Bezeichnerersetzung beschädigt unabhängige Variablen/UDT-Felder.
-
Ereigniserzeugung verwendet denselben includebewussten New-Sub-Pfad wie der Editor. Vorhandene Formularalias-/DEFtype-Signaturen und gleichnamige Events unterschiedlicher Formulare werden korrekt zugeordnet.
-
Aktivierte Timer bleiben im Dokument erhalten, sind in der Vorschau aber ausdrücklich deaktiviert. Es existiert dort keine VM oder Event-Pump.
-
Der workspaceweite Clippy-Lauf fand die bereits vorhandene Shell-Hilfsfunktion hinter dem Testmodul in
tb-runtime/src/host.rs. Sie wurde unverändert vor das Testmodul verschoben; das beseitigt die Ordnungswarnung ohne Verhaltensänderung.
Abschlussprüfungen
cargo test --workspace: 567 bestanden, 0 fehlgeschlagen, 2 bestehende Ignore-Fälle (Golden-Output-Generator und externe VBDOS-Referenzsuite). Darin: 17 Designer-Integrationstests und der zusätzliche echte CLI-Compilerpfad.cargo clippy --workspace --all-targets -- -D warnings: bestanden.cargo fmt --all -- --check: bestanden.git diff --check: bestanden.openspec validate --all --strict: 23/23 gültig. Vorhandene INFO-Hinweise zur Länge von Requirement-Texten sind keine Validierungsfehler.
Keine angeforderte Prüfdimension wurde ausgelassen. Die Tests sind headless; für diesen Change wurde keine interaktive GUI-/Emulatorsitzung benötigt. Die gemeinsame Phase-5-Abnahme bleibt Aufgabe von Change 08. Der Change ist vollständig umgesetzt und zur separaten Synchronisierung/Archivierung bereit.