IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
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 expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 344
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur TP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 344
    Points : 3 122
    Points
    3 122
    Par défaut [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

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 031
    Points : 40 930
    Points
    40 930
    Billets dans le blog
    62
    Par défaut
    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 )
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  3. #3
    Membre expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 344
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur TP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 344
    Points : 3 122
    Points
    3 122
    Par défaut
    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 expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 344
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur TP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 344
    Points : 3 122
    Points
    3 122
    Par défaut
    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
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 430
    Points
    28 430
    Par défaut
    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

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 031
    Points : 40 930
    Points
    40 930
    Billets dans le blog
    62
    Par défaut
    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
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  7. #7
    Membre expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 344
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur TP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 344
    Points : 3 122
    Points
    3 122
    Par défaut
    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

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 031
    Points : 40 930
    Points
    40 930
    Billets dans le blog
    62
    Par défaut
    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à !
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  9. #9
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 430
    Points
    28 430
    Par défaut
    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 expert
    Avatar de pprem
    Homme Profil pro
    MVP Embarcadero - formateur&développeur Delphi, PHP et JS
    Inscrit en
    Juin 2013
    Messages
    1 876
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : MVP Embarcadero - formateur&développeur Delphi, PHP et JS
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 876
    Points : 3 611
    Points
    3 611
    Par défaut
    J'ai l'impression que vous voulez vraiment vous compliquer les choses.

  11. #11
    Membre expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 344
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur TP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 344
    Points : 3 122
    Points
    3 122
    Par défaut
    Merci à tous, je crois qu'on a fait le tour de la question

    A+
    Charly

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [D10.3] [FMX] Bouton en couleur
    Par Charly910 dans le forum Débuter
    Réponses: 16
    Dernier message: 21/07/2020, 13h35
  2. Réponses: 2
    Dernier message: 21/07/2020, 08h45
  3. Réponses: 4
    Dernier message: 29/04/2020, 12h00
  4. [D10.3] Conversion VCL vers FMX
    Par Charly910 dans le forum Débuter
    Réponses: 17
    Dernier message: 21/03/2019, 12h04
  5. [Windows] [D10] Comment faire du drag-drop en FMX ?
    Par Lung dans le forum Composants FMX
    Réponses: 8
    Dernier message: 20/10/2016, 14h26

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo