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