AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

FMX und ActiveControl/Focus

Ein Thema von himitsu · begonnen am 30. Mai 2015 · letzter Beitrag vom 30. Mai 2015
Antwort Antwort
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.137 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
Benutzerbild von Harry Stahl
Harry Stahl

Registriert seit: 2. Apr 2004
Ort: Bonn
2.479 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: FMX und ActiveControl/Focus

  Alt 30. Mai 2015, 17:48
Ich mache es mir gerade mal einfach und kopiere aus meinem XE7-FMX-Buch das Rezept 14:

"R14 ... ActiveControl verwenden

Wenn Sie in einer Form verschiedene Controls platziert haben und eine Abfrage auf die
Variable "ActiveControl" machen, ist diese - anders als unter der VCL - immer NIL. Ob das
gewollt oder ein Bug ist, ist mir nicht klar. Jedenfalls macht es im Programmablauf an
vielen Stellen Sinn, das gerade aktive Control (also das, welches den Focus hat)
abzufragen.

Sie können hier direkt die allgemeine Eigenschaft des Formulars "Focused" verwenden.
Dies gibt nämlich das Steuererlement an, welches den Fokus hat.

Wollen Sie also die Variable ActiveControl belegen, können Sie im Ereignis
"OnFocusChanged" des Formulars so machen:

Delphi-Quellcode:
procedure TForm9.FormFocusChanged(Sender: TObject);
begin
ActiveControl := TControl (Focused .GetObject);
//if ActiveControl <> NIL then begin
// Label1.Text := 'Aktives Control: ' + ActiveControl.ClassName + ' (' +
ActiveControl.Name + ')';
//end;
end;
Sie können ja mal die deaktivierten Source-Zeilen aktiv schalten und sehen, was
angezeigt wird, wenn Sie den Fokus für einzelne Controls ändern (und z.B. in einem Grid
mit F2 in den Edit-Modus schalten)."
Miniaturansicht angehängter Grafiken
activecontrol-demo.jpg  
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

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

AW: FMX und ActiveControl/Focus

  Alt 30. Mai 2015, 20:49
Ich vermute inzwischen, daß ActiveControl oder besser gesagt ActiveHDControl aus dem selben Grund nicht geht, weshalb auch Form.Root nil ist.
Immer wieder toll, die vielen Bugs, aber da fragt man sich, ob Andere nicht auch mal 'nen ActiveControl wissen wöllten. (außer deinem Buch)

Focused sieht schonmal gut aus und ganz in der Nähe ist auch Hovered und Captured zu finden. Nun darf man nur noch überlegen, ob man nicht eigentlich Captured wissen will.


[edit]
Hab jetzt rausbekommen, daß ActiveControl wohl beim Erstellen der Form ausgewertet wird.
Man kann ActiveControl im Formdesigner setzen und so das Startcontrol festlegen und danach ist dieses Property dann vollkommen nutzlos.
https://quality.embarcadero.com/browse/RSP-10496
Aber die OH/Dokwiki sagt natürlich was ganz Anderes, halt so, wie es früher (VCL) mal war.
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 23:54 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:44 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz