edu-senex/edu/content/flashcards/deck-windows.md

170 Zeilen
7,7 KiB
Markdown

# Flashcard Deck: Fensterprogrammierung & SubWindows
**Thema**: Window-Hierarchie, SubWindow-Muster, Command-Delegation in Solution2
**Karten**: 25
---
## Karte 1 | Basis
**Q:** Welche 3 Fenster-Superklassen hat Solution2?
**A:** `wBaseWindow` (Wurzel), `wMainWindow` (Hauptfenster, erbt von wBaseWindow), `wSubWindow` (eingebettete Panels, erbt auch von wBaseWindow). Alle in `solution2/SuperClasses/`.
---
## Karte 2 | Basis
**Q:** Was ist `wBaseWindow`?
**A:** Die Wurzel-Superklasse ALLER Solution2-Fenster (hat KEINE eigene Superklasse). Definiert gemeinsame Infrastruktur: `ioCode`, `iiRef2SubWindow`, `ibControl2SubWindow`, `ilList`, `irRow`, `inEDMode`, `icCurrTabPane`.
---
## Karte 3 | Basis
**Q:** Was ist `wMainWindow`?
**A:** Superklasse fuer eigenstaendige Dateneingabe-Fenster (z.B. wOrders, wParts). Erbt von `wBaseWindow`. Fuegt hinzu: `irRowCount`, `irRowMax`, `irStatusBarPane`. Ruft bei Commands immer `$closeRelatedWindow()` auf.
---
## Karte 4 | Basis
**Q:** Was ist `wSubWindow`?
**A:** Superklasse fuer eingebettete Fenster-Panels (in Tabs/Paged Panes). Erbt von `wBaseWindow`. Fuegt hinzu: `iiRef2Parent` (Rueck-Referenz), `icFormWindow` (Rechte), `icSubWindow`, `iiRef2Window`. Ermoeglicht rekursive Verschachtelung.
---
## Karte 5 | Kritisch
**Q:** Was macht `ibControl2SubWindow`?
**A:** DER zentrale Schalter! Wenn `kTrue`: Commands gehen an `iiRef2SubWindow`. Wenn `kFalse`: Commands gehen an `ioCode` (Business-Logik). Wird von `$setControl2SubWindow()` gesetzt/zurueckgesetzt.
---
## Karte 6 | Kritisch
**Q:** Was passiert in `wSubWindow.$construct`?
**A:** 1) `Do inherited` (wBaseWindow-Init), 2) `Set reference iiRef2SubWindow` auf eigenes SubWindow-Feld, 3) `Set reference iiRef2Parent` auf pRef2Parent, 4) `$translateObjects`, 5) `icFormWindow` merken, 6) **`iiRef2Parent.$setControl2SubWindow(kTrue)`** = Kontrolle uebernehmen!, 7+8) Row/List-Namen setzen.
---
## Karte 7 | Kritisch
**Q:** Was passiert in `wSubWindow.$destruct`?
**A:** 1) `iiRef2Parent.$setControl2SubWindow(kFalse)` = Kontrolle ZURUECKGEBEN!, 2) `ilList.$define()` = Liste leeren, 3) `irRow.$define()` = Row leeren, 4) `irRowSearch.$define()` = Such-Row leeren. **Ohne diesen Code denkt der Parent das SubWindow existiert noch!**
---
## Karte 8 | Kritisch
**Q:** Wie sieht das Command-Delegation-Pattern aus?
**A:** Auf JEDEM Fenster identisch:
```omnis
If $cinst.ibControl2SubWindow
Do iiRef2SubWindow.$cXxx() ## -> SubWindow
Else
Do $cinst.ioCode.$cXxx() ## -> Business-Logik
End If
```
Gilt fuer: $cEdit, $cInsert, $cSave, $cCancel, $cDelete, $cPrint, $cAudit, $cNextVersion.
---
## Karte 9 | Wichtig
**Q:** Was ist die bidirektionale Referenz-Kette?
**A:** Jedes SubWindow hat `iiRef2Parent` (zeigt auf den Elter) UND der Elter hat `iiRef2SubWindow` (zeigt auf das Kind). So koennen Commands abwaerts und TabPane-Sperren aufwaerts fliessen.
---
## Karte 10 | Wichtig
**Q:** Wie fliesst ein Edit-Command durch die Hierarchie?
**A:** `wMainWindow.$cEdit` -> prueft `ibControl2SubWindow=kTrue` -> `wSubWindow.$cEdit` (Ebene 1) -> prueft `ibControl2SubWindow` -> entweder an Sub-SubWindow ODER an `ioCode.$cEdit()`. Der Command "sinkt" bis zur tiefsten aktiven Ebene.
---
## Karte 11 | Wichtig
**Q:** Was macht `$closeRelatedWindow()` und wann wird es aufgerufen?
**A:** Schliesst alle zugehoerigen Popup-Fenster. Wird auf `wMainWindow` IMMER VOR der Command-Delegation aufgerufen. Auf `wSubWindow` wird es NICHT aufgerufen - der Unterschied zwischen Main und Sub!
---
## Karte 12 | Wichtig
**Q:** Wie funktioniert `$EnableTabPane`?
**A:** SubWindow ruft `iiRef2Parent.$EnableTabPane($cinst.inEDMode)` auf -> Parent ruft `$cwind.$objs.TP.$enableTabPanes(pEDMode)` auf -> Tab-Reiter werden gesperrt/freigegeben. Die Sperre fliesst AUFWAERTS in der Hierarchie!
---
## Karte 13 | Wichtig
**Q:** Wie heisst das TabPane-Objekt in Solution2 standardmaessig?
**A:** `TP` - das ist Konvention! Zugriff ueber `$cwind.$objs.TP.$enableTabPanes(pEDMode)`.
---
## Karte 14 | Wichtig
**Q:** Wie schliesst sich ein SubWindow?
**A:** Es schliesst sich NICHT selbst! `wSubWindow.$closeWindow` delegiert an: `Do iiRef2Parent.$closeWindow()`. Der Parent entscheidet ueber das Schliessen des gesamten Fensters.
---
## Karte 15 | Mittel
**Q:** Was ist `ioCode`?
**A:** Das Business-Logik-Objekt (z.B. `oOrders`, `oOrderItems`). Es ist der "letzte Stopp" fuer Commands wenn kein aktives SubWindow existiert. Wird als Instanzvariable im Fenster definiert und enthaelt Methoden wie `$cEdit()`, `$cSave()`, `$cDelete()`.
---
## Karte 16 | Mittel
**Q:** Was ist `icFormWindow`?
**A:** Der Name des Formulars, der im `$construct` aus `pFormWiindow` (ja, mit Tippfehler im Original!) gesetzt wird. Wird fuer Pfad- und Rechtebestimmung (RBAC) verwendet.
---
## Karte 17 | Mittel
**Q:** Wie weit kann die SubWindow-Verschachtelung gehen?
**A:** Theoretisch unbegrenzt (rekursiv). Jedes SubWindow kann ein eigenes SubWindow-Feld haben. Praktisches Beispiel: `wOrders` (Main) -> `wOrder` (Sub, Details) -> `wOrderItems` (SubSub, Positionen). Typisch: 2-3 Ebenen.
---
## Karte 18 | Mittel
**Q:** Was macht `$setControl2SubWindow(pBool)`?
**A:** Setzt `ibControl2SubWindow` auf den uebergebenen Wert. Wird von SubWindows aufgerufen: `kTrue` in `$construct` (Kontrolle uebernehmen), `kFalse` in `$destruct` (Kontrolle zurueckgeben).
---
## Karte 19 | Mittel
**Q:** Was macht `wOrder.$SubWindowSavesAttachments`?
**A:** Prueft welches SubWindow aktiv ist (`iiRef2SubWindow.$classname`) und ruft je nach Typ verschiedene Save-Methoden auf. Zeigt: Man kann per `$classname` auf dem SubWindow verschiedene Aktionen ausloesen.
---
## Karte 20 | Mittel
**Q:** Was ist der Unterschied bei Cross-Library-Vererbung?
**A:** Innerhalb der `solution2`-Library: `wSubWindow` reicht. Aus anderen Libraries (Sales, Manufacturing, etc.): `solution2.wSubWindow` mit Library-Prefix noetig! Beispiel: `wOrder extends solution2.wSubWindow`.
---
## Karte 21 | Fortgeschritten
**Q:** Was passiert wenn ein SubWindow die Kontrolle ABLEHNT?
**A:** Es ruft sofort `$setControl2SubWindow(kFalse)` im `$construct` auf. Beispiel: `wWebPortal.$construct` macht `Do pRef2Parent.$setControl2SubWindow(kFalse)`. Das Fenster ist dann nur ein Anzeige-Panel ohne Command-Routing.
---
## Karte 22 | Fortgeschritten
**Q:** Was macht `wOrderItems.$CallParentDoCommand`?
**A:** Delegiert einen Command AUFWAERTS: `Do iiRef2Parent.$CallDoCommand`. Damit kann ein SubWindow seinen Parent bitten, einen bestimmten Command auszufuehren - die umgekehrte Richtung vom normalen Fluss!
---
## Karte 23 | Fortgeschritten
**Q:** Was passiert wenn $destruct das `$setControl2SubWindow(kFalse)` vergisst?
**A:** Das Elternfenster denkt, das SubWindow existiert noch (`ibControl2SubWindow = kTrue`). Alle Commands werden an eine tote Referenz geschickt -> "Method not found"-Fehler. Der haefigste SubWindow-Bug!
---
## Karte 24 | Fortgeschritten
**Q:** Wie debuggt man Command-Routing-Probleme?
**A:** 1) `Calculate lDebug as $cinst.ibControl2SubWindow` pruefen, 2) `iiRef2SubWindow` auf NULL pruefen, 3) Breakpoint in `$cEdit`/`$cCancel` des SubWindows setzen, 4) Pruefen ob `$construct` mit `Do inherited` aufgerufen wird, 5) Pruefen ob Superklasse korrekt ist (`wSubWindow` vs `wBaseWindow`).
---
## Karte 25 | Fortgeschritten
**Q:** Was sind die 7 goldenen Regeln der Fensterprogrammierung?
**A:** 1) `ibControl2SubWindow` bestimmt ALLES, 2) $construct baut die Kette auf (`inherited`!), 3) $destruct baut sie ab (Kontrolle zurueckgeben!), 4) Commands fliessen ABWAERTS, 5) TabPane-Sperren fliessen AUFWAERTS, 6) $closeWindow delegiert AUFWAERTS, 7) `ioCode` ist der letzte Stopp.
---
## Spaced Repetition Tracking
| Karte | Zuletzt | Naechste | Schwierigkeit |
|-------|---------|----------|---------------|
| (wird beim Ueben gefuellt) | | | |