Seite 1 von 1
Tab-Reihenfolge [ERLEDIGT]
Verfasst: Fr, 22. Jul 2016 11:59
von Siggy
Hallo Leute,
Ich hab ein Problem bei der Festlegung der Tab-Reihenfolge.
Und zwar weise ich einige RadioButtons einem Static zu..
Jedoch wenn ich später manuell die Tab-Reihenfolge mit :configure() festlegen will, dann geht er mit zuerst alles andere durch und zu guter letzt geht der Cursor durch die Parents durch, obwohl diese eigentlich vor den anderen SLE/Buttons,etc. stehen.
Hat das Problem auch schon jemand gehabt und kann mir weiterhelfen?
Danke,
Siggy
Re: Tab-Reihenfolge
Verfasst: Fr, 22. Jul 2016 14:03
von Rolf Ramacher
Hi Siggy
ich kenn das nur so das die Reihenfolge festegelegt im quellcode, wie du die objekte definierst.
Re: Tab-Reihenfolge
Verfasst: Fr, 22. Jul 2016 15:42
von georg
Hallo, Siggy -
grundsätzlich gilt erst einmal die Reihenfolge, wie beim Erstellen der Xbase-Parts tabStop auf .T. gesetzt ist (wie auch Rolf geschrieben hat).
Wenn Du dann im Nachgang mittels configure() bei weiteren XbaseParts den tabStop aktivierst, kann ich mir vorstellen, dass diese Elemente an die vorhandene Kette hinten angehängt werden.
Entscheidend ist da nicht die Reihenfolge auf dem Bildschirm!
Re: Tab-Reihenfolge
Verfasst: Sa, 23. Jul 2016 23:53
von brandelh
Die Reihenfolge in CREATE() mit Tabstop := .t. ist es genau, was nach einem configure passiert hab ich noch nicht ausprobiert.
Re: Tab-Reihenfolge
Verfasst: Mi, 27. Jul 2016 9:33
von Siggy
Danke für die Antworten.
Mit dem Maskencreator Xbase++ FormDesigner werden zwei Datein erstellt eine Untersterich-Datei.prg und eine .prg Datei.
In der _Datei wird die Reihenfolge mit TabStop:= .T. festgelegt.
Jetzt kann man doch aber in der Normalen.prg Datei mit configure() die Reihenfolge ändern, dies habe ich schon oft gemacht.
Jedoch klappt das irgendwie durch die Parentsetzung nicht mehr.
Danke!
Re: Tab-Reihenfolge
Verfasst: Mi, 27. Jul 2016 10:01
von brandelh
nochmal :tabstop .t. / .f. regelt nur ob ein Control per TAB Taste angesprungen wird.
die Reihenfolge der :CREATE() Anweisungen legt die Reihenfolge fest wie die mit :tabstop := .t. gesetzen Controls angesprungen werden.
Ob ein :configure() ein Control in der Reihenfolge ändert weiß ich nicht.
Re: Tab-Reihenfolge
Verfasst: Mi, 27. Jul 2016 14:09
von Siggy
Das mit dem tabStop habe ich verstanden, danke
Dann werde ich mal weiter probieren und es vielleicht mit configure() hinbekommen oder einfahc die Objekte neu erzeugen.
Falls jemand doch noch eine Idee hat, dann wäre ich über jede Idee erfreut.
Re: Tab-Reihenfolge
Verfasst: Mi, 27. Jul 2016 14:31
von brandelh
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.
Re: Tab-Reihenfolge
Verfasst: Mi, 27. Jul 2016 17:39
von Sören
Hallo Siggi,
Du kannst die Z-Order (die Position des Xbase-Parts in der :childList() des Parents)
nach einem :Create() auch ändern, indem Du Folgendes machst:
Code: Alles auswählen
oXbp:setParent( AppDesktop() ) // den Xbp temporär einem neuen Parent zuweisen ...
oXbp:setParent( oStatic ) // ... und wieder auf seinen "alten" Parent zurück versetzen
Damit befindet sich oXbp in der Z-Order von oStatic ganz unten, also an letzter Position.
Für mich stellt sich nur die Frage, warum Du die Controls nicht schon in der Reihenfolge erzeugst, in der Du sie benötigst.
Übrigens habe ich noch nie - wirklich noch nie - bei einem Xbase-Part die Methode :configure() gebraucht.
Re: Tab-Reihenfolge
Verfasst: Mi, 27. Jul 2016 22:01
von AUGE_OHR
Siggy hat geschrieben:Dann werde ich mal weiter probieren und es vielleicht mit configure() hinbekommen oder einfahc die Objekte neu erzeugen.
ich verstehe immer noch nicht warum du ein configure() machen möchtest und was der Zusammenhang der Radiobutton und der Static bedeuten soll.
das du ein Object löschen möchtest um es dann neu zu erstellen ist technisch ok aber nicht sehr elegant.
du könntest das Object per o:hide() "ausblenden" und wenn du es benötigt mit o:show() wieder anzeigen.
ein Object was man nicht "sieht" kann man auch nicht anspringen auch wenn es o:Tabstop := .T. hat
Re: Tab-Reihenfolge
Verfasst: Mi, 27. Jul 2016 23:20
von brandelh
Jimmy hat mich auf eine Idee gebracht.
Du schreibst, dass du wegen :TabStop ein configure machst, das ist nicht nötig !
Code: Alles auswählen
::pbZeigInfo:activate := {|| ::sleTest_2:tabStop := ! ::sleTest_2:tabStop, ZeigInfo("Info von Fenster "+iif(::sleTest_2:tabStop,"ein","aus"),15,self) }
man kann den Wert einfach zur Laufzeit ändern und der Wert in ::sleTest_2:tabStop wird immer neu ausgewertet, wenn der TAB Sprung erfolgt.
Obiges Beispiel läßt das SLE überspringen oder wieder rein gehen, ganz ohne configure()
Re: Tab-Reihenfolge
Verfasst: Do, 28. Jul 2016 15:54
von Siggy
Vielen Dank!
So funktioniert es ganz ohne das configure().