Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.166 Beiträge
 
Delphi 12 Athens
 
#1

FMX und ActiveControl/Focus

  Alt 30. Mai 2015, 09:23
*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?
Delphi-Referenz durchsuchenFMX.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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (30. Mai 2015 um 09:30 Uhr)
  Mit Zitat antworten Zitat