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

EDI Delphi Discussion :

[FMX] Template pour écrire des MessageDialogs


Sujet :

EDI Delphi

  1. #1
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 052
    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 052
    Points : 40 988
    Points
    40 988
    Billets dans le blog
    62
    Par défaut [FMX] Template pour écrire des MessageDialogs
    Bonjour,

    Las de me battre avec le compilateur qui me dit "Use FMX.DialogService methods" et donc MessageDialogSync ou MessageDialogAsync, j'ai décidé de pondre un petit template qui va écrire le plus gros à ma place

    Code XML : 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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    <?xml version="1.0" encoding="utf-8" ?>
    <codetemplate	xmlns="http://schemas.borland.com/Delphi/2005/codetemplates"
    				version="1.0.0">
    	<template name="msgdual" invoke="manual">
    		<description>
    		 MessageDialog
    		</description>
    		<author>
    		  Serge Girard
    		</author>
           <point name="MsgServiceASync">
                <text>
                    Service
                </text>
                <hint>
                    Service Dialogue ASynchrone (Android)
                </hint>
            </point>
           <point name="MsgServiceSync">
                <text>
                    Service
                </text>
                <hint>
                    Service Dialogue Synchrone (non Android)
                </hint>
            </point>
           <point name="MsgText">
                <text>
                    Text
                </text>
                <hint>
                    Texte du message
                </hint>
            </point>
            <point name="Msgtype">
                <text>
                   type
                </text>
                <hint>
                    Type de message mtWarning, mtInfo, mtError
                </hint>
            </point>
    		<code language="Delphi" delimiter="|"><![CDATA[{$IFDEF ANDROID}
    |MsgServiceASync|.MessageDialogAsync('|MsgText|',
                            TMsgDlgType.|MsgType|,
                            [TMsgDlgBtn.mbOk],
                            TMsgDlgBtn.mbOk,
                            0);
    {$ELSE}
    |MsgServiceSync|.MessageDialogSync('|MsgText|',
                            TMsgDlgType.|MsgType|,
                            [TMsgDlgBtn.mbOk],
                            TMsgDlgBtn.mbOk,
                            0);
    {$ENDIF}]]>
    		</code>
    	</template>
    </codetemplate>
    Qu'en pensez-vous ? Y aurait-il des améliorations à y faire ?
    Bien sûr j'ai également écrit deux templates plus succincts pour n'avoir que les messages asynchrones ou synchrones en réduisant ce même XML en fonction.

    Questions subsidiaires, plus "langage" :
    - A votre avis quel est le mieux obtenir une variable pointant sur le service dans un DataModule ou dans une forme toujours utilisée (forme principale)?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    use ..., FMX.PlatForm;
    public 
      MessageService : IFMXDialogServiceSync;
    ...
    TPlatformServices.Current.SupportsPlatformService(IFMXDialogServiceSync,MessageService);
    - Y aurait-il un moyen de n'avoir qu'une seule variable de type IFMXDialogService qui ferait office aussi bien pour le synchrone que pour l'asynchrone ?
    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

  2. #2
    Membre expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 346
    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 346
    Points : 3 124
    Points
    3 124
    Par défaut
    Merci Serge, je suis peu familiarisé avec les templates maison, mais cela semble pratique.

    Dans ton template, il ne manque pas les arguments "procédures" des fonctions MessageDialogAsync et MessageDialogSync ?

    A+
    Charly

  3. #3
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 052
    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 052
    Points : 40 988
    Points
    40 988
    Billets dans le blog
    62
    Par défaut
    Si, mais cette procedure anonyme n'est pas forcément nécessaire. Je voulais quelque chose qui soit presque aussi simple que le showmessage "obsolète".

    je suis peu familiarisé avec les templates maison
    c'est presque mon premier du genre, en tout cas ça l'est pour du code, je ne l'avais fait jusqu'à présent que pour des commentaires de documentation
    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

  4. #4
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 052
    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 052
    Points : 40 988
    Points
    40 988
    Billets dans le blog
    62
    Par défaut
    En réfléchissant à ta demande il me semble que j'écrirai un second script, un peu comme nous pouvons avoir les if, ifb, ife ....

    en pj le résultat de mes cogitations matinales. Je rappelle qu'il faut les mettre dans le répertoire code_templates (.../Embarcadero/Studio/code_templates) ... étant l'emplacement documents utilisateur à moins que vous ne préféreriez les documents public (jamais essayé cette option )

    Citation Envoyé par sergiomaster
    - Y aurait-il un moyen de n'avoir qu'une seule variable de type IFMXDialogService qui ferait office aussi bien pour le synchrone que pour l'asynchrone ?
    P.S. cette question reste, ce serait tellement plus simple
    Fichiers attachés Fichiers attachés
    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

  5. #5
    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
    Ouch, un peu complexe pour un premier template de code, mais bien.

    Par contre ShowMessage fonctionne bien sur toutes les plateformes, c'est MessageDlg() qui ne passe pas sur plateformes mobiles.

    Un truc qui vous a peut-être échappé : pas besoin de prendre les versions "sync" ou "async" des méthodes : TDialogService.MessageDialog() s'adapte tout seul à la plateforme et se code de la même façon, même si c'est long à écrire.

    De plus il y a un moyen de forcer le fonctionnement synchrone/asynchrone si on veut avoir un fonctionnement identique partout avec TDialogService.PreferredMode qui permet de forcer le fonctionnement avec TDialogService.TPreferredMode.Sync (sauf Android) ou TDialogService.TPreferredMode.Async (partout).

    Pour les projets qui partagent du code entre plateformes desktop et mobiles je recommande vivement de penser asynchrone (et donc de forcer ce mode sur les fenêtres) afin de ne pas se mélanger les pinceaux.

    MessageDlg en tant que fonction était pratique pour la VCL, ce mode de fonctionnement est révolu. Evitez de bidouiller pour le retrouver à tout prix.

  6. #6
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 052
    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 052
    Points : 40 988
    Points
    40 988
    Billets dans le blog
    62
    Par défaut
    Bonjour
    Citation Envoyé par pprem Voir le message
    Ouch, un peu complexe pour un premier template de code.
    pas tant que ça quand on prend le coup de main
    D'autre part il s'agit du cas où je voulais essayer une "génération" avec {$IFDEF ANDROID}, tu remarqueras qu'il y a un template "plus simple" dans les fichiers proposés : msgsync, c'est surtout ce dernier que j'ai utilisé en écrivant l'appli
    je n'ai pas fait le async pour cause de non besoin mais il est aussi facile à faire (peu de modifications à apporter, un changement de nom, une modifcation de nom de méthode).

    AMHA on oublie trop que l'on peut faire nos propres templates, pour preuve appli bouclée je l'avais oublié Aloïs quand tu nous tient !

    Par contre ShowMessage fonctionne bien sur toutes les plateformes, c'est MessageDlg() qui ne passe pas sur plateformes mobiles.
    oui mais showmessage ne propose pas un choix de bouton

    Un truc qui vous a peut-être échappé : pas besoin de prendre les versions "sync" ou "async" des méthodes : TDialogService.MessageDialog() s'adapte tout seul à la plateforme et se code de la même façon, même si c'est long à écrire.
    c'est certainement ça qui m'échappe

    De plus il y a un moyen de forcer le fonctionnement synchrone/asynchrone si on veut avoir un fonctionnement identique partout avec TDialogService.PreferredMode qui permet de forcer le fonctionnement avec TDialogService.TPreferredMode.Sync (sauf Android) ou TDialogService.TPreferredMode.Async (partout).
    Pour les projets qui partagent du code entre plateformes desktop et mobiles je recommande vivement de penser asynchrone (et donc de forcer ce mode sur les fenêtres) afin de ne pas se mélanger les pinceaux.
    Comme je l'ai indiqué j'ai mis ma déclaration de service dans mon datamodule m'évitant ainsi de le déclarer chaque fois que besoin (sinon le template eut été plus complexe )

    Maintenant, mode ronchon oblige, un bémol, le style ne s'applique pas sur la fenêtre message à moins que cela ait changé avec 10.4, alors que le style s'applique sur un InputQuery par exemple
    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 346
    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 346
    Points : 3 124
    Points
    3 124
    Par défaut
    Bonjour pprm,

    Ok, MessageDlg s'adapte mais sous Android, ce code ne va pas fonctionner ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    procedure TForm1.Button3Click(Sender: TObject);
    Var
      Reply : Integer ;
    begin
      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 Label1.Text := 'No' Else Label1.Text := 'Yes' ;
    end;
    On est obligé de mettre tout le traitement dans la procédure ?

    A+
    Charly

  8. #8
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 052
    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 052
    Points : 40 988
    Points
    40 988
    Billets dans le blog
    62
    Par défaut
    Mais pourquoi tu veux absolument mettre la procédure anonyme ?
    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
    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
    Citation Envoyé par SergioMaster Voir le message
    Mais pourquoi tu veux absolument mettre la procédure anonyme ?
    parce que c'est le seul moyen de fonctionner en asynchrone

  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
    Citation Envoyé par Charly910 Voir le message
    Bonjour pprm,

    Ok, MessageDlg s'adapte mais sous Android, ce code ne va pas fonctionner ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    procedure TForm1.Button3Click(Sender: TObject);
    Var
      Reply : Integer ;
    begin
      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 Label1.Text := 'No' Else Label1.Text := 'Yes' ;
    end;
    On est obligé de mettre tout le traitement dans la procédure ?

    A+
    Charly
    Affirmatif : le mode asynchrone fait que les fenêtres s'affichent mais le code appelant continue sans bloquer.

    Tel quel ce que tu as écrit ne fonctionnera qu'en mode synchrone (donc synchrone forcé partout (sauf Android) ou sous Windows).

    J'en ai parlé sur la session 23 de ma formation "coronapocalypse" en avril. Jetez un coup d'oeil aux rediffusion et éventuellement aux sources sur GitHub.

  11. #11
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 052
    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 052
    Points : 40 988
    Points
    40 988
    Billets dans le blog
    62
    Par défaut
    Citation Envoyé par pprem Voir le message
    parce que c'est le seul moyen de fonctionner en asynchrone
    Donc le template présenté au début est faux
    et devrait se présenter ainsi

    Code XML : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    {$IFDEF ANDROID}
    |MsgServiceASync|.MessageDialogAsync('|MsgText|',
                            TMsgDlgType.|MsgType|,
                            [TMsgDlgBtn.mbOk],
                            TMsgDlgBtn.mbOk,
                            procedure (AResult : TModalResult)
                            begin
                             /* traitement
                            end);
    {$ELSE}

    J'en ai parlé sur la session 23 de ma formation "coronapocalypse" en avril.
    corana pas regardé, ça sentait trop la pomme P.S Houlà tu prends des risques ou alors cela s'arrange
    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

  12. #12
    Membre expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 346
    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 346
    Points : 3 124
    Points
    3 124
    Par défaut
    Ok merci

Discussions similaires

  1. logiciel pour écrire des articles avec du code
    Par Kapha dans le forum Autres Logiciels
    Réponses: 2
    Dernier message: 29/10/2008, 15h36
  2. Besoin d'aide pour écrire des prédicats
    Par anthony7788 dans le forum Prolog
    Réponses: 1
    Dernier message: 07/01/2008, 17h45
  3. Quelle commande utiliser pour écrire des vecteurs en colonne ?
    Par minimel dans le forum Mathématiques - Sciences
    Réponses: 2
    Dernier message: 18/05/2007, 18h24
  4. Problème pour écrire des requetes mysql complexes
    Par truemistress dans le forum Requêtes
    Réponses: 8
    Dernier message: 08/02/2007, 18h29

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