Une alternative à MsgBox (Version revisitée + Additif)

Bonjour à tous,

Voici une version revisitée de la fonction Dialogue.

Dans cette nouvelle version, les messages ne sont plus intégrés à la fonction Dialogue, mais stockés dans un formulaire dédié. La gestion des messages (création, modification, suppression) se fait via une application spécifique qui rend le travail de programmation beaucoup plus simple et surtout plus convivial.

Une fois mis au point, le jeu de messages sera directement exporté dans l’application destination. La fonction Dialogue (nouvelle version) se chargera d’extraire les données du message (depuis le formulaire dédié) et l’affichera selon les paramètres définis (via le formulaire Message).

Par rapport à l'ancienne version, la taille du projet se trouve fortement diminuée.

Contexte d’utilisation :(Rappels et nouveautés)

La fonction Dialogue() est une alternative à MsgBox(). Elle offre plus de possibilités en matière d’affichage et de paramétrage des messages. Comme par exemple afficher des messages "Furtifs", que s'affichent et disparaissent au bout d'un certain temps, du texte long sur une seule ligne, de la couleur dans le message, des caractères de tailles différentes, des fenêtres plus grandes, des icônes personnalisées, etc.

Elle permet au développeur de déterminer (via l'application de gestion) ses propres choix pour l'affichage des messages.

La fonction se charge, à partir des données du message (et de ses paramètres), de préparer le formulaire "Message" (hauteur/largeur, etc.), de placer le texte (les labels), de faire apparaître l'image associée et de positionner les boutons. Après validation par l'utilisateur final (si validation), elle retourne une valeur qui sera utilisée pour la suite du traitement.

Exemples d'appels de la fonction :

Après avoir positionnés (le cas échéant) les paramètres additionnels dans la variable tableau Mtxt()

M1 = Dialogue (N° Message)
If Dialogue (N° message) = 1 Then …
Select case Dialogue (N° message) …
Etc.

M1 est une variable publique ; bien que réservée à la fonction, elle pourra servir à recevoir la réponse.
N° message est le numéro du message à afficher. La fonction extraira les données directement depuis le formulaire "Données_Msg ».

Dans cette nouvelle version, le type de validation disparait ; il est déterminé par la fonction (selon le nombre de boutons positionnés).

Valeurs retournées par la fonction :
- 0 pour un message "Furtif" (sans bouton), utilisation de la touche Echap ou fermeture du formulaire par la croix,
- 1, 2 ou 3 selon le N° du bouton sélectionné,
- 99 si le message offre une possibilité d’aide et que l’utilisateur clique sur l’image (point d’interrogation) ou sur le label "Aide" présent dans ce cas.

Aperçu du classeur de gestion :

Fenêtre principale

image

Fenêtre de gestion des messages

image

Avec cette nouvelle version, la programmation des messages devient encore plus simple et l'autonomie du module Dialogue permet une implantation plus aisée dans les nouveaux projets.

Les commentaires, présents dans le code de l'application de gestion, permettent de comprendre les mécanismes de traitement. Vous pouvez adapter l'application à vos besoins en y ajoutant ou en modifiant des éléments (procédures, objets, etc.).

Bien que le programme ait été testé maintes fois, il peut s'y trouver encore quelques coquilles résiduelles (erreurs non traitées par exemple). Un retour de votre part sera le bienvenu.

Vous trouverez en pièces jointes :

  • L'application de gestion des messages,
  • Un jeu d'exemples de messages,
  • Le manuel complet.

Bonne utilisation

Bonjour,

Voici une petite modification que j'ai apportée à la fonction :

Pour les messages furtifs (qui s'effacent au bout d'un certain temps), il est maintenant possible d'effacer le message avant la fin du temps préprogrammé (Tempo).

Si l'utilisateur clique dans le message, celui-ci disparait. Utile pour les "impatients"

Modifications apportées :

Dans le module Dialogue, partie affichage du formulaire (** = Nouvelles lignes)

Select Case Nbre_Bts
        Case 0
            ' Pas de validation
            .Label1.Top = .Label1.Top - 5             ' Remonte le label pour un meilleur visuel
            With .Label12                             ' Label pour info effacement **
                .Left = 2                             ' **
                .Width = Message.Width                ' **
                .Top = Message.Height - 32 - .Height  ' En bas **
                .Visible = True                       ' **   
            End With                                  ' **
            Application.EnableCancelKey = xlDisabled  ' Bloque le clavier (cas de Echap pendant l'affichage)
            .Tag = "Non modal"                        ' Pour test dans le form (arrêt du tempo) **
            i = 0                                     ' Compteur ** 
            .Show 0                                   ' Non modal, pas de validation
            DoEvents                                  ' Impératif sinon le message ne s'affiche pas
            ' Boucle 100 fois max. Si Stop sort       ' **
            Do While .Tag <> "Stop"                   ' **
                Sleep CInt(Tabl_Msg(Msg).Tempo) / 100 ' Attente selon Msg /100 **
                i = i + 1: If i = 100 Then Exit Do    ' **
                DoEvents                              ' **
            Loop                                      ' **
            .Tag = ""                                 ' **
            Unload Message
            Dialogue = 0                              ' Retourne 0
            Application.EnableCancelKey = xlInterrupt ' Débloque le clavier

        Case 1, 2, 3
            ' Validation par un des trois boutons
            Application.Cursor = xlDefault ' Curseur normal si <>
            M1 = 0                         ' Retour par défaut (Public)
            .Show 1                        ' Modal (unload fait dans l'UserForm)
            ' Retour : M1=1 pour Bt1, =2 pour Bt2, =3 pour Bt3 ou  =0 si Echap ou fermeture par la croix
            '          M1=99 si demande d'aide (click sur l'image ? ou sur le label Aide dans le message) traitement par la procédure appelante
            Dialogue = M1
    End Select

Dans le formulaire "Message"

Ajouter un Label (Label12) : Propriétés (certaines seront modifiées par la procédure Dialogue)

image

Puis ajouter les évènements suivants dans le module du formulaire

Private Sub Label12_Click()
' Label info pour arrêt Tempo (présent uniquement si messages furtifs)
If Me.Tag = "Non modal" Then
    Me.Tag = "Stop" ' Retourne Stop à la fonction
End If
DoEvents
End Sub

Private Sub UserForm_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal x As Single, ByVal y As Single)
' Clic dans le formulaire
If Me.Label12.Visible Then Call Label12_Click ' Uniquement pour Msg furtifs idem Click
End Sub

Enfin Indiquez en entête du Module Dialogue (pour le suivi des mises à jour) :

' Ajout Label 12 pour info sur arrêt Tempo
' Ajout Procédures UserForm_MouseDown et Label12_Click pour test

Bonne programmation

Eric

Rechercher des sujets similaires à "alternative msgbox version revisitee additif"