PBToolboxAI v5 ← Site

contextmenu — u_pbt_contextmenu #

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

Le menu contextuel de Windows, au thème de l'application : une liste en cascade qui s'ouvre au curseur, sous un contrôle ou à un point de l'écran — icônes, raccourcis affichés, coches, entrées radio, en-têtes de section, longues listes qui défilent et répondent à la frappe.

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


En bref #

Userobjectu_pbt_contextmenu
Classe d'itemsn_pbt_contextmenu_item (of_item(keys))
Sert àOffrir, au clic droit ou sous un bouton, les commandes qui valent pour ce qui est sous la main
PrincipeVous décrivez les entrées par leur adresse ; la fenêtre, le clavier et les cascades sont à nous
Option opt-inib_track_hover

Démarrage rapide #

// The menu of a grid : three commands, a separator, a cascade
uo_menu.of_add_item(/*keys*/ "copy", /*text*/ "&Copy")
uo_menu.of_add_item(/*keys*/ "paste", /*text*/ "&Paste")
uo_menu.of_add_item(/*keys*/ "delete", /*text*/ "&Delete")
uo_menu.of_add_separator(/*keys*/ "")
uo_menu.of_add_item(/*keys*/ "export", /*text*/ "&Export")
uo_menu.of_add_item(/*keys*/ "export/pdf", /*text*/ "PDF")
uo_menu.of_add_item(/*keys*/ "export/csv", /*text*/ "CSV")

// It opens from the right-click event of the grid : see Where to call of_show
// event ue_item_selected of uo_menu : (string as_keys)
// as_keys is the ADDRESS of the chosen entry
choose case as_keys
	case "copy"
		of_copy_selection()
	case "export/pdf"
		of_export("pdf")
end choose

Ouvrir le menu #

Le composant lui-même est invisible : il ne prend aucune place dans la fenêtre. Posez-le n'importe où, largeur et hauteur nulles — il n'existe que tant que le menu est ouvert. Quatre façons de l'ouvrir :

// event rbuttondown of a DataWindow : the row under the cursor first
if row > 0 then dw_list.SetRow(/*row*/ row)
uo_menu.of_show()

// event ue_clicked of a "More" button : the menu hangs from it
uo_menu.of_show_under(/*control*/ uo_more)

// event rbuttondown of a DataWindow, another way : the point in the control, in
// PowerBuilder units, as PopMenu took it
uo_menu.of_show_at(/*control*/ dw_list, /*x*/ dw_list.PointerX(), /*y*/ dw_list.PointerY())

Où appeler of_show #

ContrôleÉvénementÀ savoir
DataWindowrbuttondownRendez d'abord courante la ligne cliquée (SetRow(row)). L'appui convient : seul un appui choisit une entrée, jamais le relâchement qui le suit
ListView, TreeViewrightclickedL'événement donne l'élément cliqué
Composant PBToolboxAIue_rclickedUn composant à éléments a aussi un événement de clic droit d'élément, qui le nomme par son adresse
Champ de saisieun événement utilisateur sur pbm_contextmenuIl arrive au clic droit ; return 1 empêche le champ d'ouvrir aussi son propre menu Windows (Couper, Copier, Coller). Le clavier n'y arrive pas sous PowerBuilder 10 : voir la recette ci-dessous

of_show() s'ouvre où se trouve le curseur, c'est-à-dire là où l'utilisateur a cliqué : aucune unité à convertir. of_show(x, y) attend des pixels de l'écran, jamais les unités PowerBuilder d'un xpos/ypos relatif au contrôle. Pour un point dans un contrôle, en unités PowerBuilder, c'est of_show_at(contrôle, x, y).

Au clavier — Maj+F10 ou la touche Menu — la souris est n'importe où : ouvrez le menu sous le contrôle qui a le focus, par of_show_under(contrôle, true). Comme dans Windows, sa première entrée active est alors désignée : Entrée la choisit, les flèches partent de là. Sous PowerBuilder 10, pbm_contextmenu ne reçoit que le clic droit, et Maj+F10 n'atteint pas un champ de saisie (mesuré : ni pbm_contextmenu, ni pbm_keydown, ni pbm_syskeydown). La touche du clavier qui ouvre le menu sur un contrôle PowerBuilder est donc la touche Menu (KeyApps!), prise dans un événement utilisateur sur pbm_keydown — pbm_dwnkey pour un DataWindow, dont le clic droit passe par son événement rbuttondown : pbm_contextmenu n'y arrive pas pour un clic dans une cellule (mesuré). Maj+F10 reste reçu par les composants PBToolboxAI eux-mêmes (leur ue_rclicked).

// User event ue_contextmenu of an edit field, mapped on pbm_contextmenu :
// the right-click opens the menu at the cursor
uo_menu.of_show()

// The field does not open its own Windows menu as well
return 1
// User event ue_key of the same field, mapped on pbm_keydown : the Menu key
// opens the menu under the field, its first entry highlighted
if key = KeyApps! then
	uo_menu.of_show_under(/*control*/ this, /*keyboard*/ true)
	return 1
end if

// User event ue_key of a DataWindow, mapped on pbm_dwnkey : the Menu key
if key = KeyApps! then
	uo_menu.of_show_under(/*control*/ this, /*keyboard*/ true)
	return 1
end if

Une seule réponse par ouverture : un menu ouvert se termine par un choix (ue_item_selected) ou sans choix (ue_dismissed — un clic dehors, Échap, of_close). Un menu qui n'a rien à montrer ne s'ouvre pas : ue_dismissed arrive tout de suite. Pendant que le menu est à l'écran l'application continue de tourner : une entrée grisée, masquée ou retirée entre-temps ne peut plus être choisie (ue_dismissed à la place), et of_remove_item, of_clear ou of_reset ferment le menu ouvert. ue_dismissed(as_reason) dit pourquoi : REASON_ESCAPE (Échap), REASON_OUTSIDE (un clic dehors), REASON_FOCUS (une autre fenêtre a pris le focus), REASON_USER (une autre façon, un autre menu qui prend la place), REASON_CODE (of_close, une entrée retirée ou le menu vidé), REASON_REPLACED (un second of_show), REASON_EMPTY (rien à montrer), REASON_UNAVAILABLE (l'entrée choisie n'était plus disponible).

Un menu à la fois : un second of_show remplace le menu ouvert, qui répond d'abord ue_dismissed. Et of_close appelé juste après of_show ferme le menu avant même qu'il soit dessiné — ue_dismissed suit aussi.

Au clavier, les flèches parcourent les entrées en sautant les grisées, → ouvre une cascade et ← la referme, Entrée choisit, Échap remonte d'un niveau puis ferme. La lettre soulignée — celle qui suit & dans le libellé, && pour une esperluette — choisit l'entrée directement ; ailleurs, taper les premières lettres d'un libellé va à l'entrée, espaces compris (« report 2 »). Une longue liste (plus de cinq cents entrées comprises) défile et reste fluide. Lu de droite à gauche, le menu s'aligne à droite et les cascades s'ouvrent vers la gauche.


Cascades, sections et marques #

Une entrée se désigne par son adresse : sa clé seule au premier niveau (copy), les clés de ses parents puis la sienne, jointes par /, dans une cascade (export/pdf). Le parent doit exister ; une clé ne contient ni / ni | et ne commence pas par __. ue_item_selected rend cette même adresse : deux cascades peuvent nommer leurs entrées pareil.

Un séparateur (of_add_separator) et un en-tête de section (of_add_header) se posent à la fin du menu (adresse vide) ou de la cascade d'une entrée. Ni l'un ni l'autre n'est une entrée : jamais choisis, jamais comptés. Un séparateur ne s'affiche jamais en tête, en queue ni en double ; un en-tête dont toutes les entrées sont masquées disparaît avec elles.

Une coche (ib_checked) dit qu'une option est active ; une entrée radio (is_group) est un choix parmi plusieurs : les entrées d'un même groupe sous le même parent s'excluent — en cocher une, par le code ou par le choix de l'utilisateur, décoche les autres, et une puce ronde remplace la coche. Le raccourci (is_shortcut) s'affiche à droite de l'entrée ; il est affiché seulement : la touche appartient au contrôle dont parle le menu (un champ de saisie copie déjà sur Ctrl+C), et un menu contextuel qui l'armerait la prendrait à tous les contrôles de la fenêtre.

Une entrée cochée hors groupe ne bascule pas d'elle-même quand l'utilisateur la choisit — comme dans tout menu Windows : basculez-la dans ue_item_selected. Une commande qui détruit se distingue par son ton : is_tone = TONE_DANGER écrit son texte dans le rouge du thème, lisible en clair comme en sombre. Pour qu'une option se bascule d'elle-même au choix, posez ib_auto_check = true : la coche change avant ue_item_selected. Une option est une case à cocher — annoncée « non cochée » par un lecteur d'écran — dès qu'elle a été cochée une fois, ou dès ib_checkable = true.

// A section of three exclusive entries in the View cascade
uo_menu.of_add_header(/*keys*/ "view", /*text*/ "Layout")
uo_menu.of_add_item(/*keys*/ "view/list", /*text*/ "&List")
uo_menu.of_add_item(/*keys*/ "view/details", /*text*/ "&Details")
uo_menu.of_item(/*keys*/ "view/list").is_group = "layout"
uo_menu.of_item(/*keys*/ "view/details").is_group = "layout"

// Checking one unchecks the other
uo_menu.of_item(/*keys*/ "view/details").ib_checked = true

// The shortcut SHOWN at the right of an entry
uo_menu.of_item(/*keys*/ "copy").is_shortcut = "Ctrl+C"

// A command that destroys : the red of the theme
uo_menu.of_item(/*keys*/ "delete").is_tone = uo_menu.TONE_DANGER

// event ue_item_selected : a check mark outside a group is switched by you
if as_keys = "wrap" then uo_menu.of_item(/*keys*/ as_keys).ib_checked = not uo_menu.of_item(/*keys*/ as_keys).ib_checked

// ... or by the entry itself, before ue_item_selected
uo_menu.of_item(/*keys*/ "grid").ib_auto_check = true

Reprendre un menu PowerBuilder #

Vos menus surgissants sont déjà écrits ? of_load_menu en fait le menu du composant : passez l'élément sur lequel vous appeliez PopMenu. Chaque élément devient une entrée, cascades comprises, avec son texte (& compris), son état (Enabled, Checked, Visible), son Shortcut affiché à droite — comme le texte qui suit une tabulation — et son image de barre d'outils quand c'est un fichier présent. Sa clé est le ClassName de l'élément, à chaque niveau. Au choix, le script Clicked de l'élément s'exécute d'abord, puis ue_item_selected : le code écrit pour PopMenu continue de servir. Le menu reste vivant, comme avec PopMenu : chaque ouverture relit les éléments (Text, Enabled, Checked, Visible, Shortcut). Le code qui précédait PopMenu — m_paste.Enabled = (Clipboard() <> "") — et un Clicked qui fait this.Checked = not this.Checked se voient donc à l'ouverture suivante ; un élément grisé ou masqué pendant que le menu est ouvert ne lance pas son Clicked (ue_dismissed(REASON_UNAVAILABLE)). Gardez l'objet menu vivant tant que le composant s'en sert. of_loaded_item rend l'élément d'une entrée, pour lire ce que seul le menu sait (sa MicroHelp) — testez-le par IsValid, une entrée ajoutée à la main n'en a pas. Un script Clicked qui lit ParentWindow y trouve une fenêtre valide — mesuré sous PowerBuilder 10, même pour un menu créé par create et jamais attaché à une fenêtre — mais c'est PowerBuilder qui la choisit : rien ne garantit que ce soit la fenêtre qui porte le menu contextuel. Pour qu'un Clicked atteigne une fenêtre précise, donnez-la au menu dans une variable d'instance, posée avant of_load_menu, ou déplacez ce code dans ue_item_selected.

// Instance variable of the window : the menu lives as long as it does
// m_popup im_popup

// open event of the window : the items of m_popup.m_edit become the menu
im_popup = create m_popup
uo_menu.of_load_menu(/*menu*/ im_popup.m_edit)

// event rbuttondown of the DataWindow : the code before PopMenu stays,
// of_show replaces PopMenu - the items are read again as it opens
im_popup.m_edit.m_paste.Enabled = (Clipboard() <> "")
uo_menu.of_show()

// event ue_item_hover of uo_menu (ib_track_hover = true) : the MicroHelp
if IsValid(uo_menu.of_loaded_item(/*keys*/ as_keys)) then st_help.text = uo_menu.of_loaded_item(/*keys*/ as_keys).MicroHelp
// A Clicked that must reach ONE given window : the menu keeps that window
// itself. Instance variable of m_popup : window iw_owner
// Clicked of m_edit.m_copy
iw_owner.TriggerEvent("ue_copy")

// open event of the window, before of_load_menu
im_popup.iw_owner = this

Propriétés #

PropriétéTypeDéfautRôle
ib_track_hoverbooleanfalseActive ue_item_hover, qui dit quelle entrée le pointeur ou le clavier désigne — pour la ligne d'aide d'une barre d'état. Sans lui, le menu ne le rapporte même pas : un événement levé à chaque mouvement n'est envoyé qu'à l'application qui l'a demandé — posez-la avant of_show : changée menu ouvert, elle vaut à l'ouverture suivante
is_theme_stylestring""Style visuel du composant (constantes THEME_STYLE_*) ; vide = celui de l'application, suivi à chaque changement
is_theme_modestring""Variante claire ou sombre (constantes THEME_MODE_*) ; vide = celle de l'application, suivie à chaque changement
il_theme_accentlong-1Couleur d'accent de ce composant (-1 = l'accent de l'application, ou celui du thème)

Méthodes #

MéthodeRôle
of_add_header (string as_keys, string as_text)Ajoute un en-tête de section à la fin du menu (adresse vide) ou de la cascade d'une entrée : une ligne de titre au-dessus des entrées qui la suivent. Jamais choisi ni compté. Rend 0 une fois ajouté, -5 quand aucune entrée ne vit à cette adresse, -2 quand le composant n'est pas créé
of_add_item (string as_keys, string as_text)Ajoute une entrée à son adresse : copy dans le menu, export/pdf dans la cascade d'une entrée export existante, aussi profond qu'il faut. Un libellé vide montre la clé ; & désigne la lettre qui la choisit au clavier. Rend 0 une fois ajoutée, -5 quand l'adresse est refusée (parent introuvable, adresse déjà prise, niveau vide comme export/, clé à ` ou commençant par __), -2` quand le composant n'est pas créé
of_add_item (string as_keys, string as_text, string as_image, boolean ab_checked)Pareil, avec l'icône et la coche — l'icône en troisième, comme partout dans la bibliothèque. Une entrée se grise par sa poignée : of_item(keys).ib_enabled = false. Rend 0 une fois ajoutée, -5 quand l'adresse est refusée, -2 quand le composant n'est pas créé
of_add_separator (string as_keys)Ajoute un séparateur à la fin du menu (adresse vide) ou de la cascade d'une entrée. Rend 0 une fois ajouté, -5 quand aucune entrée ne vit à cette adresse, -2 quand le composant n'est pas créé
of_clear ( )Vide le menu et libère les poignées obtenues par of_item. Un menu ouvert se ferme, et ue_dismissed le dit. Rend 0 une fois appliqué, -2 quand le composant n'est pas créé
of_close ( )Ferme le menu du composant s'il est à l'écran, sans choix : ue_dismissed suit, comme pour un clic dehors. Rien d'ouvert, rien ne se passe. Rend 0 une fois demandé, -2 quand le composant n'est pas créé
of_insert_item (string as_keys, string as_text, long al_index)Insère une entrée à un rang de sa liste plutôt qu'à sa fin : as_keys est l'adresse qu'elle aura, al_index sa place parmi les entrées de cette liste, à partir de 1 (0 ou moins = la première, au-delà = la fin). Séparateurs et en-têtes ne comptent pas : l'entrée se place juste avant celle qui tenait ce rang. Rend 0 une fois ajoutée, -5 quand l'adresse est refusée (comme of_add_item), -2 quand le composant n'est pas créé
of_insert_item (string as_keys, string as_text, string as_image, boolean ab_checked, long al_index)Pareil, avec l'icône et la coche, comme of_add_item les prend. Rend 0 une fois ajoutée, -5 quand l'adresse est refusée, -2 quand le composant n'est pas créé
of_is_open ( )true tant qu'un menu du composant est à l'écran — ouvert, et pas encore répondu par un choix ou un renvoi
of_item (string as_keys)Rend la poignée d'une entrée, par son adresse, pour la lire ou la changer plus tard (libellé, état, icône, raccourci, groupe, couleurs). Une clé seule est résolue en l'adresse complète de la seule entrée qui la porte : of_item("pdf") et of_item("export/pdf") rendent alors la même poignée. Ambiguë, ou portée par aucune entrée, elle rend une poignée qui ne change rien plutôt que la mauvaise entrée
of_load_menu (menu am_menu)Construit le menu depuis un menu PowerBuilder : passez l'élément sur lequel vous appeliez PopMenu. Ses éléments deviennent les entrées, cascades comprises, clé = ClassName ; au choix, le Clicked de l'élément s'exécute avant ue_item_selected. Les éléments sont relus à chaque ouverture. Le menu remplace ce que le composant tenait. Rend 0 une fois chargé, -5 quand le menu n'est pas valide, -2 quand le composant n'est pas créé
of_loaded_item (string as_keys)L'élément de menu PowerBuilder d'où vient une entrée (of_load_menu), par son adresse — pour lire sa MicroHelp. Une adresse qui ne vient pas d'un menu rend une référence invalide : testez-la par IsValid
of_remove_item (string as_keys)Retire une entrée et sa cascade ; les autres restent. Ses poignées sont libérées ; un menu ouvert se ferme (ue_dismissed). Rend 0 une fois retirée, -5 quand aucune entrée ne vit à cette adresse, -2 quand le composant n'est pas créé
of_reset ( )Vide le menu et remet chaque propriété à sa valeur par défaut, sans lever d'événement. Rend 0 une fois appliqué, -2 quand le composant n'est pas créé
of_show ( )Ouvre le menu au curseur. Appelez-le depuis le clic droit du contrôle qui reçoit le geste. Un menu sans entrée visible ne s'ouvre pas : ue_dismissed est levé. Rend 0 une fois demandé, -2 quand le composant n'est pas créé
of_show (long al_x, long al_y)Pareil, à une position de l'écran en pixels. Des coordonnées négatives sont un vrai point : un écran placé à gauche ou au-dessus du principal. Rend 0 une fois demandé, -2 quand le composant n'est pas créé
of_show_at (dragobject ado_control, long al_x, long al_y)Ouvre le menu à un point dans un contrôle, en unités PowerBuilder depuis son coin haut gauche — le point que prenait PopMenu : of_show_at(dw_list, dw_list.PointerX(), dw_list.PointerY()). Le contrôle est retenu : of_source le nomme. Rend 0 une fois demandé, -5 quand le contrôle n'est pas valide ou qu'une coordonnée est nulle, -2 quand le composant n'est pas créé
of_show_under (dragobject ado_control)Ouvre le menu sous un contrôle : il pend de son bord bas, calé sur son bord de début (son bord droit en lecture de droite à gauche), et s'ouvre au-dessus quand l'écran s'arrête dessous. Rend 0 une fois demandé, -5 quand le contrôle n'est pas valide, -2 quand le composant n'est pas créé — sous un composant à éléments (une buttonbar, une toolbar), le menu pend sous le composant entier, pas sous l'un de ses boutons
of_show_under (dragobject ado_control, boolean ab_keyboard)Pareil, en disant comment le menu a été demandé : true pour le clavier (Maj+F10, touche Menu) — la première entrée active est désignée, Entrée la choisit, comme dans Windows. Rend 0 une fois demandé, -5 quand le contrôle n'est pas valide, -2 quand le composant n'est pas créé
of_source ( )Le contrôle d'où le menu à l'écran — ou le dernier — a été ouvert : celui donné à of_show_under ou à of_show_at. Lisez-le dans ue_item_selected quand un menu sert plusieurs contrôles. Un menu ouvert au curseur ou à un point de l'écran (of_show) n'en a pas : la référence est invalide, testez-la par IsValid

Événements #

ÉvénementDéclenché quand
ue_item_selected (string as_keys)L'utilisateur a choisi une entrée, à la souris ou au clavier. as_keys est son adresse complète (export/pdf). Une entrée d'un groupe est cochée, et les autres de son groupe décochées, avant l'événement
ue_dismissed (string as_reason)Le menu s'est fermé sans choix : un clic dehors, Échap, of_close, une entrée retirée ou le menu vidé pendant qu'il était ouvert, un second of_show qui l'a remplacé — et aussi quand of_show n'avait rien à montrer — as_reason dit lequel : REASON_ESCAPE, REASON_OUTSIDE, REASON_FOCUS, REASON_USER, REASON_CODE, REASON_REPLACED, REASON_EMPTY, REASON_UNAVAILABLE (une entrée grisée, masquée ou retirée depuis l'ouverture)
ue_item_hover (string as_keys)Avec ib_track_hover = true : l'entrée que le pointeur désigne, par son adresse — une entrée grisée aussi, pour que son aide dise pourquoi ; au clavier, les entrées où il s'arrête, en sautant les grisées. Levé une fois par entrée, puis avec une adresse vide quand le menu se ferme : videz alors la ligne d'aide. of_reset ferme un menu ouvert sans le lever : videz-la vous-même

Propriétés d'item #

PropriétéTypeDéfautRôle
is_textstring""Libellé de l'entrée. & désigne la lettre qui la choisit au clavier (&& pour une esperluette) ; vide, la clé s'affiche et le libellé se relit vide
ib_enabledbooleantrueÀ false, l'entrée est grisée : affichée, jamais choisie, sa cascade fermée
ib_visiblebooleantrueÀ false, l'entrée quitte le menu — cascade comprise — sans être retirée : elle garde sa clé et son état, et revient à sa place. Une cascade dont toutes les entrées sont masquées reste, grisée
ib_checkedbooleanfalseUne coche sur l'entrée — une puce ronde pour une entrée d'un groupe. Cocher une entrée d'un groupe décoche les autres du groupe ; hors groupe, l'entrée ne bascule pas d'elle-même au choix : faites-le dans ue_item_selected, ou posez ib_auto_check
ib_checkablebooleanfalseUne case à cocher : l'option est montrée et annoncée comme telle même décochée (« non cochée » pour un lecteur d'écran). Une entrée cochée une fois le devient d'elle-même ; posez-la pour une option qui démarre décochée. Une entrée radio (is_group) n'en est jamais une
ib_auto_checkbooleanfalseÀ true, choisir l'entrée bascule sa coche d'elle-même, avant ue_item_selected — ib_checked y dit le nouvel état. Elle devient une case à cocher ; sans effet sur une entrée d'un groupe
is_groupstring""Fait de l'entrée une entrée radio du groupe nommé : les entrées d'un groupe sous le même parent s'excluent. Vide : une entrée ordinaire
is_imagestring""Icône de l'entrée, changée sur place. Mêmes chemins qu'of_add_item (mono:, tint:, fichier.dll:NOM) ; vide, elle disparaît
is_shortcutstring""Le raccourci affiché à droite de l'entrée (Ctrl+C). Affiché seulement : la touche appartient au contrôle dont parle le menu. Jamais montré sur une entrée qui ouvre une cascade
is_tonestring""Le ton de la commande : son texte, au repos, dans une couleur du thème clair ou sombre — TONE_DANGER pour celle qui détruit, TONE_WARN, TONE_SUCCESS, TONE_INFO ; vide ou TONE_NEUTRAL = le texte du thème. Pointée, l'entrée prend les couleurs de survol du thème ; un il_text_color de l'entrée l'emporte. Les constantes sont sur u_pbt_contextmenu
il_accentlong-1Accent de cette entrée : sa coche, et son bord quand elle est pointée (-1 = celui du thème)
il_back_colorlong-1Fond de cette entrée au repos (-1 = celui du thème). Donné seul, le texte prend une couleur qui se lit dessus
il_text_colorlong-1Couleur du texte de cette entrée (-1 = celle du thème). Une seule couleur ne se lit pas sur le thème clair et le sombre : posez il_back_color avec elle, ou préférez is_tone, qui suit le thème
il_back_color_hoverlong-1Fond de cette entrée quand elle est pointée (-1 = celui du thème)
il_text_color_hoverlong-1Couleur du texte de cette entrée quand elle est pointée (-1 = celle du thème) : posez il_back_color_hover avec elle, le survol du thème change d'un thème à l'autre

Une entrée n'affiche aucune info-bulle : le menu natif n'en a pas. L'is_tooltip que la poignée hérite est gardé et se relit, mais il n'est jamais montré — pour une aide, ib_track_hover et ue_item_hover.


Exemples #

Un menu selon ce qui est cliqué #

// event ue_rclicked of the list : the menu is rebuilt for the current row
uo_menu.of_clear()
uo_menu.of_add_item(/*keys*/ "open", /*text*/ "&Open")
uo_menu.of_add_item(/*keys*/ "rename", /*text*/ "Re&name")
uo_menu.of_add_separator(/*keys*/ "")
uo_menu.of_add_item(/*keys*/ "delete", /*text*/ "&Delete")

// A row the user may not change : its commands are greyed
uo_menu.of_item(/*keys*/ "rename").ib_enabled = ib_can_edit
uo_menu.of_item(/*keys*/ "delete").ib_enabled = ib_can_edit

// At the cursor
uo_menu.of_show()

Un bouton Plus #

// event ue_clicked of the button : the menu hangs from it
uo_menu.of_show_under(/*control*/ uo_more)

Une aide dans la barre d'état #

// Once, after the menu is built : report the pointed entry
uo_menu.ib_track_hover = true

// event ue_item_hover of uo_menu : (string as_keys), "" when the menu closes
choose case as_keys
	case "delete"
		st_help.text = "Deletes the row, without the clipboard."
	case else
		st_help.text = ""
end choose

Bonnes pratiques #

Version de démonstration #

Sans clé, chaque liste du menu — la racine comme chaque cascade — montre ses six premières entrées visibles ; séparateurs et en-têtes ne comptent pas. La dernière ligne, grisée, dit combien d'entrées ne sont pas affichées — ou, sans coupe, porte la mention « PBToolboxAI — DEMO ». Le modèle garde tout : une clé montre le menu entier à l'ouverture suivante.

Le lanceur n'a pas de surface : des membres hérités ci-dessous, of_save_as_png, of_print et of_focus_webview n'ont rien à capturer, à imprimer ni à recevoir. of_register_shortcut reste utile — un raccourci de la fenêtre qui ouvre le menu par of_show_under.

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.

MembresRôleDétaillé dans
of_count · of_keys_at · of_hasParcourir ce que le composant contient3.2 Les items
of_resetRemettre le composant à zéro3.6 Remettre un composant à zéro : of_reset()
of_register_shortcut · of_clear_shortcutsRaccourcis clavier du composant3.5 Les raccourcis clavier
of_is_created · of_is_ready · of_get_last_errorS'il est né, s'il est prêt, ce qui a échoué3.7 Diagnostic
of_save_as_png · of_save_as_jpgExporter le rendu en image3.8 Exporter le rendu en image
of_set_redrawGrouper les modifications en un seul repaint3.10 Bonnes pratiques
of_preload_iconsIcônes affichées sans délaiAffichage instantané : of_icon
of_set_translationTraduire un libellé du composant5.2 Adapter un libellé : of_set_translation
of_focus_webviewDonner le focus au composant6.4 Clavier et focus
of_print · of_print_to_pdfImprimer, ou écrire un PDF6.9 Imprimer
of_set_property · of_get_property · of_component_namePiloter une propriété par son nom3.1 Le moteur de propriétés
is_accessible_name · is_accessible_descriptionLe nom et la description que dit un lecteur d'écran3.4 Propriétés et events optionnels

Sur ce lanceur invisible, of_count et of_keys_at parcourent ce que vous avez ajouté, branches masquées comprises — pas ce que la roue dessinera. L'export en image, l'impression, of_focus_webview et of_set_redraw n'y ont pas d'effet utile : le composant ne dessine rien de lui-même, la roue vit dans sa propre fenêtre.

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.


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