Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Cross-Platform-Entwicklung (https://www.delphipraxis.net/91-cross-platform-entwicklung/)
-   -   aktuellen Focus eines TEdit verlieren (Android / iOS) (https://www.delphipraxis.net/215410-aktuellen-focus-eines-tedit-verlieren-android-ios.html)

Stewag 27. Jun 2024 08:46

aktuellen Focus eines TEdit verlieren (Android / iOS)
 
Moin, der letzte Beitrag zu diesem Thema war aus 2018:
https://www.delphipraxis.net/197935-...-loeschen.html

Seit 10.x scheint sich am Verhalten unter Android wieder etwas verändert zu haben.
Habe verschiedene Möglichkeiten ausprobiert, u.a. diesen Code:

Code:
procedure TfMain.TabControl1Gesture(Sender: TObject;
  const EventInfo: TGestureEventInfo; var Handled: Boolean);
begin
 if Assigned(Focused) then
  begin
    if Focused.GetObject is TEdit then
      Handled:=true;

    if Handled then
      SetFocused(nil);
  end;
end;
... klappt aber nicht.

Hat jemand eine Idee?

Delphianer111 27. Jun 2024 10:29

AW: aktuellen Focus eines TEdit verlieren (Android / iOS)
 
Hallo,

vielleicht hilft dir diese Funktion weiter

TControl.ResetFocus

Stewag 27. Jun 2024 11:07

AW: aktuellen Focus eines TEdit verlieren (Android / iOS)
 
... leider nein, hatte ich auch schon probiert.

Code:
 ActiveControl.ResetFocus;

Rollo62 27. Jun 2024 11:53

AW: aktuellen Focus eines TEdit verlieren (Android / iOS)
 
Also ich nutze Gestures immer nur mit den entsprechenden Begin/End Flags, TInteractiveGestureFlag.gfBegin in EventInfo.Flags, um irgendwelche wilden Events zu vermeiden.
https://stackoverflow.com/questions/...an-or-igirotat
http://steema.com/wp/narcis/category/android/

Redeemer 28. Jun 2024 09:31

AW: aktuellen Focus eines TEdit verlieren (Android / iOS)
 
Oder das hier?
Delphi-Quellcode:
Control.Enabled := False;
Control.Enabled := True;

himitsu 28. Jun 2024 09:47

AW: aktuellen Focus eines TEdit verlieren (Android / iOS)
 
In der VCL kann man auch einfach
Delphi-Quellcode:
{Self.}SetFocus;
machen,
also die Form fokussieren, womit der Fokus vom Edit weg geht. (k.A. ob es auch im FMX so geht)

Würde man dort den Fokus auf 0/nil setzen, dann würde die ganze Anwendung den Fokus verlieren und sie verschwindet im Hintergrund (nächste Anwendung bekommt den Fokus und kommt hoch)
Delphi-Quellcode:
Winapi.Windows.SetFocus(0);

Stewag 28. Jun 2024 17:57

AW: aktuellen Focus eines TEdit verlieren (Android / iOS)
 
Code:
Delphi-Quellcode:
Control.Enabled := False;
Control.Enabled := True;
geht leider auch nicht, führt zu einer Zugriffsverletzung.

Stewag 28. Jun 2024 17:58

AW: aktuellen Focus eines TEdit verlieren (Android / iOS)
 
Zitat:

In der VCL kann man auch einfach {Self.}SetFocus; machen,
also die Form fokussieren, womit der Fokus vom Edit weg geht. (k.A. ob es auch im FMX so geht)
geht nicht in FMX

ZYLAGON 28. Jun 2024 20:24

AW: aktuellen Focus eines TEdit verlieren (Android / iOS)
 
Ich würde einfach den Fokus auf ein anderes Element setzen.
Dann ist es vom Edit weg.

VG ZYL

Stewag 1. Jul 2024 14:33

AW: aktuellen Focus eines TEdit verlieren (Android / iOS)
 
Zitat:

Ich würde einfach den Fokus auf ein anderes Element setzen.
Dann ist es vom Edit weg.
Nicht einmal das habe ich unter Android mit Edit1.SetFocus oder ActiveControl:= Edit1 hinbekommen:?

Stewag 3. Jul 2024 14:57

AW: aktuellen Focus eines TEdit verlieren (Android / iOS)
 
... hiermit hat es dann endlich geklappt: https://stackoverflow.com/questions/...cursor-appears
Code:
begin
    TThread.CreateAnonymousThread(
      procedure
      begin
        TThread.Synchronize( nil,
          procedure
          begin
            Edit1.SetFocus;
          end
        );
      end
    ).Start;
  end;
:-D

himitsu 3. Jul 2024 15:35

AW: aktuellen Focus eines TEdit verlieren (Android / iOS)
 
:?:
Code:
begin
    TThread.ForceQueue(nil,
      procedure
      begin
        Edit1.SetFocus;
      end);
  end;

Stewag 4. Jul 2024 09:14

AW: aktuellen Focus eines TEdit verlieren (Android / iOS)
 
Code:
begin
    TThread.ForceQueue(nil,
      procedure
      begin
        Edit1.SetFocus;
      end);
  end;
worin liegt der Vorteil?

himitsu 4. Jul 2024 09:49

AW: aktuellen Focus eines TEdit verlieren (Android / iOS)
 
* es ist kürzer
* es ist übersichtlicher
* es geht direkt "verzögert" ins Synchronize, ohne erst einen Thread zu erstellen
* ...

ForceQueue ist der Bugfix für Queue, was aber im Hauptthread aufgerufen nicht in die Queue schiebt, sondern direkt ausführt, auch wenn es (nicht) so heißt.

Stewag 4. Jul 2024 19:46

AW: aktuellen Focus eines TEdit verlieren (Android / iOS)
 
Code:
begin
    TThread.ForceQueue(nil,
      procedure
      begin
        Edit1.SetFocus;
      end);
  end;
... geht!

Danke Himitsu! :-D

Es geht sogar ResetFocus:
Code:
begin
    TThread.ForceQueue(nil,
      procedure
      begin
         ActiveControl.ResetFocus;
      end);
  end;

Redeemer 5. Jul 2024 09:15

AW: aktuellen Focus eines TEdit verlieren (Android / iOS)
 
Zitat:

Zitat von himitsu (Beitrag 1538589)
ForceQueue ist der Bugfix für Queue, was aber im Hauptthread aufgerufen nicht in die Queue schiebt, sondern direkt ausführt, auch wenn es (nicht) so heißt.

ForceQueue queuet also nur manchmal. Ergibt Sinn.

himitsu 5. Jul 2024 09:31

AW: aktuellen Focus eines TEdit verlieren (Android / iOS)
 
Ja Neee, nicht ganz.
Das ist IMHO ein "Bug" beim Delphi-Referenz durchsuchenTThread.Queue.

Da steht im Code sowas wie
Delphi-Quellcode:
IF istMainThread THEN machJetzt else machSpäter;
,
aber anstatt diesen Schwachsinn zu entfernen und den Fehler ordentlich zu beheben, wurde eine neue Funktion Delphi-Referenz durchsuchenTThread.ForceQueue dafür erfunden.

Also prinzipiell genauso ein Scheißdreck, wie das .DisposeOf, als Bugfix, weil .Free in den mobilen Platformen "garnichts" macht.

Redeemer 5. Jul 2024 10:10

AW: aktuellen Focus eines TEdit verlieren (Android / iOS)
 
Ach dann hab ich dich missverstanden. Dann ergibt der Name ja doch Sinn.

Du bezogst dich mit "ForceQueue ist der Bugfix für Queue, was aber im Hauptthread aufgerufen nicht in die Queue schiebt, sondern direkt ausführt, auch wenn es (nicht) so heißt."
auf Queue und nicht auf ForceQueue.


Alle Zeitangaben in WEZ +1. Es ist jetzt 09: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