PBToolboxAI v1 ← 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_messageboxnon 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é
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_texte) → longAjoute un bouton simple. Renvoie son indice à partir de 1
of_add_button (string as_texte, boolean ab_defaut, boolean ab_annulation) → longIdem, en marquant le bouton par défaut (Entrée) et/ou d'annulation (Échap)
of_add_button (string as_texte, string as_icone, boolean ab_defaut, boolean ab_annulation) → longIdem, avec une icône sur le bouton
of_add_button_timed (string as_texte, boolean ab_defaut, boolean ab_annulation, long al_secondes_actif, long al_secondes_clic) → longBouton à compte à rebours : reste désactivé al_secondes_actif secondes (compteur visible), puis se clique tout seul au bout de al_secondes_clic secondes (0 = minuteur inactif)
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_titre, 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_titre, string as_message) → longIcône d'avertissement, un bouton OK. Renvoie 1
of_error (long al_hwnd, string as_titre, string as_message) → longIcône d'erreur, un bouton OK. Renvoie 1
of_success (long al_hwnd, string as_titre, string as_message) → longIcône de réussite, un bouton OK. Renvoie 1
of_confirm (long al_hwnd, string as_titre, string as_message) → longQuestion + OK / Annuler. Renvoie 1 = OK, 2 = Annuler, 0 = fermé
of_yes_no (long al_hwnd, string as_titre, string as_message) → longQuestion + Oui / Non. Renvoie 1 = Oui, 2 = Non, 0 = fermé
of_yes_no_cancel (long al_hwnd, string as_titre, string as_message) → longQuestion + Oui / Non / Annuler. Renvoie 1, 2, 3, ou 0 si fermé
of_prompt (long al_hwnd, string as_titre, string as_message, string as_defaut) → 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

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