Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Cross-Platform-Entwicklung (https://www.delphipraxis.net/91-cross-platform-entwicklung/)
-   -   Android procedure auf ShowModal warten (https://www.delphipraxis.net/186031-android-procedure-auf-showmodal-warten.html)

NickD 29. Jul 2015 08:21

Android procedure auf ShowModal warten
 
Hi Leute,
ich habe eine Frage zu ShowModal auf Android. Wie verwende ich es wenn ich auf eine Benutzereingabe warten möchte? Wenn ich ein Dialog in einer Procedure aufrufe, wird nicht darauf gewartet bis das Modale Fenster wieder geschlossen wurde.
Ich habe mal eine Beispiel Procedure geschrieben. In der function GetRot() sollte solange gewartet werden, bis sich das Modale Fenster wieder schließt und einen Rückgabewert hat, da sonst immer ein leerer String übergeben wird.
Wie löst man das am Besten?

Delphi-Quellcode:
procedure TfrmMain.CreateFarbe();
var
  Rot, Gruen, Blau: String;
begin
  // Buttonindex holen
  Index := (Sender as TButton).Tag;

  Rot := '';
  Gruen := '';
  Blau := '';
  l := Length('RGB');


  for i := 1 to l do
  begin
    ch := Copy('RGB', i,i);
   
    if ch = 'R' then
    begin
      Rot := GetRot;
      if Rot = '' then
        Exit;
    end
    else if ch = 'G' then
    begin
      Gruen := GetGruen;
      if Gruen = '' then
        Exit;
    end
    else if ch = 'B' then
    begin
      Blau := GetBlau;
      if Blau = '' then
        Exit;
    end;
  end;
  FarbeZusammenstellen(Rot, Gruen, Blau)   
end;

function TfrmMain.GetRot: String;
var
  dlgRot: TfrmFarbauswahl;
  sRot: String;
begin
  dlgRot := TfrmFarbauswahl.Create(nil);
  dlgRot.ShowModal(
  procedure(ModalResult: TModalResult)
  begin
    if ModalResult = mrOk then
    begin
      sRot := dlgRot.lbRot.Items[dlgRot.lbRot.ItemIndex];
    end;
    if ModalResult = mrCancel then
    begin
      sRot := '';
    end;
    dlgRot.Close;
  end
  );
  Result := sRot;
end;

Mavarik 29. Jul 2015 09:52

AW: Android procedure auf ShowModal warten
 
Unter Android ist ein ShowModal ein "Don't do"...

Mavarik

Sir Rufo 29. Jul 2015 10:04

AW: Android procedure auf ShowModal warten
 
Zitat:

Zitat von Mavarik (Beitrag 1310094)
Unter Android ist ein ShowModal ein "Don't do"...

Mavarik

Du meinst sicher ein blockierendes ShowModal ;)

NickD 29. Jul 2015 10:07

AW: Android procedure auf ShowModal warten
 
Ja das habe ich mir schon gedacht.. Gibt es andere Möglichkeiten in einer procedure auf eine Benutzereingabe aus einem anderen Formular zu warten?

Sir Rufo 29. Jul 2015 10:11

AW: Android procedure auf ShowModal warten
 
Zitat:

Zitat von NickD (Beitrag 1310098)
Ja das habe ich mir schon gedacht.. Gibt es andere Möglichkeiten in einer procedure auf eine Benutzereingabe aus einem anderen Formular zu warten?

Du musst nicht warten, das ist der Trick. Du gibst einen Callback mit, der ausgeführt wird, wenn der Dialog beendet wurde.

Mavarik 29. Jul 2015 11:03

AW: Android procedure auf ShowModal warten
 
Zitat:

Zitat von Sir Rufo (Beitrag 1310097)
Zitat:

Zitat von Mavarik (Beitrag 1310094)
Unter Android ist ein ShowModal ein "Don't do"...

Mavarik

Du meinst sicher ein blockierendes ShowModal ;)

Ja wie der Name schon sagt...

Zitat:

Zitat von EMBT
Use ShowModal to show a form as a modal form. A modal form is one where the application can't continue to run until the form is closed...

:twisted:

greenmile 29. Jul 2015 11:12

AW: Android procedure auf ShowModal warten
 
Ich persönlich halte nichts von den Callbacks nur für Unterformulare oder Messageboxen, ist mir einfach zu aufwendig.
Du kannst eine globale Variable definieren die von der Unterform gefüllt wird. Das Hauptformular muss nun einfach nur solange warten, bis die Variable gefüllt ist. Beispiel:

Code:
var MsgDlgResult: Integer;

 function MessageDlg(const Msg: string; DlgType: TMsgDlgType;
   Buttons: TMsgDlgButtons; HelpCtx: Longint): Integer;
 begin
   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;
 end;

Sir Rufo 29. Jul 2015 11:13

AW: Android procedure auf ShowModal warten
 
Zitat:

Zitat von Mavarik (Beitrag 1310117)
Zitat:

Zitat von EMBT
Use ShowModal to show a form as a modal form. A modal form is one where the application can't continue to run until the form is closed...

:twisted:

Ich behaupte jetzt mal steif und fest, dass diese Aussage total falsch ist. Meine Anwendung lief weiter (diese modale Form gehört ja auch zu meiner Anwendung).

Richtig ist, dass die Methode/Prozedur, die dieses ShowModal aufruft, erst dann weiter läuft, wenn diese modale Form geschlossen wurde. Die Anwendung selber läuft einwandfrei weiter.

@greenmile

Bitte nicht ... es gibt einen guten Grund, warum die modalen Formulare auf den Mobile Devices eben nicht mehr blockierend sind.

Mavarik 29. Jul 2015 11:26

AW: Android procedure auf ShowModal warten
 
Zitat:

Zitat von greenmile (Beitrag 1310119)

Code:
   while MsgDlgResult<0 do Delay(10);

Du hast einen Kommentar vergessen..

Delphi-Quellcode:
   while MsgDlgResult<0 do Delay(10); // Töte den Akku
:stupid:

Spass bei Seite... Bitte nicht.. Es gibt bessere Wege

Das war mal ein Post... Als XE6 raus gekommen ist, oder?
Ich hatte das auch so "abgetippt"

[EDIT] Habs gefunden...
Original Post war:

Delphi-Quellcode:
function MyMessageDlg(const Msg: string; DlgType: TMsgDlgType; Buttons: TMsgDlgButtons; HelpCtx: Longint): Integer;
{$IFDEF ANDROID}
var
  MsgDlgResult : Integer;
{$ENDIF}
begin
  {$IFDEF ANDROID}
  MsgDlgResult := -1;

  FMX.Dialogs.MessageDlg(Msg, DlgType, Buttons, HelpCtx,
    procedure(const AResult: TModalResult)
      begin
        MsgDlgResult:= AResult;
      end);

  while MsgDlgResult<0 do
    begin
      Application.Processmessages; // Makes Android Happy...
      Sleep(10);
    end;

    Result := MsgDlgResult;
  {$ELSE}
  Result := FMX.Dialogs.MessageDlg(Msg, DlgType, Buttons, HelpCtx);
  {$ENDIF}
end;

bra 29. Jul 2015 11:57

AW: Android procedure auf ShowModal warten
 
Application.Processmessages ist eine ganz schlechte Idee unter Android/iOS...


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:13 Uhr.
Seite 1 von 2  1 2      

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