# 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) | | | |