Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Cross-Platform-Entwicklung (https://www.delphipraxis.net/91-cross-platform-entwicklung/)
-   -   Delphi Rio MessageDialogSync (https://www.delphipraxis.net/206623-delphi-rio-messagedialogsync.html)

greenmile 13. Jan 2021 13:59

Delphi Rio MessageDialogSync
 
Hallo (nochmal),

ich benötige die InputQuerySync, MessageDialogSync, ShowMessageSync unter 10.3.3 Unter XE8 ließ sich das mit einer While Schleife nachbilden, das geht aber unter XE 10.3.3 nicht mehr (hängt sich auf). Ziel ist es, einen MessageDlg anzuzeigen bei der so lange gewartet wird, bis der User bestätigt oder was eingibt.

Es gibt zwar TDialogService.PreferredMode, dort wird bei Android jedoch immer Async genommen.

Rollo62 13. Jan 2021 14:05

AW: Delphi Rio MessageDialogSync
 
Warum nicht mit anonymer Methode, verstehe ich nicht ?
Mach ich mittlerweile nur noch so.

Wenn Du unbedingt blockieren willst, dann vielleicht mit TEvent, der dann in der anonymen Methode ein Signal gibt.
http://docwiki.embarcadero.com/Libra...Object.WaitFor

Das geht ja auch ohne Threads.

greenmile 13. Jan 2021 14:11

AW: Delphi Rio MessageDialogSync
 
Hört sich komisch an, aber ist mir zu kompliziert, ich möchte nicht für jede mögliche Antwort bzw jeden möglichen Button eine eigene Procedure schreiben, nur um 'Bist du sicher?' abzufragen.

Rollo62 13. Jan 2021 15:50

AW: Delphi Rio MessageDialogSync
 
Das einmal in eine Klasse/Funktion zuverpacken würde reichen,
so machen es die _Sync Methoden auch.

Mal so hingekritzelt als Funktion ...
So müsste das eigentlich funktionieren (Tippfehler ausgenommen).
Delphi-Quellcode:

procedure MyDlg_Message(const AMessage: string;
                        const ADialogType: TMsgDlgType;
                        const AButtons: TMsgDlgButtons;
//                          const AHelpContext: LongInt;
                        const ACloseDialogProc: TInputCloseDialogProc = nil );



procedure MyDlg_Message(const AMessage: string;
                        const ADialogType: TMsgDlgType;
                        const AButtons: TMsgDlgButtons;
//                          const AHelpContext: LongInt;
                        const ACloseDialogProc: TInputCloseDialogProc );
var
    LProcDlg        : TInputCloseDialogProc;
    LCloseDialogProc : TInputCloseDialogProc;
    LEvent          : TEvent;
    LRes            : TWaitResult;
begin
    LCloseDialogProc := ACloseDialogProc;

    if not Assigned( LClodeDialogProc ) then
        LEvent := TEvent.Create(nil, True, False, 'MyEventName')
    else
        LEvent := nil;

    try
        LProcDlg := procedure( const AResult: TModalResult)
                    begin
                        if Assigned( LCloseDialogProc ) then
                        begin
                            LCloseDialogProc( AResult );
                        end
                        else
                        begin // Want a blocking Message
                            if Assigned( LEvent ) then
                            begin
                                LEvent.SetEvent;
                            end;  
                        end;
                    end;

        FMX.DialogService.TDialogService
        {} .MessageDialog( AMessage,
                           ADialogType,
                           AButtons,
                           TMsgDlgBtn.mbCancel,
                           0,
                           LProcDlg ); // ACloseDialogProc);
 
    finally
        if Assigned( LEvent ) then
        begin
            LRes := LEvent.WaitFor( INFINITE ); //<== or better Timeout here
            case LRes of
               wrSignaled : { => Done   };
               wrTimeout  : { => Timeout };
               wrAbandoned : {Terminate};
               wrError    : { Logging };
            end;          

            LEvent.Free;
        end;
    end;

end;

greenmile 13. Jan 2021 15:51

AW: Delphi Rio MessageDialogSync
 
Verstehe ich leider nicht, hast du ein Beispiel?

TurboMagic 15. Jan 2021 22:27

AW: Delphi Rio MessageDialogSync
 
Android will so was nicht synchron, drum musste es Delphi abstellen.
Meiner Meinung nach besser gleich komplett Event orientiert programmieren.


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:53 Uhr.

Powered by vBulletin® Copyright ©2000 - 2021, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf