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

Contribuez Delphi Discussion :

Message Box paramétrable


Sujet :

Contribuez Delphi

  1. #1
    Membre éprouvé Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    Août 2008
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : Août 2008
    Messages : 1 606
    Points : 1 113
    Points
    1 113
    Par défaut Message Box paramétrable
    Bonjour à tous.

    Je voudrais faire partager l'utilisation d'un message dialogue.

    Le probleme étant de pouvoir paramétrer le caption des boutons, le caption de la fenetre, le texte et l'icon et pour terminer récupérer l'action du choix de l'user.

    A déclarer dans un simple fichier PAS sans form
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Type
     
    //Enumération qui permet de prévoir si il y aura 1, 2 ou 3 bouttons dans la messagebox le choix Mb_OK ou autre est totalement arbitraire
      enumTypeHackBox=
          (
          Ok=MB_OK,
          Oui_Non=MB_YESNO,
          Oui_Non_Annuler=MB_YESNOCANCEL
          );
     
    ..
    end;
    Déclaration des variables qui seront donc globales et accessibles dans le projet
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    var
     
      CaptionHackbox, MessageHackBox: String;
      HackboxCaptionBtn1,HackboxCaptionBtn2,HackboxCaptionBtn3: String;
      TypeHackBox: enumTypeHackBox;
    Maintenant votre form, déclarer dans la partie private de la form

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    // ...
      private
        { Private declarations }
        procedure WMHackBox(var message: TMessage); message WM_USER + 600;

    Toujours dans la form

    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
    procedure TForm1.WMHackBox(var message: TMessage);
    var
      h: HWND;
    begin
      // La Boite de dialogue est show on récupèere son Handle
      h := FindWindow(WC_DIALOG,PAnsiChar(CaptionHackbox));
      // Si la fenêtre est la Message Box on la modifie
      if GetParent(h) = Application.Handle then
      begin
        Case TypeHackBox of
          Ok:SetDlgItemText(h, ID_OK, PansiChar(HackboxCaptionBtn1)); // On change le text bouton
          Oui_Non:
            Begin
              SetDlgItemText(h, ID_YES, PansiChar(HackboxCaptionBtn1)); // On change le text premier bouton
              SetDlgItemText(h, ID_NO, Pansichar(HackboxCaptionBtn2)); // On change le text deuxième bouton
            end;
          Oui_Non_Annuler:
            Begin
              SetDlgItemText(h, ID_YES, PansiChar(HackboxCaptionBtn1)); // On change le text premier bouton
              SetDlgItemText(h, ID_NO, Pansichar(HackboxCaptionBtn2)); // On change le text deuxième bouton
              SetDlgItemText(h, ID_CANCEL, PansiChar(HackboxCaptionBtn3)); // On change le text troisieme bouton
            end;
        end;
      end;
    end;

    Utilisation dans la form (exemple avec 2 choix)

    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
    procedure ....
    Begin
        // On publie notre message personnalisé (j'ai mis + 600 arbitrairement)
        PostMessage(Handle, WM_USER + 600, 0, 0);
        CaptionHackbox := 'Confirmation';
        MessageHackBox := 'Merci de votre choix';
        TypeHackBox := Oui_Non; // Il y aura 2 choix
        HackboxCaptionBtn1 := 'Enregistrer'; // Première choix
        HackboxCaptionBtn2 := 'Ne pas enregistrer'; // Deuxième choix
     
        // On appel la boite de dialogue avec un iconquestion (il y en a plein d'autre)
        // et on test le résult du choix boutton
        // 6 = Oui et donc le premier choix
        if Application.MessageBox(
          PAnsiChar(MessageHackBox),
          PAnsiChar(CaptionHackbox),
          MB_YESNO or MB_ICONQUESTION) = 6 Then
        Begin
            // premier boutton
        end
        else
        Begin
           //deuxième boutton
        end;
    //...
     
    end;
    Toutes améliorations est la bienvenue.

    Pour info : Ici j'ai choisi de mettre en variable global dans un fichier pas, les divers captions, car l'interet c'est d'utiliser plusieur fois ce schéma dans la même form ou dans une autre form du même projet.

    Maintenant je ne m'embete plus aves les messagebox...


  2. #2
    Expert éminent sénior

    Avatar de sjrd
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2004
    Messages
    4 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Suisse

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2004
    Messages : 4 517
    Points : 10 152
    Points
    10 152
    Par défaut
    Euh je vais faire mon noob : c'est quoi le but ?
    sjrd, ancien rédacteur/modérateur Delphi.
    Auteur de Scala.js, le compilateur de Scala vers JavaScript, et directeur technique du Scala Center à l'EPFL.
    Découvrez Mes tutoriels.

  3. #3
    Membre éprouvé Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    Août 2008
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : Août 2008
    Messages : 1 606
    Points : 1 113
    Points
    1 113
    Par défaut
    Citation Envoyé par sjrd Voir le message
    Euh je vais faire mon noob : c'est quoi le but ?
    Intercepter la message box pour changer le caption des boutons, le caption de la fenêtre, et le caption du label. Ce qui te permet une messagebox totalement personalisée..

    Bye.

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 76
    Points : 29
    Points
    29
    Par défaut
    Bonjour,

    Je viens d'implémenter ton code... Les boutons affichent 'oui' et 'non', pas 'enregistrer' et 'ne pas enregistrer'...

    Les boites par défaut de Delphi ne sont ni remplacées ni interceptées...

    J'ai mis un point d'arrêt dans la procédure WMHackBox. On y passe bien, mais le test ' if GetParent(h) = Application.Handle then' n'est pas satisfait.


    Une idée du souci ?

  5. #5
    Membre éprouvé Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    Août 2008
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : Août 2008
    Messages : 1 606
    Points : 1 113
    Points
    1 113
    Par défaut
    Citation Envoyé par What Voir le message
    Bonjour,

    Je viens d'implémenter ton code... Les boutons affichent 'oui' et 'non', pas 'enregistrer' et 'ne pas enregistrer'...

    Les boites par défaut de Delphi ne sont ni remplacées ni interceptées...

    J'ai mis un point d'arrêt dans la procédure WMHackBox. On y passe bien, mais le test ' if GetParent(h) = Application.Handle then' n'est pas satisfait.


    Une idée du souci ?
    Que te donne GetParent(h) ?

    Sinon mets ton unit dans ton topic initial TOPIC pour que se soit plus facile.

Discussions similaires

  1. [VB.NET] - Message Box - Intercepter le bouton Aide?
    Par xVINCEx dans le forum Windows Forms
    Réponses: 14
    Dernier message: 03/06/2021, 10h51
  2. [C/C++] afficher des doubles dans une message box
    Par lalaurie40 dans le forum MFC
    Réponses: 1
    Dernier message: 24/05/2005, 14h55
  3. afficher une "message box"
    Par requiemforadream dans le forum ASP
    Réponses: 2
    Dernier message: 19/04/2005, 16h11
  4. Message box
    Par jagboys dans le forum ASP
    Réponses: 21
    Dernier message: 10/12/2004, 22h11
  5. question sur les message box !
    Par krown dans le forum Langage
    Réponses: 7
    Dernier message: 02/08/2002, 16h11

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