statusbar — u_pbt_statusbar #
← Référence des composants · Sommaire du guide
Barre d'état à panneaux : texte riche, icônes, largeurs fixes ou automatiques, alignement à gauche ou à droite, panneaux cliquables, mini-barre de progression et états colorés.
▶ Le voir en vrai — Application de démonstration, tuile Statusbar : l'aperçu, le code qui le produit et cette page, côte à côte.
En bref #
| Userobject | u_pbt_statusbar |
| Classe d'items | n_pbt_statusbar_panel (panneau) · n_pbt_statusbar_menu_item (entrée de liste) |
| Sert à | Afficher en bas de fenêtre l'état de l'application : contexte, avancement, alertes discrètes |
| Options opt-in | ib_announce |
Démarrage rapide #
// event open de la fenetre
// of_add_panel(cle, texte, icone, alignement, largeur)
// la cle retrouve le panneau plus tard ; largeur 0 = ajustee au texte, -1 = prend la place libre
uo_status.of_add_panel(/*key*/ "state", /*text*/ "Ready", /*icon_file*/ "", /*align*/ uo_status.ALIGN_START, /*width*/ -1)
uo_status.of_add_panel(/*key*/ "pos", /*text*/ "Line 12, Col 4", /*icon_file*/ "", /*align*/ uo_status.ALIGN_START, /*width*/ 0)
uo_status.of_add_panel(/*key*/ "clock", /*text*/ "12:00", /*icon_file*/ "", /*align*/ uo_status.ALIGN_END, /*width*/ 140)
// Mettre un panneau a jour a tout moment, par son identifiant
uo_status.of_panel(/*key*/ "state").is_text = "Enregistrement en cours..."
Le modèle : des panneaux à clé #
La barre est une suite de panneaux, ajoutés dans l'ordre. Un panneau reçoit un identifiant à la création : c'est par lui qu'on le retrouve ensuite pour changer son texte, son icône ou son état.
L'identifiant est une clé d'adressage, pas un interrupteur d'interactivité :
- Identifiant renseigné : le panneau est retrouvable — on change son contenu, on lui pose une info-bulle. Il reste inerte : une barre d'état affiche avant tout, et un panneau comme
Ligne 12, Col 4ne doit pas avoir l'air pressable. Il reçoit pourtant le clic droit (ue_panel_rclicked) : un menu contextuel « Copier » n'est pas une activation. - Identifiant vide : le panneau est purement décoratif. Il n'est ni retrouvable, ni cliquable, et aucune info-bulle ne peut lui être attachée. Donnez un identifiant à tous vos panneaux : ça ne coûte rien et ça garde la porte ouverte. Il compte pourtant dans
of_countet dans les positions, etof_keys_atrend une clé vide pour lui. - Pour rendre un panneau cliquable, demandez-le :
of_panel(/*key*/ "id").ib_clickable = true. Un panneau doté d'une liste déroulante (of_add_menu_item) l'est d'office.
// Le panneau affiche un nouveau texte
uo_status.of_panel(/*key*/ "state").is_text = "3 enregistrements modifies"
Voir Socle commun · Les items.
Propriétés #
| Propriété | Type | Défaut | Rôle |
|---|---|---|---|
ib_show_resize_grip | boolean | false | Affiche la poignée de redimensionnement dans le coin de fin de barre ; la tirer redimensionne la fenêtre qui porte la barre — une feuille MDI, pas son cadre — depuis son coin bas-droit (bas-gauche en lecture de droite à gauche). Elle n'est dessinée que lorsque la barre occupe le coin bas de cette fenêtre et que celle-ci se redimensionne : maximisée, sans bord redimensionnable ou barre placée plus haut, elle disparaît et la propriété reste posée |
ib_announce | boolean | false | Pour les lecteurs d'écran : à true, un texte ou un état qui change sur un panneau affiché est lu (une région vivante polie, qui laisse le lecteur finir sa phrase). Un message de of_flash_panel est toujours lu, quoi que dise cette propriété : un message est fait pour être lu. Désactivé par défaut : une horloge à la seconde parlerait toute la journée |
is_help | string | "" | La MicroHelp d'un cadre PowerBuilder : ce qu'écrivait SetMicroHelp. Affichée PAR-DESSUS le texte du panneau que nomme is_help_panel — son is_text relit toujours son propre texte — ; "" lui rend son texte. Un message de of_flash_panel passe devant tant qu'il dure |
is_help_panel | string | "" | Clé du panneau qui affiche is_help — en général le premier, celui de Ready. Vide = aucun panneau d'aide : is_help attend qu'on en nomme un |
is_theme_style | string | "" | Style visuel du composant (constantes THEME_STYLE_*) ; vide = celui de l'application, suivi à chaque changement |
is_theme_mode | string | "" | Variante claire ou sombre (constantes THEME_MODE_*) ; vide = celle de l'application, suivie à chaque changement |
il_theme_accent | long | -1 | Couleur d'accent de ce composant (-1 = l'accent de l'application, ou celui du thème) |
is_tooltip | string | "" | Info-bulle simple affichée au survol du composant |
is_super_tooltip_title | string | "" | Titre de l'info-bulle enrichie (prend le pas sur is_tooltip) |
is_super_tooltip_text | string | "" | Texte de l'info-bulle enrichie (balisage riche accepté) |
is_super_tooltip_image | string | "" | Image de l'info-bulle enrichie |
Méthodes #
| Méthode | Rôle | |
|---|---|---|
of_add_panel (string as_key, string as_text, string as_icon_file, string as_align, integer ai_width) | Ajoute un panneau en fin de barre ; une largeur de -1 en fait un ressort qui prend la place libre (ib_spring). Renvoie 0 une fois appliqué, -5 si la clé est déjà prise, contient / ou ` | ou commence par __ (une clé vide pose un panneau décoratif), -2` si le composant n'est pas créé |
of_add_sep ( ) | Insère une rupture de groupe à la position courante. Les panneaux se séparent déjà d'un filet fin : celle-ci est plus large, pour que les panneaux d'avant et d'après se lisent comme deux groupes. À appeler entre deux of_add_panel ; elle ouvre le groupe du panneau qui la suit (du côté de celui d'avant quand elle vient en dernier). Un séparateur n'est pas un panneau : il ne compte ni pour of_count / of_keys_at ni dans les positions. Renvoie 0 une fois appliqué, -2 si le composant n'est pas créé | |
of_insert_panel (string as_key, string as_text, string as_icon_file, string as_align, integer ai_width, integer ai_index) | Insère un panneau à une position précise, comptée en panneaux à partir de 1 (0 ou moins = en premier, au-delà du dernier = en fin). Mêmes refus que of_add_panel. Renvoie 0 une fois appliqué, -5 si la clé est déjà prise ou contient / ou ` | , -2` si le composant n'est pas créé |
of_move_panel (string as_key, integer ai_index) | Déplace un panneau existant à une autre position, comptée en panneaux à partir de 1. Renvoie 0 une fois appliqué, -5 sur une clé vide ou que la barre n'a jamais reçue, -2 si le composant n'est pas créé | |
of_remove_panel (string as_key) | Supprime un seul panneau, avec sa liste déroulante ; les autres conservent leur état. Renvoie 0 une fois appliqué, -5 sur une clé vide ou que la barre n'a jamais reçue, -2 si le composant n'est pas créé | |
of_panel (string as_key) → n_pbt_statusbar_panel | Rend le handle d'un panneau (créé au premier accès). Une clé vide (panneau décoratif), une adresse ou une liste ne désignent rien : leur handle n'écrit nulle part et se relit vide | |
of_flash_panel (string as_key, string as_text, long al_ms) | Affiche un message pendant al_ms millisecondes, puis réaffiche le texte du panneau (al_ms ≤ 0 = 2 secondes). Le message passe PAR-DESSUS le texte : is_text se relit toujours comme le texte du panneau, jamais comme le message. Renvoie 0 une fois appliqué, -5 sur une clé vide, une adresse ou une clé que la barre n'a jamais reçue, -2 si le composant n'est pas créé | |
of_add_menu_item (string as_keys, string as_label) · (as_keys, as_label, as_image) | Ajoute une entrée à la liste déroulante d'un panneau : as_keys a deux niveaux, le panneau puis l'entrée ("enc/utf8"). Dès la première entrée le panneau devient un sélecteur : le clic ouvre la liste, et le choix revient par ue_panel_menu_clicked avec la même adresse. Un libellé vide reprend la clé. Renvoie 0 une fois appliqué, -5 sur une adresse qui n'a pas deux niveaux, un panneau que la barre n'a jamais reçu ou une entrée déjà prise, -2 si le composant n'est pas créé | |
of_insert_menu_item (string as_keys, string as_label, integer ai_index) · (as_keys, as_label, as_image, ai_index) | Insère une entrée à une position précise, comptée en entrées à partir de 1 : un séparateur n'en est pas une. Renvoie 0 une fois appliqué, -5 sur une adresse qui n'a pas deux niveaux, une clé qui commence par __, un panneau que la barre n'a jamais reçu ou une entrée déjà prise, -2 si le composant n'est pas créé | |
of_add_menu_separator (string as_key) | Ligne de séparation dans la liste du panneau as_key. Un séparateur n'a pas d'adresse : seul of_clear_menu le retire, et une liste faite de séparateurs seuls n'est pas une liste (ni chevron ni clic). Renvoie 0 une fois appliqué, -5 sur une clé vide ou un panneau que la barre n'a jamais reçu, -2 si le composant n'est pas créé | |
of_remove_menu_item (string as_keys) | Retire une seule entrée ; la dernière partie, le panneau retrouve le comportement que lui donne ib_clickable. Renvoie 0 une fois appliqué, -5 sur une adresse que la barre n'a jamais reçue, -2 si le composant n'est pas créé | |
of_move_menu_item (string as_keys, integer ai_index) | Déplace une entrée à une autre position dans sa liste, comptée en entrées à partir de 1 : un séparateur n'en est pas une. Renvoie 0 une fois appliqué, -5 sur une adresse que la barre n'a jamais reçue, -2 si le composant n'est pas créé | |
of_menu_item (string as_keys) → n_pbt_statusbar_menu_item | Rend le handle d'une entrée (créé au premier accès), pour la griser, la cocher ou la renommer. Une adresse qui n'a pas deux niveaux ne désigne rien : son handle n'écrit nulle part et se relit vide | |
of_clear_menu (string as_key) | Retire toute la liste déroulante ; le panneau retrouve le comportement que lui donne ib_clickable. Renvoie 0 une fois appliqué, -5 sur une clé vide, une adresse ou un panneau que la barre n'a jamais reçu, -2 si le composant n'est pas créé | |
of_dock_bottom ( ) | Place la barre le long du bord BAS de ce qui la porte (une fenêtre, un onglet, un userobject), sur toute sa largeur ; sa hauteur ne change pas. À appeler dans l'événement resize de la fenêtre. Dans un cadre MDI, retaillez mdi_1 à la place qui reste : WorkSpaceHeight() - uo_status.Height. Renvoie 0 une fois placée, -5 si la barre n'est ni sur une fenêtre ni sur un userobject, -2 si le composant n'est pas créé | |
of_clear ( ) | Vide la barre : tous les panneaux et tous les séparateurs. Renvoie 0 une fois appliqué, -2 si le composant n'est pas créé | |
of_reset ( ) | Vide la barre et remet les propriétés à leur défaut. Renvoie 0 une fois appliqué, -2 si le composant n'est pas créé |
Les arguments de of_add_panel #
| Argument | Valeurs | Effet |
|---|---|---|
as_key | libre, ou "" | Clé du panneau, par laquelle on le retrouve ensuite. Vide = panneau décoratif, ni adressable ni cliquable |
as_text | texte | Contenu du panneau. Le balisage riche est accepté |
as_icon_file | chemin d'image, ou "" | Icône affichée avant le texte (formes acceptées) |
as_align | ALIGN_START (défaut) ou ALIGN_END | Côté vers lequel le panneau est poussé. Valeurs logiques : START = début de lecture (gauche en écriture de gauche à droite). Les alias physiques "left" / "right" restent acceptés |
ai_width | pixels, 0 ou -1 | Largeur fixe. 0 = le panneau s'ajuste à son contenu ; -1 = un ressort qui prend toute la place libre de la barre (ib_spring) |
Sur un panneau — n_pbt_statusbar_panel #
| Membre | Type | Défaut | Rôle |
|---|---|---|---|
is_text | string | "" | Texte du panneau, balisage riche accepté |
is_image | string | "" | Icône du panneau, modifiable à tout moment |
ib_enabled | boolean | true | Panneau grisé et non cliquable |
ib_visible | boolean | true | Panneau masqué, sans être retiré de la barre |
ii_progress | integer | — | Mini-barre de progression dans le panneau, à côté du texte, de 0 à 100 (au-delà de 100 la barre est pleine et se relit 100) ; une valeur négative la fait disparaître. Se relit -1 quand le panneau n'a pas de barre (et 0 pour une barre à 0 %) |
is_state | string | "" | État sémantique du panneau, qui colore son texte et marque son bord de début : voir les constantes ci-dessous. Toute autre valeur vaut « aucun état » et se relit vide ; un panneau désactivé est grisé, marque d'état comprise |
ib_indeterminate | boolean | false | Barre animée sans valeur, pour un traitement dont la durée est inconnue. Indépendante de ii_progress, qui reste le pourcentage exact |
ib_clickable | boolean | false | Le panneau réagit-il au clic. Opt-in : un panneau reste inerte tant qu'on ne le demande pas, tout en gardant sa clé — il est piloté et porte une info-bulle. Un panneau à liste déroulante est cliquable d'office |
ib_spring | boolean | false | Ressort : le panneau prend toute la place libre de la barre, et son texte est le premier à s'élider quand la fenêtre rétrécit — le panneau Ready qui grandit avec la fenêtre. Plusieurs ressorts se partagent la place ; une largeur fixe s'efface devant lui |
is_tooltip | string | "" | Infobulle du panneau (balises de texte riche acceptées). Elle s'affiche aussi sur un panneau grisé, pour dire pourquoi. Sans infobulle, un panneau dont le texte est coupé montre son texte entier au survol |
is_super_tooltip_title | string | "" | Titre de l'infobulle riche du panneau (prioritaire sur is_tooltip) |
is_super_tooltip_text | string | "" | Texte de l'infobulle riche du panneau (balises acceptées) |
is_super_tooltip_image | string | "" | Image de l'infobulle riche du panneau |
il_accent | long | -1 | Accent de ce panneau : le remplissage de sa mini-barre de progression. -1 = l'accent du composant |
il_back_color | long | -1 | Fond de ce panneau au repos. -1 = celui de la barre |
il_text_color | long | -1 | Couleur du texte de ce panneau au repos. Un état (is_state) ou un panneau grisé peint d'abord sa propre couleur : le sens l'emporte sur la couleur. -1 = celle de la barre |
il_back_color_hover | long | -1 | Fond sous le pointeur — seul un panneau cliquable (ib_clickable) répond au pointeur. -1 = celui du thème |
il_text_color_hover | long | -1 | Couleur du texte sous le pointeur, sur un panneau cliquable. -1 = celle du thème |
Sur une entrée de liste — n_pbt_statusbar_menu_item #
Obtenue par of_menu_item(/*keys*/ "enc/utf8") : l'adresse a deux niveaux, le panneau puis l'entrée. La liste est un menu natif : une propriété changée pendant qu'il est ouvert se voit à l'ouverture suivante.
| Membre | Type | Défaut | Rôle |
|---|---|---|---|
is_label | string | "" | Texte de l'entrée |
is_image | string | "" | Image avant le texte, modifiable à tout moment |
ib_enabled | boolean | true | Entrée grisée : affichée, mais impossible à choisir |
ib_checked | boolean | false | Coche devant l'entrée, pour la valeur en cours |
ib_visible | boolean | true | Entrée retirée de la liste sans être supprimée : la remontrer ne demande rien d'autre |
Les propriétés que toute poignée d'item hérite — is_tooltip, is_super_tooltip_title, is_super_tooltip_text, is_super_tooltip_image, il_accent, il_back_color, il_text_color, il_back_color_hover, il_text_color_hover — sont sans effet sur une entrée : la liste est un menu natif, qui ne montre ni infobulle ni couleur d'une entrée. Elles sont ignorées et se relisent vides (-1 pour une couleur). Une position dans une liste compte des entrées : un séparateur n'en est pas une, et of_count("enc"), of_keys_at("enc", n), of_has("enc/utf8") parcourent les entrées d'un panneau. Une clé qui commence par __ est réservée au composant.
// The menu of the encoding panel, entry by entry
uo_status.of_add_menu_item(/*keys*/ "enc/utf8", /*label*/ "UTF-8")
uo_status.of_add_menu_item(/*keys*/ "enc/ansi", /*label*/ "ANSI")
uo_status.of_menu_item(/*keys*/ "enc/utf8").ib_checked = true // the current value
uo_status.of_menu_item(/*keys*/ "enc/ansi").ib_enabled = false // not available here
Constantes d'état #
| Constante | Valeur | Usage |
|---|---|---|
STATE_NONE | "" | Aucun état : apparence normale |
STATE_INFO | "info" | Information |
STATE_WARNING | "warning" | Avertissement |
STATE_ERROR | "error" | Erreur |
STATE_SUCCESS | "success" | Succès |
Comme pour toute propriété à valeurs prédéfinies, utilisez la constante plutôt que la chaîne :
// The panel takes the colors of a warning
uo_status.of_panel(/*key*/ "state").is_state = n_pbt_statusbar_panel.STATE_WARNING
Événements #
| Événement | Déclenché quand |
|---|---|
ue_panel_clicked (string as_key) | Un panneau cliquable (ib_clickable) est cliqué |
ue_panel_double_clicked (string as_key) | Un panneau cliquable est double-cliqué — le raccourci classique derrière Ligne 12, Col 4 qui ouvre un « Aller à la ligne ». Jamais sur un panneau à liste déroulante : son premier clic a ouvert la liste |
ue_panel_rclicked (string as_key, long al_x, long al_y) | Un panneau qui a une clé reçoit un clic droit — cliquable ou non (un menu contextuel n'est pas une activation), jamais s'il est désactivé. Un seul événement par clic droit. al_x et al_y sont des pixels écran ; pour un menu PowerBuilder, PopMenu(PointerX(), PointerY()) de votre fenêtre. Au clavier, la touche Menu ou Maj+F10 sur le panneau qui a le focus le lève aussi, au coin bas-gauche du panneau |
ue_panel_menu_clicked (string as_keys) | Une entrée d'une liste déroulante de panneau est choisie (voir of_add_menu_item). as_keys porte les deux niveaux : le panneau, puis l'entrée — "enc/utf8". Au clavier, Entrée, Espace, Flèche haut ou bas ouvrent la liste. Un panneau retiré, désactivé ou masqué pendant que sa liste est ouverte la ferme, et rien n'est levé |
ue_ready ( ) | Le composant a fini de charger ; tout ce qui a été envoyé avant a été rejoué |
ue_runtime_missing ( ) | Le runtime WebView2 est absent : le composant reste vide |
ue_bg_color (long al_color) | Le composant a calculé sa couleur de fond de thème ; l'userobject l'a déjà adoptée (backcolor) |
Au clavier #
La barre est un seul arrêt de tabulation : seuls les panneaux faits pour être cliqués y entrent, et les flèches les parcourent.
| Touche | Effet |
|---|---|
| Flèches | Passent au panneau interactif précédent / suivant, en bouclant ; les panneaux d'affichage et les panneaux désactivés sont sautés |
| Début / Fin | Premier / dernier panneau interactif |
| Entrée ou Espace | Déclenche le panneau — c'est-à-dire ue_panel_clicked, ou l'ouverture de sa liste déroulante s'il en a une |
| Haut / Bas | Sur un panneau qui porte une liste déroulante : l'ouvrent, au-dessus du panneau |
| Touche Menu ou Maj+F10 | ue_panel_rclicked du panneau qui a le focus, à son coin bas-gauche |
Un panneau qui se contente d'afficher n'est pas un contrôle : il n'est ni focalisable ni annoncé comme tel. Un panneau cliquable mais désactivé reste, lui, annoncé comme indisponible plutôt que de passer pour du texte. Une barre de progression annonce sa valeur, et une progression indéterminée n'en annonce aucune — cette absence est le sens du mot. Un panneau cliquable grisé montre toujours son infobulle — celle qui dit pourquoi il est grisé — et un panneau à liste dit si sa liste est ouverte.
Un lecteur d'écran entend les messages de of_flash_panel sans que le focus bouge : c'est le rôle d'une barre d'état (une région vivante polie). Les autres changements — un nouveau texte, un nouvel état — ne sont lus qu'avec ib_announce = true, sans quoi une horloge à la seconde parlerait toute la journée.
Le focus survit à la reconstruction de la barre : un panneau ajouté, retiré, masqué ou grisé la reconstruit, et le focus revient sur le même panneau (sur le suivant quand il ne peut plus le prendre). Un texte, un état ou une progression changent sur place, sans rien reconstruire — une horloge à la seconde ne vole jamais le focus.
Exemples #
Largeurs fixes et largeurs automatiques #
// Largeur 0 : le panneau prend exactement la place de son texte
uo_status.of_add_panel(/*key*/ "", /*text*/ "Panneau ajuste au contenu", /*icon_file*/ "", /*align*/ uo_status.ALIGN_START, /*width*/ 0)
// Largeur fixe en pixels : utile quand le texte change souvent,
// pour que les panneaux voisins ne bougent pas a chaque mise a jour
uo_status.of_add_panel(/*key*/ "pos", /*text*/ "Ligne 1, Col 1", /*icon_file*/ "", /*align*/ uo_status.ALIGN_START, /*width*/ 150)
// Un panneau pousse a l'extremite opposee
uo_status.of_add_panel(/*key*/ "clock", /*text*/ "12:00", /*icon_file*/ "", /*align*/ uo_status.ALIGN_END, /*width*/ 140)
Icônes et panneaux cliquables #
// Une cle rend le panneau adressable ; ib_clickable le rend cliquable
uo_status.of_add_panel(/*key*/ "save", /*text*/ "Enregistre", /*icon_file*/ "mono:img\save.svg", /*align*/ uo_status.ALIGN_START, /*width*/ 0)
uo_status.of_add_sep() // trait de separation entre deux groupes de panneaux
uo_status.of_add_panel(/*key*/ "conn", /*text*/ "Connecte", /*icon_file*/ "mono:img\plug.svg", /*align*/ uo_status.ALIGN_START, /*width*/ 0)
uo_status.of_add_panel(/*key*/ "user", /*text*/ "Alex Martin", /*icon_file*/ "mono:img\user.svg", /*align*/ uo_status.ALIGN_END, /*width*/ 160)
// Seuls ces deux-la repondent au clic (ue_panel_clicked)
uo_status.of_panel(/*key*/ "conn").ib_clickable = true
uo_status.of_panel(/*key*/ "user").ib_clickable = true
// event ue_panel_clicked de uo_status
choose case as_key
case "conn" ; open(w_connection_settings)
case "user" ; open(w_profile)
end choose
Texte riche dans un panneau #
Les panneaux acceptent le balisage riche : styles, couleurs et petites images directement dans le texte.
// Un accueil a gauche
uo_status.of_add_panel(/*key*/ "", /*text*/ "Bienvenue [b]dans[/b] [accent]PBToolboxAI[/accent]", &
/*icon_file*/ "", /*align*/ uo_status.ALIGN_START, /*width*/ 0)
// L'etat de la connexion a droite
uo_status.of_add_panel(/*key*/ "", /*text*/ "[green]En ligne[/green] [picture=mono:img\plug.svg,14,14]", &
/*icon_file*/ "", /*align*/ uo_status.ALIGN_END, /*width*/ 0)
// Variables locales
long ll_changed
// Le texte riche vaut aussi pour les mises a jour
ll_changed = dw_list.ModifiedCount()
uo_status.of_panel(/*key*/ "state").is_text = "[b]" + String(ll_changed) + "[/b] records changed"
Suivre un traitement long #
// Local variables
n_pbt_statusbar_panel lnv_import
// Le panneau d'import, puis son handle pour le suivre
uo_status.of_add_panel(/*key*/ "import", /*text*/ "Import", /*icon_file*/ "", /*align*/ uo_status.ALIGN_START, /*width*/ 220)
lnv_import = uo_status.of_panel(/*key*/ "import")
// Variables locales
long ll_percent
// Dans la boucle de traitement : la mini-barre suit l'avancement
for ll_percent = 0 to 100 step 25
lnv_import.ii_progress = ll_percent
lnv_import.is_text = "Import " + String(ll_percent) + " %"
next
// A la fin : masquer la mini-barre et signaler le resultat
lnv_import.ii_progress = -1 // valeur negative = barre masquee
lnv_import.is_text = "Import termine"
lnv_import.is_state = lnv_import.STATE_SUCCESS
Signaler une alerte discrète #
// Local variables
n_pbt_statusbar_panel lnv_panel
// Le panneau de la connexion
lnv_panel = uo_status.of_panel(/*key*/ "conn")
// Hors ligne : le panneau signale une erreur ; connecte : il redevient normal
if not ib_connected then
lnv_panel.is_text = "Hors ligne"
lnv_panel.is_state = lnv_panel.STATE_ERROR
else
lnv_panel.is_text = "Connecte"
lnv_panel.is_state = lnv_panel.STATE_NONE // retour a l'apparence normale
end if
Adapter la barre au contexte #
// Masquer un panneau sans le supprimer : il retrouvera sa place plus tard
uo_status.of_panel(/*key*/ "user").ib_visible = ib_user_signed_in
// Le griser quand l'action correspondante n'a pas de sens
uo_status.of_panel(/*key*/ "save").ib_enabled = ib_document_open
// Reorganiser : placer le panneau d'etat en tete (positions comptees a partir de 1)
uo_status.of_move_panel(/*key*/ "state", /*index*/ 1)
// Retirer un panneau devenu inutile
uo_status.of_remove_panel(/*key*/ "import")
La poignée de redimensionnement #
// Tirer la poignee de coin redimensionne la fenetre qui porte la barre (masquee quand elle est maximisee)
uo_status.ib_show_resize_grip = true
Un panneau qui prend la place libre #
Comme le panneau « Prêt » de toute barre d'état Windows : il grandit avec la fenêtre, pousse les panneaux de fin au bout, et c'est son texte qui s'élide le premier quand la place manque.
// Une largeur de -1 : le panneau prend toute la place libre
uo_status.of_add_panel(/*key*/ "state", /*text*/ "Ready", /*icon_file*/ "", /*align*/ uo_status.ALIGN_START, /*width*/ -1)
uo_status.of_add_panel(/*key*/ "clock", /*text*/ "12:00", /*icon_file*/ "", /*align*/ uo_status.ALIGN_END, /*width*/ 140)
// La meme chose sur un panneau qui existe deja
uo_status.of_panel(/*key*/ "state").ib_spring = true
Placer la barre au bas de la fenêtre #
of_dock_bottom la pose le long du bord bas de ce qui la porte, sur toute la largeur : un appel dans l'événement resize suffit. Dans un cadre MDI, les feuilles se partagent ce qui reste au-dessus.
// event resize de la fenetre : la barre suit le bord bas
uo_status.of_dock_bottom()
// event resize d'un cadre MDI : la barre en bas, les feuilles au-dessus
uo_status.of_dock_bottom()
mdi_1.Resize(WorkSpaceWidth(), WorkSpaceHeight() - uo_status.Height)
Reprendre la MicroHelp #
Dans un cadre MDI à MicroHelp, PowerBuilder écrit l'aide de l'élément de menu sous le pointeur, et SetMicroHelp écrit la vôtre. La barre reprend ce rôle : nommez une fois le panneau qui affiche l'aide (is_help_panel), puis écrivez is_help là où vous appeliez SetMicroHelp. L'aide s'affiche par-dessus le texte du panneau, et "" le lui rend.
// Une fois : le panneau qui affiche l'aide (le premier, en general)
uo_status.is_help_panel = "state"
// La ou vous appeliez SetMicroHelp : l'aide passe par-dessus Ready
uo_status.is_help = "Saving the order..."
// "" rend au panneau son propre texte
uo_status.is_help = ""
// event ue_item_hover d'une menubar (uo_menu) : l'aide de l'entree sous le pointeur
uo_status.is_help = this.of_item(/*keys*/ as_keys).is_tooltip
// event getfocus d'un champ (sle_name) : son Tag est son aide
uo_status.is_help = sle_name.Tag
Bonnes pratiques #
- Donnez une largeur fixe aux panneaux dont le texte change souvent (position du curseur, compteurs) : les panneaux voisins cesseront de sauter à chaque rafraîchissement.
- Faites du premier panneau un ressort (
ib_spring, ou une largeur de-1) : il prend la place libre, et c'est son texte qui s'élide le premier. - Un panneau est inerte par défaut : demandez le clic par
ib_clickable, et laissez sans réaction les panneaux qui ne font qu'afficher. - Réservez la fin de barre (
ALIGN_END) aux informations stables (heure, utilisateur, connexion) et le début (ALIGN_START) au contexte courant ; en lecture de droite à gauche, les deux côtés s'inversent d'eux-mêmes. - Employez
is_stateplutôt que des couleurs dans le texte : l'état suit le thème clair comme sombre. - Pensez à repasser
is_stateàSTATE_NONEetii_progressà une valeur négative dès que l'alerte ou le traitement est terminé. - Une barre d'état n'est pas un journal : au-delà de cinq ou six panneaux, préférez une notification toaster.
- Si la progression mérite mieux qu'une mini-barre de panneau, passez à la progressbar.
Hérité du socle commun #
Ces membres existent sur tous les composants visuels — ils ne sont pas propres à celui-ci. Ils sont détaillés une seule fois, dans les chapitres transverses ; cette table dit seulement où les lire.
| Membres | Rôle | Détaillé dans |
|---|---|---|
of_count · of_keys_at · of_has | Parcourir ce que le composant contient | 3.2 Les items |
of_reset | Remettre le composant à zéro | 3.6 Remettre un composant à zéro : of_reset() |
of_register_shortcut · of_clear_shortcuts | Raccourcis clavier du composant | 3.5 Les raccourcis clavier |
of_is_created · of_is_ready · of_get_last_error | S'il est né, s'il est prêt, ce qui a échoué | 3.7 Diagnostic |
of_save_as_png · of_save_as_jpg | Exporter le rendu en image | 3.8 Exporter le rendu en image |
of_set_redraw | Grouper les modifications en un seul repaint | 3.10 Bonnes pratiques |
of_preload_icons | Icônes affichées sans délai | Affichage instantané : of_icon |
of_set_translation | Traduire un libellé du composant | 5.2 Adapter un libellé : of_set_translation |
of_focus_webview | Donner le focus au composant | 6.4 Clavier et focus |
of_print · of_print_to_pdf | Imprimer, ou écrire un PDF | 6.9 Imprimer |
of_set_property · of_get_property · of_component_name | Piloter une propriété par son nom | 3.1 Le moteur de propriétés |
is_accessible_name · is_accessible_description | Le nom et la description que dit un lecteur d'écran | 3.4 Propriétés et events optionnels |
Deux aides ne sont pas héritées : of_icon et of_escape_markup vivent sur n_pbt_utils. Déclarez-en une — n_pbt_utils lnv_utils, rien à créer — et appelez-les dessus.