PBToolboxAI v5 ← Site

propertygrid — u_pbt_propertygrid #

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

propertygrid est la fenêtre des propriétés d'un EDI, pour vos propres données : des valeurs nommées, rangées dans des catégories qui se replient, chacune avec l'éditeur de son type — texte, nombre, case à cocher, liste de choix, couleur, date, mot de passe. Deux vues (par catégorie, alphabétique), une zone de recherche, un volet d'aide qui décrit la propriété sélectionnée, et un bouton … qui ouvre votre propre boîte de dialogue. L'utilisateur modifie, ue_value_changed vous le dit.

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


En bref #

Userobjectu_pbt_propertygrid
Classes d'itemsn_pbt_propertygrid_category (catégorie) → n_pbt_propertygrid_property (propriété)
Sert àRemplacer un écran de paramètres bricolé à coups de champs et de cases par un inspecteur thémé, typé et cherchable : réglages d'un document, d'un rapport, d'une fiche, d'un objet de l'application
ValeursToujours du texte, une par une (of_property(adresse).is_value) ; toutes d'un coup et typées par of_values
Options opt-inib_veto_changes

Démarrage rapide #

// The settings of a report : one value at the top, then a category
uo_grid.of_add_property(/*keys*/ "title", /*label*/ "Title", /*type*/ u_pbt_propertygrid.TYPE_STRING, /*value*/ "Monthly sales")
uo_grid.of_add_category(/*key*/ "page", /*title*/ "Page")
uo_grid.of_add_property(/*keys*/ "page/landscape", /*label*/ "Landscape", /*type*/ u_pbt_propertygrid.TYPE_BOOLEAN, /*value*/ "true")
uo_grid.of_add_property(/*keys*/ "page/margin", /*label*/ "Margin (mm)", /*type*/ u_pbt_propertygrid.TYPE_NUMBER, /*value*/ "12.5")

// The help pane describes the selected property
uo_grid.of_property(/*keys*/ "page/margin").is_description = "Around the printed area, in [b]millimetres[/b]."
// event ue_value_changed of uo_grid : (string as_keys, string as_value)
// The value is already written ; the address says which one
choose case as_keys
    case "title"
        of_set_report_title(as_value)
    case "page/landscape"
        of_set_landscape(as_value = "true")
end choose

Une adresse par propriété #

Une propriété se désigne par son adresse : sa seule clé au premier niveau ("title"), la catégorie puis la propriété jointes par / sous une catégorie ("page/margin"). Une propriété dépliable (TYPE_GROUP) contient à son tour des propriétés, ajoutées à son adresse : "appearance/font/size" dans le groupe font de la catégorie appearance, "margin/left" dans un groupe du haut — et un groupe peut en contenir un autre. Ce qui contient une propriété est donc une catégorie (un seul niveau) ou un groupe. Une catégorie se désigne par sa clé seule. Au premier niveau, une clé ne nomme qu'une chose : une catégorie et une propriété du haut ne peuvent pas la partager. Les events portent la même adresse, celle que vous avez écrite.

// A category by its key, a property by its address
uo_grid.of_category(/*key*/ "page").ib_collapsed = true
uo_grid.of_property(/*keys*/ "page/margin").is_value = "15"

// A property held by a group : the address goes through the group
uo_grid.of_property(/*keys*/ "appearance/font/size").is_value = "11"

Les types de valeur #

Le type se choisit une fois, à of_add_property, et donne l'éditeur de la ligne. La valeur, elle, est toujours du texte — donnée, lue, rendue par les events — écrit de la même manière quelle que soit la langue du poste.

ConstanteÉditeurLa valeur, en texte
TYPE_STRINGZone de texteLe texte tel quel
TYPE_NUMBERZone de texte qui n'accepte qu'un nombre, lu dans la langue d'affichage : son séparateur décimal ou un point, son groupement des milliers quand il est bien formé (1,000 vaut mille en anglais, 1.500 mille cinq cents en allemand, 1 234,5 en français) ; une saisie ambiguë (1,5 en anglais, 1 2) ou qui n'est pas un nombre est refusée : le texte tapé reste, encadré de rouge, et le volet d'aide dit pourquoi (Échap y renonce). is_min, is_max et id_step bornent la saisie et règlent Haut / BasAvec un point : "12.5" ; "" = vide. Gardée chiffre pour chiffre ("1.50" reste "1.50") ; un texte qui n'est pas un nombre est refusé
TYPE_BOOLEANCase à cocher"true" · "false"
TYPE_ENUMListe de choix aux couleurs du thème ; ses options s'ajoutent une par une (of_add_option), leur texte en clair, sans balisageLa valeur de l'option choisie, jamais son texte
TYPE_COLORPastille de la couleur et sélecteur de couleur ; la cellule affiche r, v, b. Au-delà de 16777215, une couleur système de PowerBuilder (67108864 Button Face, 553648127 Transparent, 1073741824 Window Background…) s'affiche par son nom, avec une pastille neutre, et le sélecteur s'ouvre sans couleur couranteLe long RGB écrit en texte : String(RGB(255, 0, 0)) = "255"
TYPE_DATECalendrier ; la cellule affiche la date au format de la langue d'affichage"yyyy-mm-dd" : String(Today(), "yyyy-mm-dd")
TYPE_PASSWORDZone de texte masquéeLe texte en clair, jamais affiché ni trouvé par la recherche (même {x:raw} d'un résumé reste masqué)
TYPE_GROUPAucun : une propriété dépliable (une police, une marge), avec un chevron au début de son libellé ; elle contient les propriétés ajoutées à son adresse et se déplie par ib_expanded, son chevron, un double-clic sur son libellé ou le clavier. Fermée quand elle est ajoutéeAucune à donner ("", toute autre est refusée) ; lue, son résumé : celui qu'écrit is_summary, sinon les valeurs affichées de ce qu'elle contient, masquées sautées, jointes par ; ("Segoe UI; 9; True") ; écrite, ignorée

Une valeur que son type ne peut pas tenir est refusée — à of_add_property (-5) comme par is_value ou is_default (l'ancienne reste) — et of_get_last_error dit pourquoi : un nombre qui n'en est pas un, un booléen autre que true / false / 1 / 0, une date qui n'est pas un vrai yyyy-mm-dd, une couleur qui n'est pas un entier à partir de -1, un TYPE_STRING ou un TYPE_PASSWORD sur plusieurs lignes (le champ de la grille tient une ligne). "" (pas de valeur) est toujours accepté. Une valeur de liste qu'aucune option n'offre est acceptée, et montrée telle quelle : une liste peut être chargée après sa valeur. La couleur -1 — celle que donne le thème, la convention de toute la bibliothèque — s'affiche « (par défaut) » ; une couleur système et les true / false d'un résumé s'écrivent dans la langue d'affichage.


Propriétés #

PropriétéTypeDéfautRôle
is_sortstring"categorized"La vue : SORT_CATEGORIZED (les propriétés du haut, puis chaque catégorie sous un en-tête qui se replie) ou SORT_ALPHABETICAL (une seule liste triée par libellé tel qu'il s'affiche, sans son balisage, et sans en-têtes ; un groupe garde ce qu'il contient sous lui). Les deux boutons de la barre d'outils la changent aussi : lue en direct. Passer en alphabétique quand un en-tête est sélectionné vide la sélection
ib_toolbarbooleantrueLa barre d'outils : les deux vues et la zone de recherche. false la masque ; is_sort et is_filter restent pilotables par le code
ib_helpbooleantrueLe volet d'aide, en bas : le libellé et la description (is_description) de la propriété sélectionnée, le titre d'une catégorie sélectionnée
ii_label_widthinteger40Part de la largeur donnée aux libellés, en pour cent, de 15 à 85. L'utilisateur fait glisser la ligne entre libellés et valeurs : lue en direct
is_filterstring""La recherche : ne restent que les propriétés dont le libellé, la clé ou la valeur affichée contient ce texte, sans tenir compte de la casse ; pendant une recherche, chaque catégorie et chaque groupe qui contiennent une réponse s'affichent ouverts, sans perdre leur pli. Le libellé se lit tel qu'il s'affiche, sans son balisage ; ni le titre d'une catégorie ni l'adresse complète ne sont cherchés. Pendant une recherche, un pli de l'utilisateur ne fait rien ; un pli de votre code (ib_collapsed, ib_expanded, of_expand_all, of_collapse_all) est enregistré, lève son événement et se voit dès que la recherche se vide ; une ligne sélectionnée que la recherche cache quitte la sélection (ue_selection_changed avec une adresse vide). La zone de recherche l'écrit aussi (Échap l'efface) : lue en direct. "" montre tout
ib_veto_changesbooleanfalseOpt-in : demander avant d'écrire une valeur de l'utilisateur (déclenche ue_value_changing, qui peut refuser : la cellule reprend l'ancienne valeur). Une valeur écrite par votre code ne pose jamais la question
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)
is_tooltipstring""Info-bulle simple affichée au survol du composant
is_super_tooltip_titlestring""Titre de l'info-bulle enrichie (prend le pas sur is_tooltip)
is_super_tooltip_textstring""Texte de l'info-bulle enrichie (balisage riche accepté)
is_super_tooltip_imagestring""Image de l'info-bulle enrichie

Propriétés d'une catégorie — n_pbt_propertygrid_category #

PropriétéTypeDéfautRôle
is_titlestring""Titre de l'en-tête. Accepte le balisage riche. Vide, l'en-tête montre la clé
ib_collapsedbooleanfalsetrue replie la catégorie : son en-tête reste, ses propriétés se cachent (une sélection qui y était remonte sur l'en-tête). ue_category_toggled suit, comme pour un clic sur l'en-tête. Pendant une recherche, chaque catégorie s'affiche ouverte : un clic sur l'en-tête ne fait rien, et true posé par le code est enregistré (l'événement suit, la lecture le rend) et se voit dès que la recherche se vide. Lu en direct
ib_visiblebooleantruefalse retire la catégorie, et tout ce qu'elle contient, de la grille ; elle garde sa clé et ses valeurs, que of_values rend toujours
is_tooltipstring""Info-bulle simple affichée au survol de l'item
is_super_tooltip_titlestring""Titre de l'info-bulle enrichie de l'item (prend le pas sur is_tooltip)
is_super_tooltip_textstring""Texte de l'info-bulle enrichie de l'item (balisage riche accepté)
is_super_tooltip_imagestring""Image de l'info-bulle enrichie de l'item
il_accentlong-1Accent de l'en-tête de la catégorie : sa sélection le prend (-1 = celui du composant). Pour la colorer tout entière, il_back_color / il_text_color
il_back_colorlong-1Fond de l'en-tête de la catégorie, en RGB(r,v,b) (-1 = ce que donne le thème)
il_text_colorlong-1Couleur du texte de l'en-tête de la catégorie (-1 = ce que donne le thème)
il_back_color_hoverlong-1Fond de l'en-tête de la catégorie sous le pointeur (-1 = ce que donne le thème)
il_text_color_hoverlong-1Couleur du texte de l'en-tête de la catégorie sous le pointeur (-1 = ce que donne le thème)

Propriétés d'une propriété — n_pbt_propertygrid_property #

PropriétéTypeDéfautRôle
is_valuestringcelui d'of_add_propertyLa valeur, en texte (voir Les types de valeur) ; pour une liste, la valeur de l'option. L'écrire ne lève rien, comme SetItem ; la lire rend la valeur courante, qui que ce soit qui l'ait écrite. Une valeur que son type ne peut pas tenir (un TYPE_NUMBER qui reçoit un texte qui n'est pas un nombre) est refusée : l'ancienne valeur reste, et of_get_last_error de la grille dit pourquoi. Sur un groupe (TYPE_GROUP), la lecture rend son résumé (voir is_summary), et l'écriture est ignorée
is_labelstringcelui d'of_add_propertyLe nom affiché dans la colonne de gauche ; accepte le balisage riche. Vide, la ligne montre la clé, telle quelle (jamais lue comme du balisage). La vue alphabétique le trie, et la recherche le lit, tel qu'il s'affiche : sans son balisage
is_descriptionstring""Le texte du volet d'aide pendant que la propriété est sélectionnée ; accepte le balisage riche
ib_readonlybooleanfalseMontrée, pas modifiable : la valeur s'affiche en gris et aucun éditeur ne s'ouvre, ni au clic, ni au clavier, ni au double-clic. Un groupe en lecture seule rend tout ce qu'il contient en lecture seule. Le bouton … (ib_ellipsis) reste actif : lisez ib_readonly dans ue_ellipsis_clicked pour ouvrir votre boîte en lecture seule
ib_visiblebooleantruefalse retire la ligne de la grille ; la propriété garde son adresse et sa valeur (of_values la rend toujours). Masquer un groupe masque ce qu'il contient ; masquer la propriété sélectionnée vide la sélection
ib_ellipsisbooleanfalseUn bouton … en fin de ligne : un clic — ou Ctrl+Entrée sur la ligne sélectionnée — sélectionne la ligne et lève ue_ellipsis_clicked, même sur une propriété en lecture seule, pour une boîte de dialogue à vous (un fichier, une police, une liste tirée de la base)
ib_expandedbooleanfalsePour une propriété dépliable (TYPE_GROUP) : true montre ce qu'elle contient, en retrait sous elle ; false le cache (une sélection qui y était remonte sur le groupe). ue_property_toggled suit, comme pour un clic sur son chevron. Pendant une recherche, un groupe qui contient une réponse s'affiche ouvert : son chevron ne fait rien, et une valeur posée par le code est enregistrée (l'événement suit) et se voit dès que la recherche se vide. Lu en direct ; sans effet sur les autres types
is_summarystring""Pour une propriété dépliable (TYPE_GROUP) : comment s'écrit son résumé, un gabarit. {size} est la valeur affichée de sa sous-propriété size, {size:raw} sa valeur telle que gardée (un mot de passe reste masqué), {?bold}…{/bold} un morceau gardé seulement quand bold est actif (un booléen vrai, une valeur ni vide, ni false, ni 0), {!bold}…{/bold} seulement quand il ne l'est pas, {{ }} des accolades ; une clé inconnue ne donne rien. "{name}, {size} pt{?bold}, bold{/bold}" affiche Segoe UI, 10 pt, bold. Vide (par défaut) : les valeurs affichées, masquées sautées, jointes par ; . Le résumé est du texte simple ; il suit chaque changement de ce que le groupe contient ; is_value du groupe le rend
is_maskstring""Pour un TYPE_NUMBER : son masque de saisie, un masque numérique dans la syntaxe de PowerBuilder (EditMask, format DataWindow) : # un chiffre facultatif, 0 un chiffre obligatoire, , le groupement, . le séparateur décimal, % le nombre affiché multiplié par 100, des littéraux ($, un texte entre guillemets, \x) et des sections positif;négatif ("$#,##0;($#,##0)"). La virgule et le point désignent les séparateurs de la langue d'affichage. Pendant la frappe, le groupement apparaît au fil des chiffres, les décimales sont limitées au masque, les lettres sont refusées, le curseur garde sa place parmi les chiffres et un nombre collé est lu dans la langue d'affichage ; en quittant le champ, le masque complète (12 devient 12,00). La valeur garde le nombre tel que le code l'écrit ("1234.5"), sans groupement ni symbole. Vide (par défaut) : le champ tape son is_format dépouillé de ses littéraux ($#,##0.00 se tape #,##0.00, #,##0 "px" se tape #,##0 ; un % reste, c'est une échelle), sinon le nombre tel quel ; sans effet sur les autres types
is_formatstring""Pour un TYPE_NUMBER : son masque d'affichage, la façon dont la cellule affiche le nombre quand son champ n'a pas le clavier — même syntaxe que is_mask, avec ses littéraux : #,##0 "px" affiche 575 px, $#,##0.00 un prix, 0.0% un taux (0,125 affiche 12,5%). Le résumé d'un groupe et la recherche le lisent aussi. Quand le champ prend le clavier, son texte devient celui de is_mask (575), le curseur gardant sa place parmi les chiffres ; en le quittant, le texte d'affichage revient. La bascule ne change jamais la valeur et ne lève rien : ue_value_changed ne rapporte que ce que l'utilisateur a tapé, le nombre nu. Vide (par défaut) : la cellule affiche son is_mask ; sans effet sur les autres types
is_defaultstring""La valeur par défaut, en texte comme is_value. Tant que la valeur en diffère, elle s'écrit en gras et le volet d'aide montre le défaut ; l'utilisateur la rétablit par Suppr sur la ligne sélectionnée ou par le bouton Réinitialiser (↺) de la barre d'outils, montré seulement quand une propriété au moins a un défaut — un geste de l'utilisateur : ue_value_changing si le veto est actif, puis ue_value_changed. Une valeur que son type ne tient pas est refusée. Écrire "" retire le défaut : plus de gras, plus de défaut au volet d'aide, "" relu. Sans défaut, Suppr vide la valeur (un booléen reste tel quel)
is_errorstring""Une erreur de votre application ("Ce nom existe déjà") : la valeur s'encadre de rouge, le volet d'aide la dit en toutes lettres, une info-bulle aussi, et un lecteur d'écran l'annonce. Elle part quand l'utilisateur modifie la propriété, ou quand vous écrivez "". Posée dans ue_value_changing avant de refuser, elle explique le refus. Lue, l'erreur que la propriété montre : la vôtre, sinon celle de la grille quand un nombre tapé est refusé (pas un nombre, hors de is_min / is_max) — le texte tapé reste alors à l'écran pour être corrigé, Échap y renonce
is_minstring""Pour un TYPE_NUMBER : la plus petite valeur que l'utilisateur peut donner, en nombre écrit comme le code ("0", "12.5") ; "" = pas de borne. Un nombre tapé en dessous est refusé, reste à l'écran et le volet d'aide dit pourquoi ; Bas s'y arrête. Votre code peut toujours écrire n'importe quelle valeur. Un texte qui n'est pas un nombre est refusé (of_get_last_error), comme une borne qui croise l'autre (is_min au-dessus d'is_max). Ignorée par les autres types
is_maxstring""Pour un TYPE_NUMBER : la plus grande valeur que l'utilisateur peut donner ; "" = pas de borne. Mêmes règles qu'is_min ; Haut s'y arrête
id_stepdouble1Pour un TYPE_NUMBER : ce que Haut et Bas ajoutent ou retirent pendant que son champ a le clavier, dans is_min / is_max. Chaque pas est une valeur de l'utilisateur (ue_value_changed, demandée d'abord si le veto est actif). 0 ou moins vaut 1. Ignoré par les autres types
of_is_dirty ( ) → boolean——TRUE quand la valeur diffère de sa référence (voir of_is_dirty de la grille)
of_type ( ) → string——Le type donné à of_add_property (une constante TYPE_*). Lecture seule : un type se choisit une fois
is_tooltipstring""Info-bulle simple affichée au survol de l'item
is_super_tooltip_titlestring""Titre de l'info-bulle enrichie de l'item (prend le pas sur is_tooltip)
is_super_tooltip_textstring""Texte de l'info-bulle enrichie de l'item (balisage riche accepté)
is_super_tooltip_imagestring""Image de l'info-bulle enrichie de l'item
il_accentlong-1Accent de la ligne de la propriété : sa sélection et le cadre de son éditeur le prennent (-1 = celui du composant). Pour la colorer tout entière, il_back_color / il_text_color
il_back_colorlong-1Fond de la ligne de la propriété, en RGB(r,v,b) (-1 = ce que donne le thème)
il_text_colorlong-1Couleur du texte de la ligne de la propriété (-1 = ce que donne le thème)
il_back_color_hoverlong-1Fond du libellé de la propriété quand le pointeur est sur sa ligne (-1 = ce que donne le thème)
il_text_color_hoverlong-1Couleur du libellé de la propriété quand le pointeur est sur sa ligne (-1 = ce que donne le thème)

Méthodes #

Sur le composant #

MéthodeRôle
of_add_category (string as_key, string as_title) → longAjoute une catégorie à la fin : un en-tête qui se replie, sous lequel s'ajoutent ensuite les propriétés "clé/nom". Un titre vide montre la clé. Rend 0 une fois ajoutée, -5 pour une clé vide, qui contient / ou `, ou déjà prise par une catégorie ou une propriété du haut, -2` si le composant n'est pas créé
of_add_property (string as_keys, string as_label, string as_type, string as_value) → longAjoute une propriété à son adresse, à la fin de ce qui la contient : sa catégorie, son groupe ("appearance/font/size", "margin/left") ou les propriétés du haut. as_type est une constante TYPE_*, as_value sa valeur en texte ("" pour un TYPE_GROUP, qui n'en a pas). Rend 0 une fois ajoutée, -5 pour une adresse déjà prise, un parent qui n'est ni une catégorie ni un groupe (ou pas encore ajouté), un niveau vide ("layout/", "a//b"), une clé qui contient `, un type inconnu, une valeur TYPE_NUMBER qui n'est pas un nombre tel que le code l'écrit (un point pour les décimales, signe et exposant facultatifs, "" admis), un booléen, une date ou une couleur qui n'en est pas un, un texte ou un mot de passe sur plusieurs lignes (of_get_last_error dit pourquoi) ou une valeur donnée à un TYPE_GROUP, -2` si le composant n'est pas créé
of_add_option (string as_keys, string as_value, string as_text) → longAjoute une option, à la fin, à la liste d'une propriété TYPE_ENUM : as_value est ce que la propriété contient (et ce que donne ue_value_changed), as_text ce que la liste montre, en texte simple sans balisage ("" montre la valeur). Rend 0 une fois ajoutée, -5 pour une adresse qui n'est pas une propriété liste, une valeur que cette propriété offre déjà, ou une valeur qui contient ` ou / (of_keys_at nomme une option par l'adresse de la propriété suivie de sa valeur : un seul niveau), -2` si le composant n'est pas créé
of_remove_option (string as_keys, string as_value) → longRetire une option de la liste d'une propriété TYPE_ENUM, par sa valeur. La valeur que contient la propriété reste telle quelle, même si c'était cette option. Rend 0 une fois retirée, -5 pour une adresse qui n'est pas une propriété liste, ou une valeur que sa liste n'offre pas, -2 si le composant n'est pas créé
of_clear_options (string as_keys) → longRetire toutes les options d'une propriété TYPE_ENUM, pour charger une autre liste sans perdre la propriété, son handle, sa sélection ni ses drapeaux. La valeur qu'elle contient reste telle quelle : écrivez la nouvelle dans is_value. Rend 0 une fois vidée, -5 pour une adresse qui n'est pas une propriété liste, -2 si le composant n'est pas créé
of_category (string as_key) → n_pbt_propertygrid_categoryHandle d'une catégorie, par sa clé (créé au premier accès) : son titre, son pli, sa visibilité et ses couleurs se posent par lui
of_property (string as_keys) → n_pbt_propertygrid_propertyHandle d'une propriété, par son adresse (créé au premier accès) : sa valeur, son libellé, sa description, ses drapeaux et ses couleurs se posent et se lisent par lui. Une adresse que cette grille n'a pas ajoutée (une faute de frappe) rend un handle qui n'est pas gardé : y écrire ne fait rien, et of_get_last_error dit pourquoi
of_remove_property (string as_keys) → longRetire une propriété, et son handle avec elle ; un groupe part avec tout ce qu'il contient. Si elle était sélectionnée, ue_selection_changed annonce qu'il n'y a plus de sélection. Rend 0 une fois retirée, -5 pour une adresse que cette grille n'a jamais ajoutée, -2 si le composant n'est pas créé
of_remove_category (string as_key) → longRetire une catégorie et toutes ses propriétés, avec leurs handles. Si la sélection y était, ue_selection_changed annonce qu'il n'y en a plus. Rend 0 une fois retirée, -5 pour une clé que cette grille n'a jamais ajoutée comme catégorie, -2 si le composant n'est pas créé
of_clear ( ) → longVide la grille : catégories, propriétés, options et handles. La vue, la barre d'outils, le volet d'aide et la recherche restent tels quels (c'est of_reset qui remet chaque propriété du composant). Si une ligne était sélectionnée, ue_selection_changed suit avec une adresse vide. Rend 0 une fois vidée, -2 si le composant n'est pas créé
of_select_property (string as_keys) → longSélectionne une ligne, comme un clic : une propriété ("page/margin") ou l'en-tête d'une catégorie ("page"). Ce qui contient la propriété s'ouvre d'abord : sa catégorie repliée, ses groupes fermés (ue_category_toggled, ue_property_toggled) — seulement si la ligne sera alors affichée : un appel refusé n'ouvre rien. ue_selection_changed suit, comme pour un clic. Rend 0 une fois sélectionnée (ou si elle l'était déjà), -5 pour une adresse que cette grille n'a jamais ajoutée ou une ligne qui n'est pas affichée (masquée, hors de la recherche, au-delà du plafond de démonstration, un en-tête dans la vue alphabétique), -2 si le composant n'est pas créé
of_clear_selection ( ) → longNe laisse aucune ligne sélectionnée ; ue_selection_changed suit avec une adresse vide. Rien de sélectionné déjà : rien n'est levé. Rend 0 une fois appliqué, -2 si le composant n'est pas créé
of_selected_key ( ) → stringAdresse de la ligne sélectionnée, lue en direct, quel que soit celui qui l'a posée : "page/margin", "page" pour un en-tête, "" si aucune. C'est exactement ce que ue_selection_changed vous remet
of_expand_all ( ) → longDéplie toutes les catégories et ouvre tous les groupes ; ue_category_toggled suit pour chaque catégorie qui était repliée, ue_property_toggled pour chaque groupe qui était fermé. Rend 0 une fois appliqué, -2 si le composant n'est pas créé
of_collapse_all ( ) → longReplie toutes les catégories et ferme tous les groupes ; ue_category_toggled et ue_property_toggled suivent pour chacun qui change. Rend 0 une fois appliqué, -2 si le composant n'est pas créé
of_dirty_keys (ref string as_keys[]) → longRemplit as_keys[] des adresses des propriétés qui diffèrent de leur référence, dans l'ordre de la vue par catégorie, et rend leur nombre (0 = rien à enregistrer) ; ce que l'utilisateur tape encore est validé d'abord
of_is_dirty ( ) → booleanTRUE quand au moins une propriété diffère de sa référence : la valeur avec laquelle elle a été ajoutée, ou ce qu'of_load ou of_reset_update en ont fait — que l'utilisateur ou votre code l'ait changée. Le même nom que sur le form. À ne pas confondre avec is_default, la valeur montrée en gras : celle-ci dit ce qu'il y a à enregistrer. Ce que l'utilisateur tape encore est validé d'abord, comme pour of_values
of_load (string as_json) → longCharge des valeurs d'un coup : un objet JSON par adresse, la forme que rend of_values — les propriétés du haut, un objet par catégorie et par groupe ({"name":"Orders","layout":{"width":800}}) — ou des clés "layout/width". Les valeurs sont écrites en silence (aucun ue_value_changed) et deviennent la référence d'of_is_dirty ; les erreurs affichées partent. Une propriété que l'objet ne nomme pas garde sa valeur, un nombre est lu chiffre pour chiffre. Une valeur que la grille ne peut pas prendre (aucune propriété à cette adresse, une valeur que son type ne tient pas) est sautée : le reste est écrit, et of_get_last_error nomme les adresses sautées. Ce que l'utilisateur tapait est abandonné. Rend 0 une fois appliqué (même avec des valeurs sautées), -5 pour un texte qui n'est pas un objet JSON, -2 si le composant n'est pas créé
of_reset_update ( ) → longLes valeurs en place deviennent la référence : of_is_dirty répond de nouveau FALSE. À appeler une fois vos réglages enregistrés, comme ResetUpdate d'un DataWindow. Rend 0 une fois appliqué, -2 si le composant n'est pas créé
of_revert ( ) → longRemet chaque propriété à sa valeur de référence, en silence (aucun event, comme une valeur écrite par le code), et retire les erreurs affichées ; ce que l'utilisateur tapait est abandonné (rien n'est levé après) : le bouton Annuler de votre fenêtre de réglages. Rend 0 une fois appliqué, -2 si le composant n'est pas créé
of_clear_errors ( ) → longRetire toutes les erreurs de votre application (is_error de chaque propriété). Un nombre tapé que la grille a refusé reste : l'utilisateur doit le corriger. Rend 0 une fois appliqué, -2 si le composant n'est pas créé
of_focus_property (string as_keys) → longMet le clavier sur une propriété, comme un clic sur sa valeur : ce qui la contient s'ouvre d'abord (ue_category_toggled, ue_property_toggled), elle est sélectionnée (ue_selection_changed) et son éditeur prend le clavier ; un groupe ou une propriété en lecture seule : la grille. Rend 0, -5 pour une adresse que cette grille n'a jamais ajoutée ou une ligne qui ne peut pas être affichée (masquée, hors de la recherche, au-delà du plafond de démonstration), -2 si le composant n'est pas créé
of_invalid_keys (ref string as_keys[]) → longRemplit as_keys[] des adresses des propriétés en erreur, dans l'ordre de la vue par catégorie, et rend leur nombre (0 = la grille est valide) ; ce que l'utilisateur tape encore est validé d'abord
of_is_valid ( ) → booleanTRUE quand aucune propriété affichée ne porte d'erreur : ni la vôtre (is_error), ni celle de la grille (un nombre tapé refusé : pas un nombre, hors de is_min / is_max). Ce que l'utilisateur tape encore est validé d'abord : un texte refusé compte. Le même nom que sur le form
of_validate ( ) → longMet le clavier sur la première propriété en erreur — sa catégorie et ses groupes s'ouvrent, elle est sélectionnée et son éditeur prend le clavier : ce qu'appelle votre bouton OK avant d'enregistrer. Ce que l'utilisateur tape encore est validé d'abord. Rend le nombre de propriétés en erreur (0 = la grille est valide, rien ne bouge), -2 si le composant n'est pas créé
of_values ( ) → stringToutes les valeurs d'un coup, lues en direct — ce que l'utilisateur tape encore est d'abord validé, comme par AcceptText (ue_value_changing si le veto est actif, puis ue_value_changed) —, en un objet JSON : les propriétés du haut, puis chaque catégorie comme un objet à elle, chaque groupe comme un objet dans ce qui le contient — masquées comprises. Typées : un nombre est un nombre, écrit chiffre pour chiffre (un décimal de 21 chiffres reste exact), un booléen un booléen, une couleur son long RGB, le reste du texte. Se lit avec n_pbt_json, par la même adresse : lnv_json.of_get_number("page/margin"), lnv_json.of_get_number("appearance/font/size")
of_reset ( ) → longVide la grille (of_clear) puis ramène chaque propriété du composant à sa valeur par défaut : vue par catégorie, barre d'outils et volet d'aide visibles, libellés à 40 %, recherche vide, question désactivée. Rend 0 une fois appliqué, -2 si le composant n'est pas créé

Sur une catégorie et sur une propriété #

Une catégorie contient des propriétés ; un groupe (TYPE_GROUP) contient ses sous-propriétés ; une propriété liste (TYPE_ENUM) contient ses options, désignées par leur valeur. Les trois méthodes les parcourent.

MéthodeRôle
of_count ( ) → longNombre de propriétés de la catégorie, masquées comprises ; nombre de sous-propriétés d'un groupe ; nombre d'options d'une propriété liste (0 pour les autres types)
of_keys_at (long al_index) → stringAdresse de la propriété de rang al_index (à partir de 1) — "page/margin", "appearance/font/size" sur un groupe, réinjectable telle quelle dans of_property ; sur une propriété liste, l'adresse suivie de la valeur de l'option. "" hors bornes
of_has (string as_key) → booleanLa catégorie ou le groupe contient-il cette propriété ? La propriété liste offre-t-elle cette valeur ?

Événements #

ÉvénementDéclenché quand
ue_value_changed (string as_keys, string as_value)L'utilisateur a changé une valeur (saisie validée par Entrée ou en quittant la cellule, case cochée au clic, à Espace ou à Entrée / F2, choix dans une liste, couleur, date, double-clic sur un libellé). as_keys est l'adresse de la propriété, as_value sa nouvelle valeur en texte ; elle est déjà écrite. Une valeur écrite par votre code (is_value) ne lève rien, comme SetItem : votre code sait ce qu'il a écrit. Suppr ou le bouton Réinitialiser (retour au défaut) et Haut / Bas dans un nombre sont des gestes de l'utilisateur : ils le lèvent aussi
ue_value_changing (string as_keys, string as_value) → booleanAnnulable, posé avant qu'une valeur de l'utilisateur ne soit écrite, et seulement quand ib_veto_changes = true (désactivé par défaut). Renvoyer FALSE refuse : la cellule reprend l'ancienne valeur, que of_property(as_keys).is_value rend encore pendant l'événement. Renvoyez TRUE pour accepter. Posez of_property(as_keys).is_error avant de refuser : l'utilisateur lit pourquoi
ue_selection_changed (string as_from_keys, string as_keys)La sélection a bougé : un clic, le clavier, ou votre code (of_select_property, of_clear_selection — un ordre la lève aussi, comme SelectItem), ou la ligne sélectionnée est partie : repliée dans sa catégorie ou son groupe (as_keys est alors cet en-tête ou ce groupe), retirée, ou plus dessinée — masquée, cachée par la recherche (même par un pli fait pendant elle), au-delà du plafond de démonstration (as_keys vaut alors ""). Une ligne est une propriété ("page/margin") ou l'en-tête d'une catégorie ("page") ; as_from_keys est celle qui a été quittée
ue_category_toggled (string as_key, boolean ab_collapsed)Une catégorie s'est repliée (ab_collapsed = TRUE) ou dépliée : un clic sur son en-tête, le clavier, son ib_collapsed posé par votre code, of_expand_all, of_collapse_all, ou of_select_property sur une propriété qu'elle contient
ue_property_toggled (string as_keys, boolean ab_expanded)Une propriété dépliable (TYPE_GROUP) s'est ouverte (ab_expanded = TRUE) ou fermée : un clic sur son chevron, un double-clic sur son libellé, le clavier, son ib_expanded posé par votre code, of_expand_all, of_collapse_all, ou of_select_property sur ce qu'elle contient. as_keys est l'adresse du groupe
ue_ellipsis_clicked (string as_keys)Le bouton … d'une propriété (ib_ellipsis) a été cliqué, ou Ctrl+Entrée a été pressé sur sa ligne : ouvrez votre boîte de dialogue, puis écrivez le résultat dans of_property(as_keys).is_value. Le bouton reste actif sur une propriété en lecture seule : of_property(as_keys).ib_readonly dit s'il faut ouvrir votre boîte en lecture seule
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)

Clavier et souris #

GesteEffet
Flèches haut / bas, Début / Fin, Page préc. / Page suiv.Déplacent la sélection d'une ligne à l'autre ; Page préc. / Page suiv. avancent d'une hauteur de liste
Flèches gauche / droiteSur un en-tête, replient ou déplient la catégorie ; sur un groupe, Droite l'ouvre et Gauche le ferme ; Droite sur un en-tête ou un groupe déjà ouvert descend sur sa première ligne ; sur une propriété, Gauche remonte à ce qui la contient, son groupe ou son en-tête (inversées de droite à gauche). Pendant une recherche, plier ou déplier ne fait rien, au clavier comme à la souris
Entrée, F2Entrent dans l'éditeur de la propriété (ouvrent la liste, le sélecteur de couleur ou le calendrier) ; un booléen bascule ; sur un en-tête ou un groupe, replient ou déplient. Sans rien à faire (aucune ligne, une propriété en lecture seule), la touche est laissée à la fenêtre : son bouton par défaut
EspaceCoche ou décoche un booléen ; sur un en-tête ou un groupe, replie ou déplie
Entrée / Échap dans un éditeurValide la saisie / rend l'ancienne valeur ; le clavier revient à la liste. Échap dans un champ non modifié est laissé à la fenêtre : son bouton Annuler
Ctrl+EntréeLe bouton … de la ligne sélectionnée (ue_ellipsis_clicked)
TabLa liste des propriétés est un seul arrêt de tabulation, quelle que soit sa taille : parmi les éditeurs, seuls ceux de la ligne sélectionnée prennent Tab ; la liste qui a le clavier sans ligne sélectionnée se montre par un contour
Double-clic sur un libelléUn booléen bascule, une liste passe au choix suivant, un groupe s'ouvre ou se ferme
SupprSur la ligne sélectionnée : rétablit la valeur par défaut (is_default) ou, sans défaut, vide la valeur — un texte, un nombre, une date, une couleur, une liste ; un booléen sans défaut reste. Le bouton Réinitialiser (↺) de la barre d'outils rétablit le défaut lui aussi. Un geste de l'utilisateur : ue_value_changed
Retour arrière, une touche de caractèreSur la ligne sélectionnée d'un texte, d'un nombre ou d'un mot de passe : commencent la saisie — Retour arrière ouvre l'éditeur, le texte gardé et le curseur à sa fin (il ne vide plus la valeur) ; une touche de caractère ouvre l'éditeur avec ce caractère, comme dans la fenêtre des propriétés de Visual Studio. Sur une liste, une couleur, une date ou une case : rien
F4, Alt+BasOuvrent la liste, le sélecteur de couleur ou le calendrier de la ligne sélectionnée, depuis la liste comme depuis son bouton, comme une liste déroulante de Windows
Haut / Bas dans un nombreAjoutent / retirent id_step, dans is_min / is_max ; chaque pas lève ue_value_changed
Séparateur : Gauche / Droite, Début / FinLa ligne entre libellés et valeurs prend le clavier (Tab) : Gauche / Droite la déplacent de 5 % (inversées de droite à gauche), Début / Fin la mènent aux bouts (ii_label_width)
Glisser la ligne entre libellés et valeursChange ii_label_width
Zone de recherche : Échap / Flèche bas ou EntréeEfface la recherche / passe dans la liste, sur la première ligne si aucune n'est sélectionnée

Exemples #

Les réglages d'une fenêtre #

// The whole grid in one paint
uo_grid.of_set_redraw(/*on*/ false)

// At the top, without a category : the name of the window
uo_grid.of_add_property(/*keys*/ "name", /*label*/ "Name", /*type*/ u_pbt_propertygrid.TYPE_STRING, /*value*/ "Customers")

// A value given by the application : shown, not editable
uo_grid.of_add_category(/*key*/ "identity", /*title*/ "Identity")
uo_grid.of_add_property(/*keys*/ "identity/id", /*label*/ "Id", /*type*/ u_pbt_propertygrid.TYPE_STRING, /*value*/ "W-0042")
uo_grid.of_property(/*keys*/ "identity/id").ib_readonly = true
uo_grid.of_add_property(/*keys*/ "identity/created", /*label*/ "Created on", /*type*/ u_pbt_propertygrid.TYPE_DATE, /*value*/ String(Today(), "yyyy-mm-dd"))

// A number, a check box and a list of choices
uo_grid.of_add_category(/*key*/ "layout", /*title*/ "Layout")
uo_grid.of_add_property(/*keys*/ "layout/width", /*label*/ "Width", /*type*/ u_pbt_propertygrid.TYPE_NUMBER, /*value*/ "1200")
uo_grid.of_add_property(/*keys*/ "layout/resizable", /*label*/ "Resizable", /*type*/ u_pbt_propertygrid.TYPE_BOOLEAN, /*value*/ "true")
uo_grid.of_add_property(/*keys*/ "layout/state", /*label*/ "Window state", /*type*/ u_pbt_propertygrid.TYPE_ENUM, /*value*/ "normal")
uo_grid.of_add_option(/*keys*/ "layout/state", /*value*/ "normal", /*text*/ "Normal")
uo_grid.of_add_option(/*keys*/ "layout/state", /*value*/ "maximized", /*text*/ "Maximized")

// A colour, as its RGB long written out
uo_grid.of_add_category(/*key*/ "appearance", /*title*/ "Appearance")
uo_grid.of_add_property(/*keys*/ "appearance/back_color", /*label*/ "Back colour", /*type*/ u_pbt_propertygrid.TYPE_COLOR, /*value*/ String(RGB(/*red*/ 240, /*green*/ 244, /*blue*/ 250)))

// One single paint, then the first value to edit
uo_grid.of_set_redraw(/*on*/ true)
uo_grid.of_select_property(/*keys*/ "layout/width")

Un inspecteur qui applique chaque changement #

// event ue_value_changed of uo_grid : (string as_keys, string as_value)
// The address says which setting of the window the user changed
choose case as_keys
    case "name"
        w_customers.title = as_value
    case "layout/width"
        w_customers.width = Long(as_value)
    case "layout/resizable"
        w_customers.resizable = (as_value = "true")
    case "appearance/back_color"
        w_customers.backcolor = Long(as_value)
end choose

Le bouton … : une boîte de dialogue à vous #

// The icon : typed by hand, or chosen through the "..." button
uo_grid.of_add_property(/*keys*/ "appearance/icon", /*label*/ "Icon", /*type*/ u_pbt_propertygrid.TYPE_STRING, /*value*/ "img\customers.png")
uo_grid.of_property(/*keys*/ "appearance/icon").ib_ellipsis = true
// event ue_ellipsis_clicked of uo_grid : (string as_keys)
// Local variables
string ls_path, ls_file
constant unsignedlong OFN_EXPLORER = 2
constant unsignedlong OFN_NOCHANGEDIR = 64

// The application opens its own dialog - in the Explorer style, without moving the current folder of the application - then writes the result (this raises nothing)
if GetFileOpenName("Icon", ls_path, ls_file, "png", "Pictures (*.png),*.png", /*initdir*/ "", OFN_EXPLORER + OFN_NOCHANGEDIR) = 1 then
    uo_grid.of_property(/*keys*/ as_keys).is_value = ls_path
end if

Valider avant d'écrire #

// The question is OFF by default : turn it on to be able to refuse a value
uo_grid.ib_veto_changes = true
// event ue_value_changing of uo_grid : (string as_keys, string as_value)
// FALSE refuses : the cell shows the old value again. is_error, set before, tells
// the user why : the help pane shows it until the value is edited again
choose case as_keys
    case "layout/width"
        if Long(as_value) < 200 or Long(as_value) > 4000 then
            uo_grid.of_property(/*keys*/ as_keys).is_error = "Between 200 and 4000 pixels."
            return false
        end if
    case "name"
        if Trim(as_value) = "" then
            uo_grid.of_property(/*keys*/ as_keys).is_error = "A window needs a name."
            return false
        end if
end choose

// Any other value is accepted
return true

Valeurs par défaut, modifications et Annuler #

Deux notions distinctes, comme dans la fenêtre des propriétés de Visual Studio et dans un DataWindow : la valeur par défaut (is_default) dit ce qui s'écrit en gras et ce que Suppr rétablit ; la référence (of_load, of_reset_update) dit ce qu'il y a à enregistrer (of_is_dirty, of_dirty_keys) et ce qu'Annuler remet (of_revert).

// The defaults of the window : a value that differs is written in bold
uo_grid.of_property(/*keys*/ "layout/width").is_default = "800"
uo_grid.of_property(/*keys*/ "layout/state").is_default = "normal"

// The width the user may type, and what Up / Down add or take
uo_grid.of_property(/*keys*/ "layout/width").is_min = "200"
uo_grid.of_property(/*keys*/ "layout/width").is_max = "4000"
uo_grid.of_property(/*keys*/ "layout/width").id_step = 50

// The saved settings, read back : they become the reference
uo_grid.of_load(/*json*/ is_saved_settings)
// OK : every value right first - otherwise the keyboard goes to the first error
if uo_grid.of_validate() > 0 then return

// Save only what changed (what the user is still typing counts too), then the screen becomes the reference
if uo_grid.of_is_dirty() then
    is_saved_settings = uo_grid.of_values()
    uo_grid.of_reset_update()
end if
// Cancel : every value back to the settings loaded
uo_grid.of_revert()

Une propriété dépliable #

Une police tient en une ligne fermée, qui résume ses valeurs, et s'ouvre sur ses trois propriétés. Sans gabarit le résumé est Segoe UI; 9; False ; is_summary l'écrit à votre façon : Segoe UI, 9 pt, puis , bold tant que Bold est coché.

// A group in the category appearance : the font, closed when it is added
uo_grid.of_add_category(/*key*/ "appearance", /*title*/ "Appearance")
uo_grid.of_add_property(/*keys*/ "appearance/font", /*label*/ "Font", /*type*/ u_pbt_propertygrid.TYPE_GROUP, /*value*/ "")

// What it holds is added at its address
uo_grid.of_add_property(/*keys*/ "appearance/font/name", /*label*/ "Name", /*type*/ u_pbt_propertygrid.TYPE_STRING, /*value*/ "Segoe UI")
uo_grid.of_add_property(/*keys*/ "appearance/font/size", /*label*/ "Size", /*type*/ u_pbt_propertygrid.TYPE_NUMBER, /*value*/ "9")
uo_grid.of_add_property(/*keys*/ "appearance/font/bold", /*label*/ "Bold", /*type*/ u_pbt_propertygrid.TYPE_BOOLEAN, /*value*/ "false")

// Its summary, written your way : "Segoe UI, 9 pt", then ", bold" while Bold is checked
uo_grid.of_property(/*keys*/ "appearance/font").is_summary = "{name}, {size} pt{?bold}, bold{/bold}"

// Open it : its three values show under it
uo_grid.of_property(/*keys*/ "appearance/font").ib_expanded = true
// Local variables
n_pbt_json lnv_json
double ld_size

// The group is an object in the values : the same address reads its size
lnv_json.of_load(/*json*/ uo_grid.of_values())
ld_size = lnv_json.of_get_number(/*path*/ "appearance/font/size")
// event ue_property_toggled of uo_grid : (string as_keys, boolean ab_expanded)
// The group that opened or closed, by its address
if ab_expanded then
    lb_log.AddItem(as_keys + " opened")
else
    lb_log.AddItem(as_keys + " closed")
end if

Lire toutes les valeurs d'un coup #

// Local variables
n_pbt_json lnv_json
string ls_state

// Every value, typed, read along the same addresses as the grid
lnv_json.of_load(/*json*/ uo_grid.of_values())
w_customers.title = lnv_json.of_get_string(/*path*/ "name")
w_customers.width = lnv_json.of_get_number(/*path*/ "layout/width")
w_customers.resizable = lnv_json.of_get_boolean(/*path*/ "layout/resizable")

// One value alone : always text
ls_state = uo_grid.of_property(/*keys*/ "layout/state").is_value

Vues, recherche et largeur des libellés #

// One flat list sorted by label, instead of the categories
uo_grid.is_sort = u_pbt_propertygrid.SORT_ALPHABETICAL

// Keep only what speaks of a colour
uo_grid.is_filter = "colour"

// The labels take half of the width, and the help pane goes away
uo_grid.ii_label_width = 50
uo_grid.ib_help = false

Parcourir une catégorie #

// Local variables
n_pbt_propertygrid_category lnv_layout
string ls_keys
long ll_i

// Each property of the category, by its full address
lnv_layout = uo_grid.of_category(/*key*/ "layout")
for ll_i = 1 to lnv_layout.of_count()
    ls_keys = lnv_layout.of_keys_at(/*index*/ ll_i)
    lb_values.AddItem(ls_keys + " = " + uo_grid.of_property(/*keys*/ ls_keys).is_value)
next

Recharger une liste de choix #

// The states offered depend on the kind of window : the old choices go,
// the property keeps its handle, its flags and its place
uo_grid.of_clear_options(/*keys*/ "layout/state")

// The new choices, then the value to show among them
uo_grid.of_add_option(/*keys*/ "layout/state", /*value*/ "docked", /*text*/ "Docked")
uo_grid.of_add_option(/*keys*/ "layout/state", /*value*/ "floating", /*text*/ "Floating")
uo_grid.of_property(/*keys*/ "layout/state").is_value = "docked"

Bonnes pratiques #

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

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