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

7,7 KiB

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:

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)