Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Android MessageDlg (https://www.delphipraxis.net/188277-android-messagedlg.html)

greenmile 16. Feb 2016 11:02

Android MessageDlg
 
Hallo,

ich habe gerade mit erschrecken festgestellt, dass unter XE8=>Firemonkey=>Android die MessageDlg nicht Always-On-Top ist. Ich kann also auf meinem Handy in den Hintergrund klicken und die Messagebox ist weg. Ich weiß, ich sollte keine Messageboxen verwenden. Aber gibt es einen Workaround? Ich kenne ja das Handle von dem Messagebox-Fenster nicht, um es immer wieder in den Vordergrund zu holen.

Sir Rufo 16. Feb 2016 11:12

AW: Android MessageDlg
 
Zeig doch mal den Code wie du den
Delphi-Quellcode:
MessageDlg
aufrufst.

greenmile 16. Feb 2016 12:31

AW: Android MessageDlg
 
Code:
  MsgDlgResult := -1;
  FMX.Dialogs.MessageDlg(Msg, DlgType, Buttons, HelpCtx,
            procedure(const AResult: TModalResult)
            begin
              MsgDlgResult:= AResult;
            end
          );
  while MsgDlgResult<0 do Delay(10);
  Result := MsgDlgResult;
Wobei es egal ist, ob ich eine "echte" Callback Prozedur verwende oder diese gefakte.

himitsu 16. Feb 2016 13:17

AW: Android MessageDlg
 
Wenn Dialoge nicht mehr modal sind, warum sollten andere Formen dann auch gesperrt werden?

greenmile 16. Feb 2016 13:23

AW: Android MessageDlg
 
Zitat:

Zitat von himitsu (Beitrag 1330502)
Wenn Dialoge nicht mehr modal sind, warum sollten andere Formen dann auch gesperrt werden?

Sie müssen ja nicht gesperrt sein. Eine Messagebox muss aber Always-On-Top sein. Kann man verstehen, muss man aber nicht. Always-On-Top <> Modal.

himitsu 16. Feb 2016 13:27

AW: Android MessageDlg
 
Ach stimmt ja.

Sicher daß der Dialog im Hintergrund verschwindet und nicht geschlossen wird, wenn man daneben klickt?

greenmile 16. Feb 2016 13:39

AW: Android MessageDlg
 
Ne die ist im Hintergrund. Durch die Funktion oben wird ja gewartet, bis der User OK, Abbrechen oder sonstwas klickt. Klickt er nun daneben, dann wartet das Programm weiter, nur dass der User nichts mehr klicken kann, er sieht die Box ja nicht mehr. Damit lässt sich das wunderbar nachvollziehen.

PS: Es ist erschreckend, wie schnell Google's Indexdienst arbeitet. Habe eben nochmal gegoogelt und diesen Beitrag gefunden :)

Sir Rufo 16. Feb 2016 14:03

AW: Android MessageDlg
 
Und
Delphi-Quellcode:
Delay
ruft bestimmt auch noch
Delphi-Quellcode:
Application.ProcessMessages
auf?

Es gibt einen Grund, warum es die klassischen modalen Fenster unter Android nicht gibt:

:arrow:
Delphi-Quellcode:
Application.ProcessMessages
findet Android total doof!

Du bringst das aber durch die Hintertür wieder hinein und wunderst dich, warum es nicht funktioniert. :stupid:

greenmile 16. Feb 2016 14:13

AW: Android MessageDlg
 
Das Problem hat ja nichts mit Delay zu tun. Das Fenster ist irgendwie nicht Always-On-Top.

himitsu 16. Feb 2016 14:21

AW: Android MessageDlg
 
Android ist mehr Eventgesteuert, also "führe xyz aus, wenn abc".
Aber auch im normalen Delphi Windows muß man mit Warteschleifen etwas aufpassen.


[OT] Es gibt Addons/Systeme um die Serverlast zu minimieren.
Anstatt Google ständig alle Seiten runterläd und parst, sagt man dem wenn es was Neues gibt und wo sich das befindet.

greenmile 16. Feb 2016 14:27

AW: Android MessageDlg
 
Ja das ist mir klar. Aber selbst auf "anderem" weg ist die Messagebox nicht On-Top.

Mavarik 16. Feb 2016 14:48

AW: Android MessageDlg
 
Nimm dir eine schwarze Grafik

Opacity := 0.6 | align content | Hittest := true

Darauf den Dialog...

Fertig...

Sir Rufo 16. Feb 2016 14:49

AW: Android MessageDlg
 
Zitat:

Zitat von greenmile (Beitrag 1330526)
Ja das ist mir klar. Aber selbst auf "anderem" weg ist die Messagebox nicht On-Top.

Natürlich ist die On-Top ... du musst allerdings auch die Besonderheiten von Android berücksichtigen.

Kleines Übungsblatt dazu:
  • Was passiert, wenn man auf die Back-Taste drückt?
  • Was passiert, wenn man neben den Message-Dialog klickt?
  • Wird in den oben genannten Fällen die
    Delphi-Quellcode:
    DialogResultProc
    aufgerufen?
  • Wenn ja, was für ein Wert hat dann
    Delphi-Quellcode:
    AResult
    ?
Wenn du das durch hast, dann kannst du dir auch die Frage beantworten, wie du das Fenster wieder in den Vordergrund bekommst. :stupid:

Mavarik 16. Feb 2016 14:53

AW: Android MessageDlg
 
Liste der Anhänge anzeigen (Anzahl: 1)
Beispiel!

greenmile 16. Feb 2016 14:55

AW: Android MessageDlg
 
Vielleicht solltest Du mal meine Texte lesen bevor Du bissig antwortest. Da steht alles mehrfach drin.

Zitat:

Zitat von Sir Rufo (Beitrag 1330533)
Natürlich ist die On-Top ... du musst allerdings auch die Besonderheiten von Android berücksichtigen.

Sie ist On-Top, ja. Aber nicht Always-On-Top. Wenn das nicht geht ... OK. Ich denke aber eher, es ist ein Bug. So einen hatte ich in XE3 oder XE4 auch schonmal.

Zitat:

Zitat von Sir Rufo (Beitrag 1330533)
[*]Was passiert, wenn man neben den Message-Dialog klickt?

Sie verschwindet in den Hintergrund und bleibt weiterhin am Leben.
Zitat:

Zitat von Sir Rufo (Beitrag 1330533)
[*]Wird in den oben genannten Fällen die
Delphi-Quellcode:
DialogResultProc
aufgerufen?

Nein sie lebt ja im Hintergrund weiter.

Zitat:

Zitat von Sir Rufo (Beitrag 1330533)
[*]Wenn ja, was für ein Wert hat dann
Delphi-Quellcode:
AResult
?

Siehe Antwort davor.

Zitat:

Zitat von Sir Rufo (Beitrag 1330533)
Wenn du das durch hast, dann kannst du dir auch die Frage beantworten, wie du das Fenster wieder in den Vordergrund bekommst. :stupid:

Super Antwort, echt. Gibt es hier einen Kopfschüttel-Smilie? Meinst Du nicht auch, ich habe schon so einiges versucht? Wenn Du nicht antworten kannst oder willst, dann lass es doch bitte einfach. So langsam erinnert mich das an Zeiten mit Linux: Man traut sich kaum eine Frage in eine Newsgroup zu stellen, weil man sonst Gefahr läuft, als Idiot dargestellt zu werden.

Sir Rufo 16. Feb 2016 15:06

AW: Android MessageDlg
 
Probierst du bitte einmal folgendes aus?
Delphi-Quellcode:
procedure TForm1.Button1Click( Sender: TObject );
begin
  MessageDlg( 
    'Augen öffnen?',
    TMsgDlgType.mtConfirmation,
    [ TMsgDlgBtn.mbYes, TMsgDlgBtn.mbNo ],
    0,
    TMsgDlgBtn.mbNo,
    procedure ( const AResult: TModalResult )
    begin
      Button1.Text := IntToStr( AResult );
    end );
end;
  • Was passiert, wenn du neben den Dialog klickst?
  • Was passiert, wenn du die Back-Taste drückst?
  • Glaubst du immer noch, dass der Dialog weiterlebt?
Bei mir bekomme ich in beiden Fällen im Button ein -1 angezeigt. :roll:

PS
Dieses Verhalten ist so nur bei Android zu finden! Weil dieses Verhalten auf der Plattform normal ist. Bei allen anderen Plattformen (OSX, iOS, Windows) muss man auf irgendeinen Button des Dialogs drücken, damit dieser verschwindet und dadurch ist
Delphi-Quellcode:
AResult
immer >= 0 ... nur bei Android ist der Wert >= -1.

greenmile 16. Feb 2016 15:12

AW: Android MessageDlg
 
Danke für die Antwort und die Eklärung (geht doch :-D). Ich teste das gleich mal.

Sir Rufo 16. Feb 2016 15:32

AW: Android MessageDlg
 
Zitat:

Zitat von greenmile (Beitrag 1330546)
Danke für die Antwort und die Eklärung (geht doch :-D). Ich teste das gleich mal.

Ich hoffe ja mal, du verstehst jetzt das Übungsblatt.

Ersetze Annahmen durch Gewissheit (Debugger, einfache Ausgabe der Werte) :stupid:

greenmile 16. Feb 2016 15:37

AW: Android MessageDlg
 
Installiere eben noch das Update 1, das fehlte doch.

greenmile 17. Feb 2016 09:00

AW: Android MessageDlg
 
Kurzes Update: Delphi 10 und schon klappt alles. Danke.


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