Tab-Reihenfolge [ERLEDIGT]

Konzeptionelles, Technisches, Termine, Fragen zum Hersteller usw.

Moderator: Moderatoren

Tab-Reihenfolge [ERLEDIGT]

Beitragvon Siggy » Fr, 22. Jul 2016 10:59

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
Zuletzt geändert von Siggy am Do, 28. Jul 2016 14:54, insgesamt 1-mal geändert.
Siggy
Rookie
Rookie
 
Beiträge: 16
Registriert: Mo, 18. Jan 2016 14:05

Re: Tab-Reihenfolge

Beitragvon Rolf Ramacher » Fr, 22. Jul 2016 13:03

Hi Siggy

ich kenn das nur so das die Reihenfolge festegelegt im quellcode, wie du die objekte definierst.
Gruß Rolf

Mitglied der Gruppe XUG-Cologne
www.xug-cologne.de
Benutzeravatar
Rolf Ramacher
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
 
Beiträge: 1802
Registriert: Do, 09. Nov 2006 10:33
Wohnort: Bergheim

Re: Tab-Reihenfolge

Beitragvon georg » Fr, 22. Jul 2016 14:42

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!
Liebe Grüsse aus der Eifel,

Georg
georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
 
Beiträge: 1751
Registriert: Fr, 08. Feb 2008 21:29

Re: Tab-Reihenfolge

Beitragvon brandelh » Sa, 23. Jul 2016 22:53

Die Reihenfolge in CREATE() mit Tabstop := .t. ist es genau, was nach einem configure passiert hab ich noch nicht ausprobiert.
Gruß
Hubert
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
 
Beiträge: 13201
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim

Re: Tab-Reihenfolge

Beitragvon Siggy » Mi, 27. Jul 2016 8:33

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
Siggy
Rookie
Rookie
 
Beiträge: 16
Registriert: Mo, 18. Jan 2016 14:05

Re: Tab-Reihenfolge

Beitragvon brandelh » Mi, 27. Jul 2016 9:01

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.
Gruß
Hubert
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
 
Beiträge: 13201
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim

Re: Tab-Reihenfolge

Beitragvon Siggy » Mi, 27. Jul 2016 13:09

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
Siggy
Rookie
Rookie
 
Beiträge: 16
Registriert: Mo, 18. Jan 2016 14:05

Re: Tab-Reihenfolge

Beitragvon brandelh » Mi, 27. Jul 2016 13:31

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.
Gruß
Hubert
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
 
Beiträge: 13201
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim

Re: Tab-Reihenfolge

Beitragvon Sören » Mi, 27. Jul 2016 16:39

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.
Beste Grüße,
Sören
Sören
Rekursionen-Architekt
Rekursionen-Architekt
 
Beiträge: 196
Registriert: Mo, 07. Aug 2006 9:18
Wohnort: Leipzig

Re: Tab-Reihenfolge

Beitragvon AUGE_OHR » Mi, 27. Jul 2016 21:01

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
gruss by OHR
Jimmy
Benutzeravatar
AUGE_OHR
Marvin
Marvin
 
Beiträge: 10071
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg

Re: Tab-Reihenfolge

Beitragvon brandelh » Mi, 27. Jul 2016 22:20

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()
Gruß
Hubert
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
 
Beiträge: 13201
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim

Re: Tab-Reihenfolge

Beitragvon Siggy » Do, 28. Jul 2016 14:54

Vielen Dank!

So funktioniert es ganz ohne das configure().
Siggy
Rookie
Rookie
 
Beiträge: 16
Registriert: Mo, 18. Jan 2016 14:05


Zurück zu Allgemeine Fragen

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast

cron