Tab-Reihenfolge [ERLEDIGT]
Moderator: Moderatoren
Tab-Reihenfolge [ERLEDIGT]
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
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
Zuletzt geändert von Siggy am Do, 28. Jul 2016 15:54, insgesamt 1-mal geändert.
- Rolf Ramacher
- Der Entwickler von "Deep Thought"
- Beiträge: 1930
- Registriert: Do, 09. Nov 2006 10:33
- Wohnort: Bergheim
- Danksagung erhalten: 3 Mal
- Kontaktdaten:
Re: Tab-Reihenfolge
Hi Siggy
ich kenn das nur so das die Reihenfolge festegelegt im quellcode, wie du die objekte definierst.
ich kenn das nur so das die Reihenfolge festegelegt im quellcode, wie du die objekte definierst.
-
- Der Entwickler von "Deep Thought"
- Beiträge: 2825
- Registriert: Fr, 08. Feb 2008 21:29
- Hat sich bedankt: 96 Mal
- Danksagung erhalten: 13 Mal
Re: Tab-Reihenfolge
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!
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!
Liebe Grüsse aus der Eifel,
Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
- brandelh
- Foren-Moderator
- Beiträge: 15696
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 66 Mal
- Danksagung erhalten: 33 Mal
- Kontaktdaten:
Re: Tab-Reihenfolge
Die Reihenfolge in CREATE() mit Tabstop := .t. ist es genau, was nach einem configure passiert hab ich noch nicht ausprobiert.
Gruß
Hubert
Hubert
Re: Tab-Reihenfolge
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!
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!
- brandelh
- Foren-Moderator
- Beiträge: 15696
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 66 Mal
- Danksagung erhalten: 33 Mal
- Kontaktdaten:
Re: Tab-Reihenfolge
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.
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.
Gruß
Hubert
Hubert
Re: Tab-Reihenfolge
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.
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.
- brandelh
- Foren-Moderator
- Beiträge: 15696
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 66 Mal
- Danksagung erhalten: 33 Mal
- Kontaktdaten:
Re: Tab-Reihenfolge
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.
hier ein anderes Beispiel bei dem durch Anklicken einer Checkbox eine weiteres SLE freigeschaltet wird,
durch das enablen erhält das neue Feld dann nach dem nächsten TAB den Focus (Reihenfolge stimmt):
Bei Eingaben in relevanten Feldern muss natürlich :Schalten() wieder aufgerufen werden
das nur als Anregung.
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
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) }
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
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
Gruß
Hubert
Hubert
-
- Rekursionen-Architekt
- Beiträge: 205
- Registriert: Mo, 07. Aug 2006 10:18
- Wohnort: Leipzig
- Danksagung erhalten: 11 Mal
Re: Tab-Reihenfolge
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:
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.
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
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.
Beste Grüße,
Sören
Sören
- AUGE_OHR
- Marvin
- Beiträge: 12906
- Registriert: Do, 16. Mär 2006 7:55
- Wohnort: Hamburg
- Hat sich bedankt: 19 Mal
- Danksagung erhalten: 45 Mal
Re: Tab-Reihenfolge
ich verstehe immer noch nicht warum du ein configure() machen möchtest und was der Zusammenhang der Radiobutton und der Static bedeuten soll.Siggy hat geschrieben:Dann werde ich mal weiter probieren und es vielleicht mit configure() hinbekommen oder einfahc die Objekte neu erzeugen.
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
gruss by OHR
Jimmy
Jimmy
- brandelh
- Foren-Moderator
- Beiträge: 15696
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 66 Mal
- Danksagung erhalten: 33 Mal
- Kontaktdaten:
Re: Tab-Reihenfolge
Jimmy hat mich auf eine Idee gebracht.
Du schreibst, dass du wegen :TabStop ein configure machst, das ist nicht nötig !
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()
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) }
Obiges Beispiel läßt das SLE überspringen oder wieder rein gehen, ganz ohne configure()
Gruß
Hubert
Hubert