AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Cross-Platform-Entwicklung Android procedure auf ShowModal warten
Thema durchsuchen
Ansicht
Themen-Optionen

Android procedure auf ShowModal warten

Ein Thema von NickD · begonnen am 29. Jul 2015 · letzter Beitrag vom 31. Jul 2015
Antwort Antwort
Seite 2 von 2     12   
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#11

AW: Android procedure auf ShowModal warten

  Alt 29. Jul 2015, 12:17
Application.Processmessages ist eine ganz schlechte Idee unter Android/iOS...
Wieso das denn?

Dieses Application.ProcessMessages beim ShowModal ist extra für die Mobile Plattformen herausgenommen worden. Da hat sich doch bestimmt keiner etwas bei gedacht. Das ist nur um alle zu ärgern.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
NickD

Registriert seit: 10. Okt 2012
Ort: Burgsinn
53 Beiträge
 
Delphi 10.3 Rio
 
#12

AW: Android procedure auf ShowModal warten

  Alt 29. Jul 2015, 15:36
Ich habe gerade das Gefühl in dieser Situation gibt es kein "Richtig", kann das sein?
@SirRufo: Würde mich über ein bisschen Quellcode bezogen auf mein Beispiel freuen, so ganz komme ich mit den Callbacks nicht klar


@Mavarik: Wenn ich es so versuche hängt sich die komplette App auf..

Geändert von NickD (29. Jul 2015 um 16:13 Uhr)
  Mit Zitat antworten Zitat
bra

Registriert seit: 20. Jan 2015
711 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#13

AW: Android procedure auf ShowModal warten

  Alt 31. Jul 2015, 09:02
Application.Processmessages ist eine ganz schlechte Idee unter Android/iOS...
Wieso das denn?

Dieses Application.ProcessMessages beim ShowModal ist extra für die Mobile Plattformen herausgenommen worden. Da hat sich doch bestimmt keiner etwas bei gedacht. Das ist nur um alle zu ärgern.
Keine Ahnung, ob das jetzt ironisch gemeint war oder ich es einfach nicht verstehe...

In unserer App haben die Application.ProcessMessages jedenfalls zu massiven Problemen geführt (besonders im Zusammenhang mit Threads). Inzwischen haben wir alle bis auf eine Stelle eliminieren können und seitdem damit keine Probleme mehr. Ist ja nicht so, dass es sonst nicht schon genug Stolpersteine gäbe ^^
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.346 Beiträge
 
Delphi 11 Alexandria
 
#14

AW: Android procedure auf ShowModal warten

  Alt 31. Jul 2015, 10:52
Um zur Ausgangsfrage zurückzukehren:
Man macht das so, dass man auf die Events des zweiten Formulars reagiert und gar nicht wartet.

Sprich der Ablauf ist so:
  • Zeige zweites Formular an (normales Show)
  • Im zweiten Formular löse ein Event aus, wenn z.B. eine Farbe ausgewählt wurde
  • Im ersten Formular reagiere auf die Änderung der Farbe, z.B. indem etwas neu gezeichnet werden muss
  • Wenn das zweite Formular geschlossen wird, wird wieder das erste Fenster aktiv
Dann muss niemand irgendwo warten.
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
greenmile

Registriert seit: 17. Apr 2003
1.107 Beiträge
 
Delphi 10.3 Rio
 
#15

AW: Android procedure auf ShowModal warten

  Alt 31. Jul 2015, 11:14
Da macht es ja vielleicht Sinn. Aber was ist mit einer Messagebox wie "Möchten Sie beenden"? Extra Callback für jede erdenkliche Messagebox, Inputquery und co ist doch wirklich Overkill, oder?
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.346 Beiträge
 
Delphi 11 Alexandria
 
#16

AW: Android procedure auf ShowModal warten

  Alt 31. Jul 2015, 12:56
Dafür aber sauber...

Und wenn man von Anfang an so denkt, ist das auch überhaupt kein Problem...

Problematisch ist nur die Umstellung von altem Code.
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
bra

Registriert seit: 20. Jan 2015
711 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#17

AW: Android procedure auf ShowModal warten

  Alt 31. Jul 2015, 12:56
Da macht es ja vielleicht Sinn. Aber was ist mit einer Messagebox wie "Möchten Sie beenden"? Extra Callback für jede erdenkliche Messagebox, Inputquery und co ist doch wirklich Overkill, oder?
Für MessageBoxes kann man doch eine anonyme Procedure übergeben, wo man die Ereignisbehandlung macht.
  Mit Zitat antworten Zitat
bra

Registriert seit: 20. Jan 2015
711 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#18

AW: Android procedure auf ShowModal warten

  Alt 31. Jul 2015, 13:01
Wir haben uns eine eigene Unit für Standard-MessageBoxes erstellt, läuft mit Windows, iOS und Android:

Code:
unit uMessageDialogs;

interface

uses
  System.UITypes, System.SysUtils, System.Types, System.Generics.Defaults,
  FMX.Dialogs;

type
  TDialogButtons = (dbOk, dbOkCancel, dbYesNo);

  TMessageDialogs = class
  private
    class procedure PlatformDialog(const AMessage: String; const ADialogType: TMsgDlgType; const ADialogButtons: TDialogButtons; const AProcedure: TInputCloseDialogProc);
  public
    class procedure Info(const AMessage: String);
    class procedure Warn(const AMessage: String);
    class procedure Error(const AMessage: String);
    class procedure ConfirmYesNo(const AMessage: String; const ADialogType: TMsgDlgType; const AProcedureOnYes: TProc; const AProcedureOnNo: TProc = nil);
    class procedure ConfirmOkCancel(const AMessage: String; const ADialogType: TMsgDlgType; const AProcedureOnOk: TProc; const AProcedureOnCancel: TProc = nil);
    class procedure Custom(const AMessage: String; const ADialogType: TMsgDlgType; const ADialogButtons: TDialogButtons; const AProcedure: TInputCloseDialogProc);
  end;

implementation

uses
{$IFDEF MSWINDOWS}
  Windows, FMX.Platform.Win,
{$ENDIF}
  fRISApp, uFormSupport, uSupport, uConsts;

class procedure TMessageDialogs.PlatformDialog(const AMessage: String; const ADialogType: TMsgDlgType; const ADialogButtons: TDialogButtons; const AProcedure: TInputCloseDialogProc);
{$IFDEF MSWINDOWS}
var
  uType: Cardinal;
  caption: String;
  res: Integer;
begin
  // Dialoge werden sonst unter Windows nicht Modal angezeigt, lassen sich also in den Hintergrund legen

  uType := MB_OK;
  case ADialogButtons of
    dbOk:      uType := MB_OK;
    dbOkCancel: uType := MB_OKCANCEL;
    dbYesNo:   uType := MB_YESNO;
  end;
  uType := uType or MB_TASKMODAL;

  case ADialogType of
    TMsgDlgType.mtWarning:
      begin
        caption := 'Warnung';
        uType := uType or MB_ICONWARNING;
      end;
    TMsgDlgType.mtError:
      begin
        caption := 'Fehler';
        uType := uType or MB_ICONERROR;
      end;
    TMsgDlgType.mtInformation:
      begin
        caption := 'Information';
        uType := uType or MB_ICONINFORMATION;
      end;
    TMsgDlgType.mtConfirmation:
      begin
        caption := 'Bestätigung';
        uType := uType or MB_ICONQUESTION;
      end;
    else
      Assert(True);
  end;

  if GetMainForm = nil then
    res := Windows.MessageBox(0, PWideChar(AMessage), PWideChar(caption), uType)
  else
    res := Windows.MessageBox(FMX.Platform.Win.WindowHandleToPlatform(GetMainForm.Handle).Wnd, PWideChar(AMessage), PWideChar(caption), uType);
  if Assigned(AProcedure) then
    AProcedure(res);
end;
{$ELSE}
var
  dlgButtons: TMsgDlgButtons;
begin
  case ADialogButtons of
    dbOk:      dlgButtons := [TMsgDlgBtn.mbOK];
    dbOkCancel: dlgButtons := [TMsgDlgBtn.mbOK, TMsgDlgBtn.mbCancel];
    dbYesNo:   dlgButtons := [TMsgDlgBtn.mbYes, TMsgDlgBtn.mbNo];
  end;
  FMX.Dialogs.MessageDlg(AMessage, ADialogType, dlgButtons, 0, AProcedure);
end;
{$ENDIF}

class procedure TMessageDialogs.Info(const AMessage: String);
begin
  PlatformDialog(AMessage, TMsgDlgType.mtInformation, dbOk, nil);
end;

class procedure TMessageDialogs.Warn(const AMessage: String);
begin
  PlatformDialog(AMessage, TMsgDlgType.mtWarning, dbOk, nil);
end;

class procedure TMessageDialogs.Error(const AMessage: String);
begin
  PlatformDialog(AMessage, TMsgDlgType.mtError, dbOk, nil);
end;

class procedure TMessageDialogs.Custom(const AMessage: String; const ADialogType: TMsgDlgType; const ADialogButtons: TDialogButtons; const AProcedure: TInputCloseDialogProc);
begin
  PlatformDialog(AMessage, ADialogType, ADialogButtons, AProcedure);
end;

class procedure TMessageDialogs.ConfirmOkCancel(const AMessage: String; const ADialogType: TMsgDlgType; const AProcedureOnOk, AProcedureOnCancel: TProc);
begin
  PlatformDialog(AMessage, ADialogType, dbOkCancel,
    procedure(const AResult: TModalResult)
    begin
      if GetMainForm <> nil then
        GetMainForm.Status(Format('Dialog-Result: %d, Dialog: %s', [AResult, AMessage]), TStatusType.stDebug);
      if AResult = mrOK then begin
        if Assigned(AProcedureOnOK) then
          AProcedureOnOK;
      end
      // Alternativ-Prozedur wird immer ausgeführt, wenn vorhanden.
      // Damit wird ein Problem unter Android behoben, wo sich Dialoge durch Klicken außerhalb abbrechen lassen
      else if Assigned(AProcedureOnCancel) then
        AProcedureOnCancel;
    end
  );
end;

class procedure TMessageDialogs.ConfirmYesNo(const AMessage: String; const ADialogType: TMsgDlgType; const AProcedureOnYes: TProc; const AProcedureOnNo: TProc);
begin
  PlatformDialog(AMessage, ADialogType, dbYesNo,
    procedure(const AResult: TModalResult)
    begin
      if GetMainForm <> nil then
        GetMainForm.Status(Format('Dialog-Result: %d, Dialog: %s', [AResult, AMessage]), TStatusType.stDebug);
      if AResult = mrYes then begin
        if Assigned(AProcedureOnYes) then
          AProcedureOnYes;
      end
      // Alternativ-Prozedur wird immer ausgeführt, wenn vorhanden
      // Damit wird ein Problem unter Android behoben, wo sich Dialoge durch Klicken außerhalb abbrechen lassen
      else if Assigned(AProcedureOnNo) then
        AProcedureOnNo;
    end
  );
end;

end.
  Mit Zitat antworten Zitat
NickD

Registriert seit: 10. Okt 2012
Ort: Burgsinn
53 Beiträge
 
Delphi 10.3 Rio
 
#19

AW: Android procedure auf ShowModal warten

  Alt 31. Jul 2015, 23:12
Um zur Ausgangsfrage zurückzukehren:
Man macht das so, dass man auf die Events des zweiten Formulars reagiert und gar nicht wartet.

Sprich der Ablauf ist so:
  • Zeige zweites Formular an (normales Show)
  • Im zweiten Formular löse ein Event aus, wenn z.B. eine Farbe ausgewählt wurde
  • Im ersten Formular reagiere auf die Änderung der Farbe, z.B. indem etwas neu gezeichnet werden muss
  • Wenn das zweite Formular geschlossen wird, wird wieder das erste Fenster aktiv
Dann muss niemand irgendwo warten.
So würde man natürlich vorgehen. Geht man aber mal davon aus, das ein neues Formular in einer Prozedur angezeigt werden muss und nach der Benutzereingabe diese Prozedur fotgesetzt werden muss, gibt es keine Lösung in der mobilen Entwicklung. Habe ich das richtig verstanden?
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.346 Beiträge
 
Delphi 11 Alexandria
 
#20

AW: Android procedure auf ShowModal warten

  Alt 31. Jul 2015, 23:25
Keine gute, weil das unter Android nicht so gemacht werden soll.

Und warum sollte auch eine Prozedur fortgesetzt werden? Du brauchst den Code nach dem Aufruf des Fensters doch nur in das Event zu schreiben, dass das zweite Fenster bestätigt oder abgebrochen wurde.
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   

 

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 00:33 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