Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 Delphi Discussion :

[D10.3 CE] [FMX] MessageDlg


Sujet :

Delphi

  1. #1
    Membre émérite
    [D10.3 CE] [FMX] MessageDlg
    Bonjour,

    je cherche à afficher un message modal sous FMX (Windows et Android). Est ce qu'un pro du FMX pourrait me traduire ceci de la façon la plus simple possible (issu de l'aide VCL de D7) :

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      if MessageDlg('Bienvenue dans mon application Delphi.  Quitter?',
        mtConfirmation, [mbYes, mbNo], 0) = mrYes then
      begin
        MessageDlg('Fin de l''application Delphi.', mtInformation, [mbOk], 0);
        Close;
      end;
    end;


    j'ai essayé ceci :

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    MessageDlg('Do you want to press yes or no?', System.UITypes.TMsgDlgType.mtInformation,
                  [System.UITypes.TMsgDlgBtn.mbYes, System.UITypes.TMsgDlgBtn.mbNo], 0,
                  procedure(const AResult: TModalResult)
                    begin
                      case AResult of
                        { Detect which button was pushed and show a different message }
                        mrYes:
                        begin
                        // pressed yes
                        end;
                        mrNo:
                        begin
                        // pressed no
                        end;
                      end;
                    end
                  );


    mais d'une part cela m'a l'air compliqué d'imbriquer les MessagesDlg et d'autre part MessageDlg est Deprecated en D10 FMX !

    Merci

    A+
    Charly

  2. #2
    Rédacteur/Modérateur

    Bonjour,

    messagedialog est à remplacer par http://docwiki.embarcadero.com/Libra...ageDialogAsync.

    c'est un peu compliqué, surtout les premières fois
    demain je retrouverai le code hadoc, j'ai pas ces sources sous la main

    Ou alors, tu changes ton fusil d'épaule, et utilises un tab qui occulte en partie la forme en cours, cette technique est documentée je ne sais plus où sur le web (idem il faut que je cherche dans mes raccourcis sur un autre poste )
    La seule chose absolue dans un monde comme le nôtre, c'est l'humour. » Albert Einstein

    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Tokyo, Rio, Sidney) et peut être quelques autres
    SGBD : Firebird 2.5, 3, SQLite
    générateurs Etats : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Ubuntu, Androïd

  3. #3
    Membre émérite
    Merci Serge,

    j'ai trouvé ceci :

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    procedure TForm1.Button1Click(Sender: TObject);
    var
      ASyncService : IFMXDialogServiceASync;
    begin
      if TPlatformServices.Current.SupportsPlatformService (IFMXDialogServiceAsync, IInterface(ASyncService)) then
      begin
        ASyncService.MessageDialogAsync('Bienvenue dans mon application Delphi.  Quitter?', TMsgDlgType.mtConfirmation,
                                                       [TMsgDlgBtn.mbYes, TMsgDlgBtn.mbNo], TMsgDlgBtn.mbNo, 0,
              Procedure(const AResult: TModalResult)
               begin
                 case AResult of
                   mrYES :
                     Begin
                        ASyncService.MessageDialogAsync('Fin de l''application Delphi.', TMsgDlgType.mtInformation,
                                                                       [TMsgDlgBtn.mbOk], TMsgDlgBtn.mbNo, 0,
                         procedure(const AResult: TModalResult)
                           begin
                             case AResult of
                               mrOk :  Close ;
                              end;
                           end);
                     End;
                 end;
               end);
      end;
    end;


    Cela fonctionne, mais me parait inutilement compliqué ? N'y a t il pas plus simple pour afficher des boites de dialogue ?

    et pourquoi les procédures en argument n'ont pas de nom ?

    A+
    Charly

  4. #4
    Membre émérite
    Pour me simplifier la vie, j'ai tenté de faire une fonction similaire à celle de la VCL :

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    { ======================================================================== }
    function TForm1.MessageDlgFMX(const Msg: string; DlgType: TMsgDlgType; Buttons: TMsgDlgButtons; HelpCtx: Longint): Integer;
    var
      ASyncService : IFMXDialogServiceASync;
      Resu         : Integer ;
    begin
      Result := -1 ;
      if TPlatformServices.Current.SupportsPlatformService (IFMXDialogServiceAsync, IInterface(ASyncService)) then
      begin
        ASyncService.MessageDialogAsync(Msg, DlgType, Buttons, TMsgDlgBtn.mbNo, 0,
         procedure(const AResult: TModalResult)
           begin
             Resu := AResult ;   // Bidouillage !
           end);
        Result := Resu ;
      end;
      End;
    { ======================================================================== }
    procedure TForm1.Button2Click(Sender: TObject);
    Var
      Res : Integer ;
    begin
      Res := MessageDlgFMX('Bienvenue dans mon application Delphi.  Quitter?',
        TMsgDlgType.mtConfirmation, [TMsgDlgBtn.mbYes, TMsgDlgBtn.mbNo], 0) ;  // Renvoie systématiquement 0
      If Res = mrYes then
      begin
        MessageDlgFMX('Fin de l''application Delphi.', TMsgDlgType.mtInformation, [TMsgDlgBtn.mbOk], 0);
        Close;
      end;


    Mais cela ne fonctionne pas, car la procédure incluse dans MessageDialogAsync s’exécute après la fin de la fonction MessageDlgFMX qui renvoie donc toujours 0 !

    Je ne voie pas comment faire ?

    A+
    Charly

  5. #5
    Expert éminent sénior
    tu as déjà une fonction type VCL dans FMX.Dialogs...elle est simplement dépréciée.

    si tu utilises FMX sous Windows tu peux faire ce genre de chose

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
        Reply := 0;
        TDialogService.MessageDialog('Voulez-vous ? ', TMsgDlgType.mtConfirmation, [TMsgDlgBtn.mbYes, TMsgDlgBtn.mbNo], TMsgDlgBtn.mbYes, 0,
          procedure(const AResult: TModalResult)
          begin
            Reply := AResult;
          end
        );
        if Reply <> mrYes then


    car sous Windows, l'appel est synchrone
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  6. #6
    Rédacteur/Modérateur

    Bonjour,

    Pour Windows
    rapidement, après plongée en apnée dans mes applications

    Pour Windows, utilisation(s)
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
     
         Datas.MessageService.MessageDialogSync('Pas de gabarit défini',
            TMsgDlgType.mtError, [TMsgDlgBtn.mbOk], TMsgDlgBtn.mbOk, 0);

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    if Datas.MessageService.MessageDialogSync('Confirmez l''envoi de masse',
                              TMsgDlgType.mtConfirmation,
                              [TMsgDlgBtn.mbOk,TMsgDlgBtn.mbCancel],
                              TMsgDlgBtn.mbCancel,
                              0)=idCancel
      then Exit;

    où MessageServices est une variable publique
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
       MessageService : IFMXDialogServiceSync; {Accès au service des messages}

    initialisée dans le OnCreate du TDataModule

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    procedure TDatas.DataModuleCreate(Sender: TObject);
    ...
    begin
    ...
    TPlatformServices.Current.SupportsPlatformService(IFMXDialogServiceSync,MessageService);
    ...
    end;


    Bien sûr pour Androïd il va falloir jouer sur des {$IFDEF } pour prendre l'asynchrone, mais de mes souvenirs il y a un moyen de déclarer de façon à ce que "Delphi choissise le sien"

    pour les liens http://chapmanworld.com/brutally-rol...nd-using-lamp/, https://chapmanworld.com/2016/08/22/...roll-your-own/ et un autre truc que je ne retrouve pas, je l'ai en tête mais ... je pense que c'était sur le site http://www.fmxuniversity.com/ ou connexes
    La seule chose absolue dans un monde comme le nôtre, c'est l'humour. » Albert Einstein

    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Tokyo, Rio, Sidney) et peut être quelques autres
    SGBD : Firebird 2.5, 3, SQLite
    générateurs Etats : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Ubuntu, Androïd

  7. #7
    Membre émérite
    Merci à vous 2, effectivement TDialogService.MessageDialog fonctionne bien en synchrone sous windows et donc je peux récupérer le résultat.

    Idem pour MessageService.MessageDialogSync qui fonctionne aussi sous Windows.

    Mais sous Android pas moyen de le faire, car le comportement est ASynchrone.


    Je suis donc condamné à utiliser ASyncService.MessageDialogAsync avec une procédure interne si je veux le même code en Windows et Android (sauf à utiliser des {ifDef} )

    FMX c'est toujours aussi peu pratique. J'espère qu'Embarcadero va progresser en rapprochant FMX de VCL.

    A+
    Charly

  8. #8
    Rédacteur/Modérateur

    Tu vas rire ou pas j'ai retrouvé (google premier lien) une discussion initiée par ton serviteur qui n'a suscité aucun commentaire
    Tant que je l'avais oublié celui là !
    La seule chose absolue dans un monde comme le nôtre, c'est l'humour. » Albert Einstein

    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Tokyo, Rio, Sidney) et peut être quelques autres
    SGBD : Firebird 2.5, 3, SQLite
    générateurs Etats : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Ubuntu, Androïd

  9. #9
    Expert éminent sénior
    Citation Envoyé par Charly910 Voir le message

    FMX c'est toujours aussi peu pratique. J'espère qu'Embarcadero va progresser en rapprochant FMX de VCL.
    les premières versions de FMX faisaient la distinction entre FMX Desktop et FMX Mobile...C'était peu pratique, mais de fait ça me parait difficile d'utiliser la même UI sur les deux environnements.
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  10. #10
    Membre expérimenté
    J'ai l'impression que vous voulez vraiment vous compliquer les choses.

  11. #11
    Membre émérite
    Merci à tous, je crois qu'on a fait le tour de la question

    A+
    Charly

###raw>template_hook.ano_emploi###