![]() |
FMX und ActiveControl/Focus
*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
Delphi-Quellcode:
ist immer nil.
Form.ActiveControl
Delphi-Quellcode:
gibt es nicht. (nur
Screen.ActiveControl
Delphi-Quellcode:
)
Screen.ActiveForm
Wie bekommt man nun raus was aktiv ist? Über langes suchen, bin ich dann durch
Delphi-Quellcode:
bei
MeinEdit.SetFocus
Delphi-Quellcode:
gelandet. (in MeinEdit gibt es auch kein, HasFocus, {Is}Focused, {Is}Active oder Dergleichen gibt es scheinbar nicht)
MeinEdit.Root.Focused
Delphi-Quellcode:
ist natürlich kein Boolean, sondern ein Interface, also um zu prüfen, ob es fokusiert ist, wäre es somit
MeinEdit.Root.Focused
Delphi-Quellcode:
:freak:
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
Delphi-Quellcode:
. Es funktioniert, aber wirklich Schön ist was Anderes.
if Root.Focused.GetObject = MeinEdit then
[edit] Form.Root ist auch nil, aber
Delphi-Quellcode:
gibt mir zumindestens die Namen der anderen Controls mit aus, egal wo sie liegen.
EinFrame.MeinEdit.Root.Focused.GetObject.Name
Aber warum funktioniert
Delphi-Quellcode:
denn nun nicht, wo es das doch angeblich doch etwas tun soll?
Form.ActiveControl
![]() 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. :wall: 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:
Beim geliebten iOS und Android mit Touch fast egal, aber FMX und Windows (bestimmt auch OS X) ist irgendwie grausam. |
AW: FMX und ActiveControl/Focus
Liste der Anhänge anzeigen (Anzahl: 1)
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:
Sie können ja mal die deaktivierten Source-Zeilen aktiv schalten und sehen, was
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; angezeigt wird, wenn Sie den Fokus für einzelne Controls ändern (und z.B. in einem Grid mit F2 in den Edit-Modus schalten)." |
AW: FMX und ActiveControl/Focus
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. :stupid: [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. ![]() Aber die OH/Dokwiki sagt natürlich was ganz Anderes, halt so, wie es früher (VCL) mal war. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:21 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz