Inhaltsverzeichnis
PXAML-Pipeline
Die PXAML-Pipeline transformiert deklaratives UI-Markup in lauffähige Benutzeroberflächen.
Überblick
PXAML (Markup) → Parser → IR (JSON) → Renderer → GUI/TUI/Web
Phasen der Pipeline
Phase 1: Parsing
Der PXAML-Parser liest XML-Markup und erzeugt einen Abstract Syntax Tree (AST).
<!-- Input: PXAML --> <Window Title="Demo" Width="400"> <Button Content="Click me" Click="OnClick"/> </Window>
Parser-Aufgaben:
- XML-Validierung
- Namespace-Auflösung
- Element-Erkennung
- Attribut-Parsing
- Event-Bindung-Erkennung
Phase 2: IR-Generierung
Der AST wird in eine Intermediate Representation (IR) transformiert - ein JSON-basiertes Zwischenformat.
{
"type": "Window",
"properties": {
"Title": { "value": "Demo", "type": "string" },
"Width": { "value": 400, "type": "number" }
},
"children": [
{
"type": "Button",
"properties": {
"Content": { "value": "Click me", "type": "string" }
},
"events": {
"Click": { "handler": "OnClick" }
}
}
]
}
IR-Eigenschaften:
- Plattformunabhängig
- Serialisierbar (JSON)
- Diff-fähig für Hot Reload
- Typ-Information erhalten
Phase 3: Binding-Auflösung
Data-Bindings werden analysiert und in ausführbare Strukturen umgewandelt.
<!-- PXAML mit Binding --> <TextBox Text="{Binding Path=UserName, Mode=TwoWay}"/>
{
"type": "TextBox",
"properties": {
"Text": {
"type": "binding",
"path": "UserName",
"mode": "TwoWay"
}
}
}
Phase 4: Rendering
Die IR wird vom zielspezifischen Renderer in native UI-Elemente übersetzt.
| Renderer | Ausgabe | Technologie |
|---|---|---|
| GUI | Native Controls | LCL/WinAPI |
| TUI | Terminal-Zeichen | ANSI/VT100 |
| Web | DOM-Elemente | HTML/CSS |
Komponenten
TWvdSPxamlParser
type TWvdSPxamlParser = class public function Parse(const ASource: string): TWvdSIRNode; function ParseFile(const APath: string): TWvdSIRNode; end;
TWvdSIRNode
type TWvdSIRNode = class NodeType: string; Properties: TWvdSPropertyMap; Children: TWvdSIRNodeList; Events: TWvdSEventMap; Bindings: TWvdSBindingList; end;
TWvdSRenderer (Abstrakt)
type TWvdSRenderer = class abstract public procedure Render(ARoot: TWvdSIRNode); virtual; abstract; procedure Update(AOldRoot, ANewRoot: TWvdSIRNode); virtual; abstract; end;
Hot Reload
Die Pipeline unterstützt Hot Reload durch IR-Differenzierung:
1. Neue PXAML → Parser → Neue IR 2. Diff(Alte IR, Neue IR) → Patch-Liste 3. Renderer.ApplyPatches(Patch-Liste)
Vorteile:
- Nur geänderte Elemente werden aktualisiert
- Zustand bleibt erhalten
- Schnelle Iteration während der Entwicklung
Fehlerbehandlung
| Fehlertyp | Phase | Behandlung |
|---|---|---|
| XML-Syntaxfehler | Parsing | Position + Meldung |
| Unbekanntes Element | Parsing | Warnung + Fallback |
| Ungültiger Property-Typ | IR | Type Coercion + Warnung |
| Binding-Fehler | Binding | Fallback-Wert |
Siehe auch
Zuletzt geändert: den 29.01.2026 um 15:13