*gähn* ... ähhhh, Moin Moin. (als ich anfing mit schreiben, war's noch 4 Uhr-irgendwas)
Gegeben ist 'ne FireMokey-TForm (geräteübergreifend HD) unter Windows und egal wo man hin Tabt (Buttons, Edits usw.) oder in welchem Edit der Fokus liegt, da es angeklickt wurde
Form.ActiveControl
ist immer nil.
Screen.ActiveControl
gibt es nicht. (nur
Screen.ActiveForm
)
Wie bekommt man nun raus was aktiv ist?
Über langes suchen, bin ich dann durch
MeinEdit.SetFocus
bei
MeinEdit.Root.Focused
gelandet. (in MeinEdit gibt es auch kein, HasFocus, {Is}Focused, {Is}Active oder Dergleichen gibt es scheinbar nicht)
MeinEdit.Root.Focused
ist natürlich kein Boolean, sondern ein Interface, also um zu prüfen, ob es fokusiert ist, wäre es somit
if MeinEdit.Root.Focused.GetObject = MeinEdit then
Gut, durch probieren scheint alles auf der selben Form das scheinbar selbe Root zu haben (hoff' ich mal),
welches es auch in der Form gibt, also dann halt if Root.Focused.GetObject = MeinEdit then
. Es funktioniert, aber wirklich Schön ist was Anderes.
[edit] Form.Root ist auch nil, aber
EinFrame.MeinEdit.Root.Focused.GetObject.Name
gibt mir zumindestens die Namen der anderen Controls mit aus, egal wo sie liegen.
Aber warum funktioniert Form.ActiveControl
denn nun nicht, wo es das doch angeblich doch etwas tun soll?
FMX.Forms.TForm.ActiveControl (OK, daß die OH wirklich korrekten oder überhaupt einen Inhalt hat, ist eh oft genung nicht der Fall)
Der Grund dafür ist, daß scheinbar TSwitch nicht per Tastatur/Tabulator oder durch anklicken fokusiert werden konnte und ich das prüfen wollte, ob das Ding wirklich nicht fokusiert ist, oder es einfach nur keinen FocusEffekt gibt.
Eigentlich wollte ich in Switch.OnClick auf Switch.IsChecked prüfen, aber das hat zu dem Zeitpunkt noch den alten Wert.
Und Switch.OnSwitch wird auch bei programmseitigen Änderungen ausgelöst und ich dürfte dann ein doppeltes Auslösen der Aktion verhindern (DatenKomponente sollte per Button aktiviert werden und wenn die Komponente vom Programm aktiviert wird, wird über ihr OnActivate-Event der Button auf Aktiv umgeschaltet, welcher dann aber wieder die Komponente anspricht und einen Refresh der Oberläche auslöst)
Leider war manchmal der Fokus für 'ne Weile weg, bzw. man sah nicht wo er liegt.
Fazit:
- TButton und TSwitch reagieren doch auf TabStop
- aber TSwitch hat keinen Fokuseffekt und man erkennt nichts
- und irgendwie kann man den TSwitch auch nicht per Tastatur bedienen (Leertaste, Enter, Links, Rechts, außer man macht es mal wieder selber)
- ein gestyleter TButton hat auch keinen Fokuseffekt mehr (z.B. StyleLookup = 'arrowrighttoolbuttonbordered')
- Komponenten außerhalb des Sichtbarkeitbereichts einer TScrollBox werden beim Fokusieren per Tab nicht in den sichtbaren Bereich gescrollt
Beim geliebten iOS und Android mit Touch fast egal, aber FMX und Windows (bestimmt auch
OS X) ist irgendwie grausam.