Wenn man eine komplexe Steuerung möchte, kann man mit SetAppFocus() hantieren, wobei man wissen muss, dass der Event NACH dem Verlassen aufgerufen wird.
Ich schau mal wo ich sowas verwendet habe.
im Fenster selbst habe ich bei :SetInputFocus() auf eine eigene Methode dieses Fensters verwiesen, die alle Schaltungen dieses Fensters vorgenommen hat.
Code: Alles auswählen
*---------------------------------------------------------------------------------------- INIT
METHOD tpBeaDrucken:init( ... )
...
::SetInputFocus := {|| ::Schalten() }
...
*----------------------------------------------------------------------------- schalten() -------
METHOD tpBeaDrucken:schalten()
if ::setParent():setParent():tpSuchen:Bearbeitungsgrund() = "ADR" // nur Adresse ändern *** abhängig vom Hauptfenster, dies ist eine TabPage mit Druckeinstellungen.
* Grundeinstellung setzen
::chbKopieAkte:setData(.f.)
::chbKopieBerechtigter:setData(.f.)
::chbAlsAnlageDrucken:setData(.f.)
::chbKopieAdressen:setData(.f.)
::chbKopieAdressenL261:setData(.f.)
::chbRAGMitteilung:setData(.f.)
::chbFreierText:setData(.f.)
::chbSonstigerAbzug:setData(.f.)
::chbZahlanweisung:setData(.f.)
::chbZahlanweisungAdresseDrucken:setData(.t.)
* und schützen
::chbKopieAkte:disable() *** disabled, KEIN TAB anspringen, kein Klick möglich, Text wird grau
::chbKopieBerechtigter:disable()
::chbAlsAnlageDrucken:disable()
::chbKopieAdressen:disable()
::chbKopieAdressenL261:disable()
::chbRAGMitteilung:disable()
::chbFreierText:disable()
::chbSonstigerAbzug:disable()
else
* und wieder freigeben
::chbKopieAkte:enable()
::chbKopieBerechtigter:enable()
::chbAlsAnlageDrucken:enable()
::chbKopieAdressen:enable()
::chbFreierText:enable()
::chbSonstigerAbzug:enable()
endif
if ::SetParent():SetParent():tpSuchen:Bearbeitungsgrund() = "AAE" // nur hier gibt es RAG Mitteilungen
if ::chbRAGMitteilung:isEnabled() // ist schon richtigerweise verfügbar
* einfach nichts machen
else
::chbRAGMitteilung:enable() // freischalten und
::chbRAGMitteilung:setData(.t.) // eingeschalten
endif
else
::chbRAGMitteilung:setData(.f.)
::chbRAGMitteilung:disable()
endif
if ::SetParent():SetParent():tpSuchen:Bearbeitungsgrund() = "WSV" // Dieser Betrag wird nie zur laufenden Rente
::chbZahlanweisung:setData(.f.) // Rente laut Schreiben von Herrn Lietz
::chbZahlanweisung:disable()
else
if ::chbZahlanweisung:isEnabled() // ist schon richtigerweise verfgbar
* einfach nichts machen
else
::chbZahlanweisung:enable() // freischalten und
::chbZahlanweisung:setData(.f.) // eingeschalten
endif
endif
*------------------ vor den Aktionen, damit diese den Rest erledigen -----------------------
::CheckBoxAktionen(::chbRAGMitteilung, ::chbRAGMitteilung:getData())
::CheckBoxAktionen(::chbFreierText, ::chbFreierText:getData())
::CheckBoxAktionen(::chbZahlanweisung, ::chbZahlanweisung:getData())
::CheckBoxAktionen(::chbSonstigerAbzug,::chbSonstigerAbzug:getData())
### hier könnte man je nach Zustand auch mit SetAppFocus() in ein anderes Control wechseln ...
### aber Achtung, das kann zu einer Endlosschleife führen, wenn dort dann auf hier verwiesen wird.
return nil
hier ein anderes Beispiel bei dem durch Anklicken einer Checkbox eine weiteres SLE freigeschaltet wird,
Code: Alles auswählen
::chbIsErzBer := XbpCheckBox():new(::gbStammdaten, , ;
{ nRandLinks,nPosY},;
{190,nSLEHoehe}, ;
{ { XBP_PP_FGCLR, GRA_CLR_BLACK } } )
::chbIsErzBer:caption := "zweite Betreffzeile drucken: "
::chbIsErzBer:autoSize := .F.
::chbIsErzBer:tabStop := .T.
::chbIsErzBer:selected := {|lChecked,uNIL,oXbp| ::Schalten() }
::sleErzBerTxt := XbpSLE():new( ::gbStammdaten, , ;
{ngbStammdaten_Name_PosX+nSLEBreite,nPosY},;
{nSLEBreite*2,nSLEHoehe}, ;
{ { XBP_PP_BGCLR, XBPSYSCLR_ENTRYFIELD } , ;
{ XBP_PP_FGCLR, GRA_CLR_BLACK } } )
::sleErzBerTxt:bufferLength := 40
::sleErzBerTxt:clipParent := .T.
::sleErzBerTxt:clipSiblings := .T.
::sleErzBerTxt:tabStop := .T.
::sleErzBerTxt:setInputFocus := {|u1,u2,oXbp| ::VorgabeLaden(oXbp) }
durch das enablen erhält das neue Feld dann nach dem nächsten TAB den Focus (Reihenfolge stimmt):
Code: Alles auswählen
*--------------------------------------------------------------------------- Schalten ---------
METHOD tpBeaStam:Schalten()
do case // HeiratVor2002 prfen
case ! empty(::sleHeiratVor2002:getData())
::sleHeiratVor2002:enable() // ausgefllt, also freischalten ....
case year(::sleDatumTodesTagVersicherter:getValue()) < 2002
::sleHeiratVor2002:disable() // Heirat wird nicht gebraucht
case ::sleVersGeborenAm:getValue() < ctod("02.01.1962") .or. ;
::sleBerechGeborenAm:getValue() < ctod("02.01.1962")
::sleHeiratVor2002:enable() // in diesem Falle muá es ausgefllt werden.
// auáer bei Waisen, aber das wissen wir jetzt noch nicht !
otherwise
::sleHeiratVor2002:disable() // kein Einschaltgrund gefunden, also ausschalten.
endcase
if ::setParent():setParent():tpSuchen:Bearbeitungsgrund() = "MJW" // 1.70
* das alter darf hier nicht abgefragt werden, da dies eine Endlosschleife erzeugen wrde
::chbIsErzBer:setData(.t.)
::chbIsErzBer:disable()
else
::chbIsErzBer:enable() // nie ausschalten !
endif
if ::chbIsErzBer:getdata()
::sleErzBerTxt:enable()
else
::sleErzBerTxt:disable()
endif
return nil
Bei Eingaben in relevanten Feldern muss natürlich :Schalten() wieder aufgerufen werden
Code: Alles auswählen
*--------------------------------------------------------------------------- BerechneAlterVersicherter ---------
METHOD tpBeaStam:BerechneAlterVersicherter()
local dVersFall, dVersicherterGebohrenAm, nAlterVersicherter := 0
dVersFall := ::sleDatumVersFall:GetValue()
dVersicherterGebohrenAm := ::sleVersGeborenAm:GetValue()
do case
case empty(dVersFall) .or. empty(dVersicherterGebohrenAm)
* Unplausibel, noch nicht rechnen.
otherwise
nAlterVersicherter := year(dVersFall) - year(dVersicherterGebohrenAm)
if dVersFall < ctod(left(dtoc(dVersicherterGebohrenAm),6)+ntrim(year(dVersFall)))
nAlterVersicherter--
endif
endcase
::schalten()
Return nAlterVersicherter
*--------------------------------------------------------------------------- BerechneAlterBerechtigter ---------
METHOD tpBeaStam:BerechneAlterBerechtigter(dDatum)
local dBerechtigterGebohrenAm, nAlterBerechtigter := 0
* DEFAULT dDatum to date() // Das Datum der Verarbeitung ist hier sicher nicht richtig.
DEFAULT dDatum to ::SetParent():SetParent():tpSuchen:sleZeitraumVon:getValue() // seit 1.70
if dDatum < ctod("01.01.2002") // nur zur Sicherheit
dDatum := date()
endif
dBerechtigterGebohrenAm := ::sleBerechGeborenAm:GetValue()
do case
case empty(dBerechtigterGebohrenAm)
* Unplausibel, noch nicht rechnen.
otherwise
nAlterBerechtigter := year(dDatum) - year(dBerechtigterGebohrenAm)
if dDatum < ctod(left(dtoc(dBerechtigterGebohrenAm),6)+ntrim(year(dDatum)))
nAlterBerechtigter--
endif
endcase
::schalten()
Return nAlterBerechtigter
das nur als Anregung.