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? :shock:

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! :D

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.:D

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 verfgbar
         * 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 prfen
        case ! empty(::sleHeiratVor2002:getData())
             ::sleHeiratVor2002:enable()   // ausgefllt, 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 ausgefllt 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 wrde
        ::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().