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...