Tab-Reihenfolge [ERLEDIGT]

Konzeptionelles, Technisches, Termine, Fragen zum Hersteller usw.

Moderator: Moderatoren

Antworten
Siggy
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 20
Registriert: Mo, 18. Jan 2016 14:05

Tab-Reihenfolge [ERLEDIGT]

Beitrag 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
Zuletzt geändert von Siggy am Do, 28. Jul 2016 15:54, insgesamt 1-mal geändert.
Benutzeravatar
Rolf Ramacher
Der Entwickler von "Deep Thought"
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

Beitrag von Rolf Ramacher »

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
georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2823
Registriert: Fr, 08. Feb 2008 21:29
Hat sich bedankt: 95 Mal
Danksagung erhalten: 13 Mal

Re: Tab-Reihenfolge

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

Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Tab-Reihenfolge

Beitrag von brandelh »

Die Reihenfolge in CREATE() mit Tabstop := .t. ist es genau, was nach einem configure passiert hab ich noch nicht ausprobiert.
Gruß
Hubert
Siggy
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 20
Registriert: Mo, 18. Jan 2016 14:05

Re: Tab-Reihenfolge

Beitrag 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
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Tab-Reihenfolge

Beitrag 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.
Gruß
Hubert
Siggy
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 20
Registriert: Mo, 18. Jan 2016 14:05

Re: Tab-Reihenfolge

Beitrag 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
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Tab-Reihenfolge

Beitrag 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.
Gruß
Hubert
Sören
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 205
Registriert: Mo, 07. Aug 2006 10:18
Wohnort: Leipzig
Danksagung erhalten: 11 Mal

Re: Tab-Reihenfolge

Beitrag 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.
Beste Grüße,
Sören
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: Tab-Reihenfolge

Beitrag 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
gruss by OHR
Jimmy
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Tab-Reihenfolge

Beitrag 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()
Gruß
Hubert
Siggy
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 20
Registriert: Mo, 18. Jan 2016 14:05

Re: Tab-Reihenfolge

Beitrag von Siggy »

Vielen Dank!

So funktioniert es ganz ohne das configure().
Antworten