![]() |
AW: Focus-Problem bei Firemonkey
Timer, TThread.Queue oder eine Message sollte doch eigentlich klappen, da das so ist, als würde der Benutzer es (etwas später) selber machen :gruebel:
(Timer = überdimensionierte Message) Wenn da intern nicht ebenfalls was zeitverzögert ausgelöst wird, dann könnte es schon passieren, daß dieses nach unserem Timer/Querue/Message erst zuschlägt. |
AW: Focus-Problem bei Firemonkey
Intern wird das einfach direkt zugewiesen, da passiert nichts hinterher. (Von den Animationen vielleicht mal abgesehen, keine Ahnung, aber die entscheidende Zuweisung ist da schon durch.)
|
AW: Focus-Problem bei Firemonkey
So, mal genauer nachgesehn.
OnExit müßte eigentlich OnBeforeExit heißen, denn u diesem Zeitpunkt liegt der Eingabefokus immernoch beim Control. Control.SetFocus prüft, ob es nicht schon den Focus besitzt und macht dann nichts, womit im OnExit das SetFocus nie etwas macht, wenn man dieses auf das Control vom OnExit bezieht.
Delphi-Quellcode:
Aber um nochmal auf das angesprochene "OnBeforeExit" zu kommen.....
procedure TForm10.Edit1Exit(Sender: TObject);
begin if Edit1.Text = '' then begin Edit1.OnExit := nil; // Focused würde sonst eine Endlosschleife erstellen, da es wiederum OnExit aufruft Focused := nil; Edit1.OnExit := Edit1Exit; Edit1.SetFocus; // der Focus ist nun wo anders (nirgends, bzw. bei der Form selber), also funktioniert es nun Abort; // restliche FMX-Codes, zum Verlassen des Controls, abbrechen end; end;
Delphi-Quellcode:
So geht es auch, allerdings mit einem kleinen Fehler, denn laut FMX ist der Focus beim Control und auch bei eingabe eines Textes liegt der Fokus wirklich noch dort, aber Edit1.IsFocused sagt False, da es kurz vorm OnExit auf False gesetzt wurde, womit das Edit selber was anderes über sich denkt. :angle2:
procedure TForm10.Edit1Exit(Sender: TObject);
begin if Edit1.Text = '' then Abort; end; Aber man kann dem Edit schnell wieder ordentlich Bescheid geben.
Delphi-Quellcode:
[add]
procedure TForm10.Edit1Exit(Sender: TObject);
begin if Edit1.Text = '' then begin (Edit1 as IControl).DoEnter; Abort; end; end; Letzteres hab ich dort ![]() |
AW: Focus-Problem bei Firemonkey
wow, das gefällt mir gut!
ich werde sehen, wie ich das in mein Projekt einbauen kann. @himitsu: vielen Dank alledings wird auch hier ein Memoryleak erzeugt. Darüber hinaus habe ich natürlich ein weiteres Problem: ein Abbruch-Button. Ich muss die Überprüfung abschalten können, damit der benutzer das Formular verlassen kann, ohne irgendeine Eingab zu machen. Ich glaube es wird wirklich das beste sein, die Validierung der Eingabe nicht im OnExit des Controls zu machen, sondern tatsächlich im OnEnter des nächsten Controls. Da ich grundsätzlich eigene Komponenten benutze (i.d.R. von der Originalcomponente abgeleitet) habe ich damit kein Problem. Beim OnEnter in ein Control merke ich mir das Control, beim OnEnter in das nächste Control führe ich die Validierung des ersten Controls aus. Wenn Ok, dann wenn weiter, wenn nicht, dann Focus setzen. Mal sehen wie weit ich damit komme. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:09 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