AGB  ·  Datenschutz  ·  Impressum  







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

Focus-Problem bei Firemonkey

Ein Thema von eddie11 · begonnen am 14. Aug 2012 · letzter Beitrag vom 20. Aug 2012
Antwort Antwort
eddie11

Registriert seit: 8. Nov 2005
Ort: Zossen bei Berlin
236 Beiträge
 
Delphi XE8 Professional
 
#1

AW: Focus-Problem bei Firemonkey

  Alt 14. Aug 2012, 13:03
Zitat:
Weil
-die Methode dann auch für andere Edits funktioniert
-auch nach Ändern der Bezeichnung des Edits funktioniert
-auch für andere Komponenten nutzbar ist
...
ok, das ist klar, mach ich auch üblicherweise so
ist ja nur ein Beispiel...
Edgar Leifeld
Liebe Grüße aus Zossen bei Berlin

Die Kontramedüse ist verdrupelt!!!
  Mit Zitat antworten Zitat
Insider2004
(Gast)

n/a Beiträge
 
#2

AW: Focus-Problem bei Firemonkey

  Alt 14. Aug 2012, 15:21
VCL <> FMX (leider). Schreibe eine Fehlermeldung in QC.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Focus-Problem bei Firemonkey

  Alt 14. Aug 2012, 15:39
Und so?
Delphi-Quellcode:
procedure TForm1.Edit1Exit(Sender: TObject);
begin
  if Edit1.Text<>'xxthen begin
    ShowMessage('Error: <>xx');
    Edit1.SetFocus();
    Abort;
  end;
end;
Eventuell wird ja erst verlassen (inkl. OnExit) und dann betreten, womit dann im FMX das Setzen des Fokus nach deinem Zurücksetzen passieren würde.

Abort hilft aber nur, wenn kein Try-Finally drumrum ist, wo erst im Finally-Block der Fokus gesetzt wird, bzw. wenn in einem drumrumliegenden Try-Except nicht die stille Abort-Exception beachtet wird (welches gerne vergessen wird, womit dann der Abbruchvorgang vorzeitig abbricht).
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
eddie11

Registriert seit: 8. Nov 2005
Ort: Zossen bei Berlin
236 Beiträge
 
Delphi XE8 Professional
 
#4

AW: Focus-Problem bei Firemonkey

  Alt 15. Aug 2012, 06:08
ja geil, das hat es gebracht. Nach dem ABORT wird keine weitere Aktion (Focus setzen) mehr ausgeführt. Das funktioniert also in meinem Sinne. Nur der Cursor ist dann weg aber den krieg ich schon irgendwie wieder.

Danke vielmals
Edgar Leifeld
Liebe Grüße aus Zossen bei Berlin

Die Kontramedüse ist verdrupelt!!!
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.948 Beiträge
 
Delphi 12 Athens
 
#5

AW: Focus-Problem bei Firemonkey

  Alt 15. Aug 2012, 07:50
Das funktioniert, weil der Fokus tatsächlich erst nach dem Event gesetzt wird, ebenso wie die UI-Effekte usw.
Eine schöne Lösung ist das aber wohl nicht, denn wie die Folgefehler mit dem fehlenden Cursor zeigt ist das so nicht gedacht gewesen.

Leider kommt man da aber auch kaum heran. Die Prozedur SetFocusControl des Formulars (habs grad nicht mehr so genau im Kopf) ist z.B. natürlich wieder nicht virtuell. (Sonst wäre es ja zu einfach da etwas zu ändern... ) Diese Designprobleme ziehen sich leider auch durch Firemonkey durch (das Problem gibt es ja in der VCL genauso). Immer nur das ist virtuell was gerade jemand an anderer Stelle gebraucht hat. An die Programmierer, die später damit arbeiten, wird offenbar weniger gedacht.

Eine Lösung:
SetFocusControl asynchron nach dem Ende der Prozedur aufrufen um den Fokus zurückzusetzen. In der VCL hätte ich mir dazu selbst eine Windows Message geschickt. In Firemonkey fällt mir gerade keine schöne Lösung dafür ein.
Sebastian Jänicke
AppCentral

Geändert von jaenicke (15. Aug 2012 um 09:48 Uhr) Grund: SetFocus zu SetFocusControl korrigiert
  Mit Zitat antworten Zitat
Benutzerbild von RWarnecke
RWarnecke

Registriert seit: 31. Dez 2004
Ort: Stuttgart
4.408 Beiträge
 
Delphi XE8 Enterprise
 
#6

AW: Focus-Problem bei Firemonkey

  Alt 15. Aug 2012, 07:57
Ich habe es jetzt nicht ausprobiert, aber was ist, wenn der Wert von Edit 1 erst im OnEnter von Edit 2 überprüft wird.
Rolf Warnecke
App4Mission
  Mit Zitat antworten Zitat
eddie11

Registriert seit: 8. Nov 2005
Ort: Zossen bei Berlin
236 Beiträge
 
Delphi XE8 Professional
 
#7

AW: Focus-Problem bei Firemonkey

  Alt 15. Aug 2012, 09:13
Zitat:
Die Prozedur SetFocus oder so des Formulars (habs grad nicht mehr so genau im Kopf) ist z.B. natürlich wieder nicht virtuell.
Das war auch mein Ansatz aber wie gesagt, SetFocusControl (so heißt die Prozedur) ist leider nicht virtuell.

Zitat:
Ich habe es jetzt nicht ausprobiert, aber was ist, wenn der Wert von Edit 1 erst im OnEnter von Edit 2 überprüft wird.
Das wird der Weg sein, den ich gehen werde.
Da ich alle Forms von einer eigenen BasisForm erben lasse, kann ich ein eigenes Property "FocusedControl" einbauen. Dieses Property wird dann beim OnEnter eines Controls gesetzt. Im Setter der Property (in der Form) wird dann die EingabePrüfung für das zuvor aktiv gewesene Control durchgeführt.
Edgar Leifeld
Liebe Grüße aus Zossen bei Berlin

Die Kontramedüse ist verdrupelt!!!
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Focus-Problem bei Firemonkey

  Alt 17. Aug 2012, 22:11
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:
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;
Aber um nochmal auf das angesprochene "OnBeforeExit" zu kommen.....
Delphi-Quellcode:
procedure TForm10.Edit1Exit(Sender: TObject);
begin
  if Edit1.Text = 'then
    Abort;
end;
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.

Aber man kann dem Edit schnell wieder ordentlich Bescheid geben.
Delphi-Quellcode:
procedure TForm10.Edit1Exit(Sender: TObject);
begin
  if Edit1.Text = 'then begin
    (Edit1 as IControl).DoEnter;
    Abort;
  end;
end;
[add]
Letzteres hab ich dort http://www.delphipraxis.net/169747-b...ml#post1178667 mit integriert, inklusive einer Fehlermeldung. (siehe unten links in der Demo)
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (18. Aug 2012 um 00:11 Uhr)
  Mit Zitat antworten Zitat
eddie11

Registriert seit: 8. Nov 2005
Ort: Zossen bei Berlin
236 Beiträge
 
Delphi XE8 Professional
 
#9

AW: Focus-Problem bei Firemonkey

  Alt 20. Aug 2012, 06:27
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.
Edgar Leifeld
Liebe Grüße aus Zossen bei Berlin

Die Kontramedüse ist verdrupelt!!!

Geändert von eddie11 (20. Aug 2012 um 07:02 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 18:52 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