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 :

[D7] Différentes variantes de MessageDlg


Sujet :

Delphi

  1. #1
    Membre émérite
    [D7] Différentes variantes de MessageDlg
    Bonjour;

    question bête :
    Message la fonction MessageDlg a plusieurs formes dont celle ci :

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    function MessageDlg(const Caption: WideString; const Msg: WideString; DlgType: TMsgDlgType; Buttons: TMsgDlgButtons; HelpCtx: Longint; DefaultBtn: TMsgDlgBtn = mbNone; Bitmap: TBitmap = nil): Integer; overload;


    Mais je ne parviens pas à l'appeler :

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
      MessageDlg('Titre de la fenêtre', 'Message à afficher', mtError, [mbOk], 0)


    Le compilo me renvoie un message "Types incompatibles TMsgDlgType et String, juste après le deuxième paramètre, ce qui correspondant à la premiere forme de MessageDlg :

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    function MessageDlg(const Msg: string; DlgType: TMsgDlgType; Buttons: TMsgDlgButtons; HelpCtx: Longint): Word;


    Comment appeler MessageDlg avec Overload ?

    Merci

    A+
    Charly

  2. #2
    Modérateur

    Il faut pê passer par des variables de type WideString ou transtyper lors de l'appel, sinon il prend la chaîne constante pour une String ?
    Delphi 5 Pro - Delphi 10.3.2 Rio Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  3. #3
    Membre confirmé
    d'après ce que tu indiques (je n'ai pas fais de test), ton problème vient que tu fais un mélange entre les deux déclarations, dans la seconde tu ne dois pas passer le titre mais débuter directement par le message

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    MessageDlg('Message à afficher', mtError, [mbOk], 0)

  4. #4
    Rédacteur/Modérateur

    Bonjour,

    En fait la fonction MessageDlg a plusieurs formes mais uniquement dans QDialogs et donc s'il s'agit d'une application CLX.
    Ça, ce n'est pas indiqué dans l'aide il faut fouiller dans les sources pour le voir
    Pour avoir quelque chose d'identique (titre et texte "personnalisés", bouton par défaut etc..) en VCL il faudra plutôt utiliser MessageBox
    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) 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

  5. #5
    Membre émérite
    Merci à tous,

    Comme Serge, en cherchant dans Dialogs.pas, j'ai vu que la version avec titre de la boite de dialogue n'existe pas.

    Du coup j'ai trouvé cette fonction qui répond au problème et permet même de changer le libellé des Boutons :

    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
    function TForm2.MessageDialog(Title, Text: string; DlgType: TMsgDlgType;
      Buttons: TMsgDlgButtons; BtnCaptions: array of string): Integer;
      var dlgButton: TButton;
          i, BtnIndex: Integer;
    begin
      with CreateMessageDialog(Text, DlgType, Buttons) do
        begin
          Color := ClBtnFace ;
          BtnIndex := 0;
          Caption := Title;
          for i := 0 to ComponentCount - 1 do
            if (Components[i] is TButton) then
              begin
                dlgButton := TButton(Components[i]);
                if BtnIndex > High(BtnCaptions) then Break;
                dlgButton.Caption := BtnCaptions[BtnIndex];
                Inc(BtnIndex);
              end;
          Result := ShowModal;
        end;
    end;


    A+
    Charly

  6. #6
    Membre éprouvé
    Bonjour à toutes et à tous,

    @ Charly910, j'avais aussi cet exemple qui fonctionne avec
    d6 mais apparemment moins complet, à toutes fins :

    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
     
    function MonMessageDlg(const Msg: string; DlgType: TMsgDlgType;
      Buttons: TMsgDlgButtons): integer;
    begin
      with CreateMessageDialog(Msg, DlgType, Buttons) do
      try
        BorderIcons := BorderIcons - [biSystemMenu];
        Caption:= '****Mon titre****';
        Color := clblue;
        Result := ShowModal;
      finally
        Free;
      end;
    end;
     
    //Utilisation
    procedure TForm1.Button2Click(Sender: TObject);
    begin
     if MonMessageDlg('Hello Voulez vous continuer?', mtConfirmation, [mbYes, mbNo]) = mrYes then
     ShowMessage('Oui')
     
      else begin
     
        ShowMessage('Non');
        close;
    end;
    end;


    Par contre ta fonction comment l'utilises tu ?

    @+,

    cincap

  7. #7
    Membre émérite
    Bonjour Cincap,

    par exemple comme ceci (sans renommage des boutons) :

    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
    Var
      iResult : Integer ;
    Begin
        iResult := MessageDialog('Titre du dialogue', 'Message à afficher', mtInformation,
                       [mbIgnore, mbAbort, mbHelp, mbReTry, mbOk], []);
      Case iResult of
        IDOK       : ShowMessage('Ok') ;
        IDCANCEL   : ShowMessage('Annuler') ;
        IDABORT    : ShowMessage('Abandonner') ;
        IDRETRY    : ShowMessage('Réessayer') ;
        IDIGNORE   : ShowMessage('Ignorer') ;
        IDYES      : ShowMessage('Oui') ;
        IDNO       : ShowMessage('Non') ;
        IDHELP     : ShowMessage('Aide') ;         //  ne ferme pas le dialogue
        MB_TIMEDOUT: ShowMessage('Temps écoulé');
      end;


    A+
    Charly

  8. #8
    Membre éprouvé
    @ Charly910, merci pour l'info, après test j'ai une erreur sur :


    MB_TIMEDOUT: ShowMessage('Temps écoulé');

    Sinon j'avais retrouvé la fonction et son utilisation :

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
     
     
    MessageDialog('New Title', 'Some text', mtInformation, mbYesNoCancel, ['Btn Yes', 'Btn No', 'Btn Cancel']);


    Je n'en ai pas besoin c'est seulement pour info.

    @+,

    cincap

  9. #9
    Membre émérite
    Ah oui, mb_TimeOut n'est pas dans Windows.pas. Il doit être déclaré. Il ne sert pas ici. Seulement pour une autre fonction avec TimeOut !!

    A+
    Charly