edu-senex/edu/content/cheatsheets/windows-cheatsheet.md

144 Zeilen
3,8 KiB
Markdown

# Window-Architektur Cheat Sheet
## Klassenhierarchie
```
wBaseWindow (Wurzel - keine Superklasse)
+-- wMainWindow (eigenstaendige Fenster: wOrders, wParts...)
+-- wSubWindow (eingebettete Panels: wOrder, wOrderItems...)
```
## Wichtigste Instanzvariablen
### Auf ALLEN Fenstern (von wBaseWindow):
| Variable | Zweck |
|----------|-------|
| `ioCode` | Business-Logik-Objekt |
| `iiRef2SubWindow` | Referenz auf aktives SubWindow |
| `ibControl2SubWindow` | `kTrue` = Commands gehen an SubWindow |
| `ilList` | Haupt-Datenliste |
| `irRow` | Aktuelle Datenzeile |
| `inEDMode` | Bearbeitungsmodus |
| `icCurrTabPane` | Aktiver Tab-Reiter |
### Nur auf wSubWindow:
| Variable | Zweck |
|----------|-------|
| `iiRef2Parent` | Referenz ZURUECK zum Elter |
| `icFormWindow` | Name fuer Rechte-Check |
| `icSubWindow` | SubWindow-Feldname |
## DAS zentrale Pattern: Command-Delegation
```omnis
## Auf jedem Fenster identisch:
If $cinst.ibControl2SubWindow
Do iiRef2SubWindow.$cXxx() ## -> Weiter ans SubWindow
Else
Do $cinst.ioCode.$cXxx() ## -> Business-Logik
End If
```
## Lebenszyklus
### $construct (SubWindow meldet sich an):
```omnis
Do inherited
Set reference iiRef2SubWindow to $cinst.$objs.wSubWindow.$ref
Set reference iiRef2Parent to pRef2Parent
Do iiRef2Parent.$setControl2SubWindow(kTrue) ## KONTROLLE UEBERNEHMEN
```
### $destruct (SubWindow meldet sich ab):
```omnis
If iiRef2Parent
Do iiRef2Parent.$setControl2SubWindow(kFalse) ## KONTROLLE ZURUECKGEBEN
End If
Do ilList.$define()
Do irRow.$define()
```
### $closeWindow (delegiert nach oben):
```omnis
Do iiRef2Parent.$closeWindow() ## Parent schliesst das Fenster
```
### $EnableTabPane (sperrt Tabs nach oben):
```omnis
Do iiRef2Parent.$EnableTabPane($cinst.inEDMode) ## Parent sperrt seine Tabs
```
## Command-Fluss Beispiel (Sales/wOrders)
```
User klickt [Edit]
-> wOrders.$cEdit (wMainWindow)
-> $closeRelatedWindow()
-> ibControl2SubWindow = kTrue
-> wOrder.$cEdit (wSubWindow Ebene 1)
-> ibControl2SubWindow = kTrue
-> wOrderItems.$cEdit (wSubWindow Ebene 2)
-> ibControl2SubWindow = kFalse
-> ioCode.$cEdit() == oOrderItems.$cEdit()
-> HIER passiert die Aktion!
```
## Alle delegierten Commands
### wMainWindow (mit $closeRelatedWindow):
`$cEdit`, `$cCancel`, `$cAudit`, `$cNextVersion`
### wSubWindow (ohne $closeRelatedWindow):
`$cEdit`, `$cCancel`, `$cInsert`, `$cDelete`, `$cSave`, `$cPrint`, `$cAudit`, `$cNextVersion`, `$cFirst`, `$cLast`
## Referenz-Kette
```
iiRef2SubWindow iiRef2SubWindow
MainWindow ----------> SubWindow ----------> SubSubWindow
<---------- <----------
iiRef2Parent iiRef2Parent
```
## Cross-Library Vererbung
```
# Innerhalb solution2-Library:
wMeinFenster extends wSubWindow
# Aus anderer Library (Sales, Manufacturing...):
wMeinFenster extends solution2.wSubWindow ## Library-Prefix noetig!
```
## TabPane-Konvention
```
TabPane-Objekt heisst IMMER: TP
Zugriff: $cwind.$objs.TP.$enableTabPanes(pEDMode)
```
## 7 Goldene Regeln
```
1. ibControl2SubWindow bestimmt ALLES
2. $construct: inherited aufrufen = Kette aufbauen
3. $destruct: Kontrolle zurueckgeben
4. Commands fliessen ABWAERTS (Main -> Sub -> SubSub)
5. TabPane-Sperren fliessen AUFWAERTS (Sub -> Parent)
6. $closeWindow delegiert AUFWAERTS
7. ioCode ist der letzte Stopp (kein SubWindow aktiv)
```
## Debugging Quick-Check
```omnis
# 1. Wer hat die Kontrolle?
Calculate lDebug as $cinst.ibControl2SubWindow
# 2. Ist SubWindow-Referenz gueltig?
If iiRef2SubWindow
# Referenz existiert
End If
# 3. Welches SubWindow ist aktiv?
Calculate lClass as iiRef2SubWindow.$classname
# 4. Hat $construct inherited aufgerufen?
# -> Breakpoint in wSubWindow.$construct setzen
# 5. Ist Superklasse korrekt?
# -> Class Inspector -> Superclass pruefen
```