PBToolboxAI v2 ← Site

messagebox — n_pbt_messagebox #

← Référence des composants · Sommaire du guide

Boîte de dialogue modale thémée, à retour synchrone : le remplaçant direct du MessageBox() de PowerBuilder, avec texte riche, boutons libres, icônes et case à cocher.

▶ Le voir en vrai — Application de démonstration, tuile Message box : l'aperçu, le code qui le produit et cette page, côte à côte.


En bref #

Objetn_pbt_messagebox — non visuel : rien à poser dans la fenêtre
Sert àPoser une question ou annoncer un résultat, à la place du MessageBox() natif figé et non thémé
RetourSynchrone : of_show() bloque et renvoie l'indice du bouton cliqué

Contrairement aux composants visuels, cet objet ne s'insère pas dans une fenêtre : on le crée, configure, affiche, détruit.

n_pbt_messagebox lnv_mb

lnv_mb = create n_pbt_messagebox
// ... configuration ...
destroy lnv_mb

Démarrage rapide #

n_pbt_messagebox lnv_mb

lnv_mb = create n_pbt_messagebox

lnv_mb.is_title   = "Suppression"
lnv_mb.is_icon    = lnv_mb.ICON_WARNING
lnv_mb.is_message = "Supprimer definitivement [b]12 dossiers[/b] ?[br][br]Cette action est irreversible."

lnv_mb.of_add_button(/*texte*/ "Supprimer", /*defaut*/ true,  /*annulation*/ false)   // -> 1
lnv_mb.of_add_button(/*texte*/ "Annuler",   /*defaut*/ false, /*annulation*/ true)    // -> 2

if lnv_mb.of_show(/*hwnd*/ Handle(this)) = 1 then
    of_supprimer()
end if

destroy lnv_mb

of_show attend la réponse de l'utilisateur : la ligne suivante ne s'exécute qu'après le clic, exactement comme avec MessageBox().


Propriétés #

À poser avant of_show.

PropriétéTypeDéfautRôle
is_titlestring""Titre affiché dans l'en-tête de la boîte
is_messagestring""Corps du message. Accepte le balisage riche ([b], [i], [br], [accent], [picture=…]…)
is_instructionstring""Instruction principale : la question elle-même, affichée plus grande au-dessus du message. Titre / instruction / message est l'anatomie qui rend un dialogue lisible d'un coup d'œil — « Supprimer 42 lignes ? » puis « Cette action est définitive » — au lieu d'un bloc uniforme. Accepte le balisage riche
is_iconstring""Icône : une constante ICON_*, ou votre propre image (chemin de fichier, ou ressource de DLL ma.dll:NOM)
is_checkboxstring""Texte d'une case à cocher optionnelle, style « ne plus me demander » ("" = pas de case)
ib_checkedbooleanfalseÉtat initial de la case (l'état final se lit avec of_checked())
ib_inputbooleanfalseAjoute un champ de saisie thématisé (renommer, motif, commentaire), pour qu'une application n'ait plus à bricoler une fenêtre qui ne suit ni le thème ni le sens de lecture. La saisie se relit avec of_input_value() après of_show. Le tout en un appel : of_prompt
is_input_labelstring""Libellé au-dessus du champ ("" = aucun). Nécessite ib_input
is_input_valuestring""Contenu initial du champ. Il est sélectionné à l'ouverture : taper le remplace, comme dans tout dialogue de renommage
is_input_placeholderstring""Indication affichée tant que le champ est vide. Ce n'est pas une valeur : rien n'est renvoyé si l'utilisateur ne tape rien
ib_input_passwordbooleanfalseMasque les caractères saisis
ib_input_requiredbooleanfalseLe bouton par défaut reste désactivé tant que le champ est vide. Laisser soumettre pour se faire rabrouer ensuite ne sert personne ; le bouton d'annulation, lui, reste accessible
ib_buttons_reversebooleanfalseOrdre des boutons : false = de gauche à droite dans l'ordre d'ajout ; true = inversé
ib_movablebooleantrueLa boîte se déplace-t-elle ? Elle n'a pas de barre de titre — elle peint sa propre carte — donc Windows n'a aucune prise sur elle : on la lui donne, toute la carte tire la fenêtre sauf ce qui répond déjà au clic. Vraie par défaut, parce qu'une modale qui recouvre justement ce qu'il faut lire pour répondre est un piège. Mettez-la à faux pour une boîte qui doit rester où elle est
is_positionstringPOSITION_OWNERCentrage : POSITION_OWNER (sur la fenêtre appelante) ou POSITION_SCREEN (sur l'écran)
il_min_widthlong0Largeur minimale en pixels (0 = automatique)
il_max_widthlong0Largeur maximale en pixels (0 = automatique) : le texte revient à la ligne dans cette limite
il_max_heightlong0Hauteur maximale en pixels (0 = automatique) : au-delà, le corps du message défile au lieu d'agrandir la fenêtre

Constantes #

ConstanteValeurUsage
ICON_INFORMATION"information"Information neutre
ICON_WARNING"warning"Avertissement, action risquée
ICON_ERROR"error"Échec, erreur
ICON_QUESTION"question"Question fermée
ICON_SUCCESS"success"Confirmation d'un succès
ICON_NONE"none"Aucune icône
POSITION_OWNER"owner"Centré sur la fenêtre appelante
POSITION_SCREEN"screen"Centré sur l'écran

Méthodes #

MéthodeRôle
of_add_button (string as_text) → longAjoute un bouton simple. Renvoie son indice à partir de 1
of_add_button (string as_text, boolean ab_default, boolean ab_cancel) → longIdem, en marquant le bouton par défaut (Entrée) et/ou d'annulation (Échap). Renvoie son indice à partir de 1
of_add_button (string as_text, string as_icon, boolean ab_default, boolean ab_cancel) → longIdem, avec une icône sur le bouton. Renvoie son indice à partir de 1
of_add_button_timed (string as_text, boolean ab_default, boolean ab_cancel, long al_enable_secs, long al_click_secs) → longBouton à compte à rebours : reste désactivé al_enable_secs secondes (compteur visible), puis se clique tout seul au bout de al_click_secs secondes (0 = minuteur inactif). Renvoie son indice à partir de 1
of_count ( ) → integerCombien de boutons la boîte porte. Ils se désignent par leur rang — celui que rend of_add_button, celui que rend of_show — donc ils n'ont pas de clé : il n'y a ici ni of_keys_at ni of_has
of_show (long al_hwnd) → longAffiche la boîte modale et renvoie l'indice du bouton cliqué (0 = fermeture par Échap ou par la croix sans bouton d'annulation)
of_checked ( ) → booleanÉtat de la case à cocher au moment du dernier of_show
of_input_value ( ) → stringTexte saisi lors du dernier of_show (vide si ib_input était inactif)
of_action ( ) → stringIdentifiant de la zone [action=id] cliquée dans le message, chaîne vide sinon. Une telle zone est un choix proposé dans la phrase même : elle ferme le dialogue et of_show renvoie 0. Une zone [hyperlink=url], elle, s'ouvre dans le navigateur et laisse le dialogue ouvert — l'appelant est bloqué dans of_show, un lien ne peut donc pas être une réponse
of_info (long al_hwnd, string as_title, string as_message) → longDialogue en une ligne, comme l'est MessageBox() : icône d'information et un seul bouton OK, renvoie 1. Les libellés des boutons viennent des traductions de la bibliothèque (6 langues) au lieu d'être écrits dans chaque application — c'est toute la raison d'être de ces raccourcis
of_warning (long al_hwnd, string as_title, string as_message) → longIcône d'avertissement, un bouton OK. Renvoie 1
of_error (long al_hwnd, string as_title, string as_message) → longIcône d'erreur, un bouton OK. Renvoie 1
of_success (long al_hwnd, string as_title, string as_message) → longIcône de réussite, un bouton OK. Renvoie 1
of_confirm (long al_hwnd, string as_title, string as_message) → longQuestion + OK / Annuler. Renvoie 1 = OK, 2 = Annuler, 0 = fermé
of_yes_no (long al_hwnd, string as_title, string as_message) → longQuestion + Oui / Non. Renvoie 1 = Oui, 2 = Non, 0 = fermé
of_yes_no_cancel (long al_hwnd, string as_title, string as_message) → longQuestion + Oui / Non / Annuler. Renvoie 1, 2, 3, ou 0 si fermé
of_prompt (long al_hwnd, string as_title, string as_message, string as_default) → stringDemande une valeur et renvoie ce qui a été saisi, ou une chaîne vide si l'utilisateur a annulé. Pour distinguer une réponse vide d'un abandon, utilisez plutôt of_show + of_input_value
of_reset ( )Efface toutes les propriétés et les boutons ajoutés : la même instance repart de zéro. Renvoie 0 une fois appliqué, -2 si le composant n'est pas créé

Le libellé d'un bouton accepte le balisage riche et le mnémonique & ("&Enregistrer" souligne le E et l'active par Alt+E) ; && affiche une esperluette littérale.


Le clavier #

ToucheEffet
EntréeDéclenche le bouton marqué par défaut
ÉchapDéclenche le bouton marqué annulation ; sans bouton d'annulation, ferme la boîte et renvoie 0
Alt + lettreDéclenche le bouton dont le libellé porte ce mnémonique
TabDéplace le focus d'un bouton à l'autre
Ctrl + CCopie le dialogue (titre, instruction, message, libellés des boutons) dans le presse-papiers, comme toute boîte de dialogue Windows — pratique pour transmettre une erreur au support

À l'ouverture, aucun bouton n'a de contour de focus : c'est voulu, et c'est le comportement des dialogues Windows modernes. Le liseré n'apparaît qu'après une première pression sur Tab, c'est-à-dire quand l'utilisateur passe explicitement au clavier. Entrée et Échap restent actifs dès la première seconde, même sans focus visible.


Exemples #

Question fermée avec bouton par défaut #

n_pbt_messagebox lnv_mb
long ll_reponse

lnv_mb = create n_pbt_messagebox

lnv_mb.is_title   = "Enregistrer les modifications"
lnv_mb.is_icon    = lnv_mb.ICON_QUESTION
lnv_mb.is_message = "Le dossier a ete modifie. Voulez-vous enregistrer avant de fermer ?"

lnv_mb.of_add_button(/*texte*/ "&Enregistrer",     /*defaut*/ true,  /*annulation*/ false)  // 1
lnv_mb.of_add_button(/*texte*/ "&Ne pas enregistrer", /*defaut*/ false, /*annulation*/ false) // 2
lnv_mb.of_add_button(/*texte*/ "Annuler",          /*defaut*/ false, /*annulation*/ true)   // 3

ll_reponse = lnv_mb.of_show(/*hwnd*/ Handle(this))
destroy lnv_mb

choose case ll_reponse
    case 1 ; of_enregistrer() ; Close(parent)
    case 2 ; Close(parent)
    case else ; // 3 ou 0 : on ne ferme pas
end choose

Message enrichi et icône #

lnv_mb.is_title   = "Import termine"
lnv_mb.is_icon    = lnv_mb.ICON_SUCCESS
lnv_mb.is_message = "[b]1 240 lignes[/b] integrees.[br][br]" &
                  + "[accent]18 doublons[/accent] ont ete ignores."

lnv_mb.of_add_button(/*texte*/ "OK", /*defaut*/ true, /*annulation*/ false)
lnv_mb.of_show(/*hwnd*/ Handle(this))

Case « ne plus me demander » #

n_pbt_messagebox lnv_mb

lnv_mb = create n_pbt_messagebox

lnv_mb.is_title    = "Suppression"
lnv_mb.is_icon     = lnv_mb.ICON_WARNING
lnv_mb.is_message  = "Supprimer les lignes selectionnees ? Cette action est irreversible."
lnv_mb.is_checkbox = "Ne plus me demander"
lnv_mb.ib_checked  = false

lnv_mb.of_add_button(/*texte*/ "Supprimer", /*defaut*/ true,  /*annulation*/ false)
lnv_mb.of_add_button(/*texte*/ "Annuler",   /*defaut*/ false, /*annulation*/ true)

if lnv_mb.of_show(/*hwnd*/ Handle(this)) = 1 then
    of_supprimer()
    // Memoriser le choix de l'utilisateur
    ib_confirmer_suppression = not lnv_mb.of_checked()
end if

destroy lnv_mb

Bouton à compte à rebours #

lnv_mb.is_title   = "Redemarrage"
lnv_mb.is_icon    = lnv_mb.ICON_INFORMATION
lnv_mb.is_message = "L'application va redemarrer pour appliquer la mise a jour."

// "Continuer" reste grise 3 secondes (un compteur s'affiche)
lnv_mb.of_add_button_timed(/*texte*/ "Continuer", /*defaut*/ true, /*annulation*/ false, &
                           /*secondes_actif*/ 3, /*secondes_clic*/ 0)

// "Plus tard" se clique tout seul au bout de 10 secondes
lnv_mb.of_add_button_timed(/*texte*/ "Plus tard", /*defaut*/ false, /*annulation*/ true, &
                           /*secondes_actif*/ 0, /*secondes_clic*/ 10)

lnv_mb.of_show(/*hwnd*/ Handle(this))

Message long : limiter la taille #

// Un texte volumineux : la boite est plafonnee et le corps defile
lnv_mb.is_title      = "Notes de version"
lnv_mb.is_message    = ls_notes
lnv_mb.il_max_width  = 480
lnv_mb.il_max_height = 320

lnv_mb.of_add_button(/*texte*/ "Fermer", /*defaut*/ true, /*annulation*/ true)
lnv_mb.of_show(/*hwnd*/ Handle(this))

Réutiliser une instance #

// Une instance de fenetre, plusieurs dialogues : of_reset entre chaque appel
inv_mb.of_reset()      // efface les proprietes ET les boutons precedents

inv_mb.is_title   = "Second dialogue"
inv_mb.is_message = "Chaque of_reset repart d'une boite vierge."
inv_mb.of_add_button(/*texte*/ "OK", /*defaut*/ true, /*annulation*/ false)
inv_mb.of_show(/*hwnd*/ Handle(this))

Bonnes pratiques #


← Référence des composants · Sommaire du guide