tab — u_pbt_tab #
← Référence des composants · Sommaire du guide
Onglets modernes hébergeant de vrais contrôles PowerBuilder : bandeau repositionnable, icônes par onglet, onglets fermables, réordonnancement à la souris.
▶ Le voir en vrai — Application de démonstration, tuile Tab : l'aperçu, le code qui le produit et cette page, côte à côte.
En bref #
| Userobject | u_pbt_tab |
| Classe d'items | n_pbt_tab_page (une page = un onglet) |
| Sert à | Remplacer un tab PowerBuilder par un bandeau thémé, tout en conservant vos écrans existants comme pages |
| Options opt-in | ib_reorderable, ib_veto_selection, ib_veto_close |
L'argument clé : une page n'est pas une maquette HTML, c'est un dragobject PowerBuilder — un userobject, une DataWindow, un groupe de contrôles, voire un autre composant PBToolboxAI. Le composant se charge du positionnement, du redimensionnement et de l'affichage/masquage au changement d'onglet. Voir Héberger de vrais contrôles PowerBuilder.
Démarrage rapide #
// event open de la fenetre : chaque page est un controle PB deja pose sur la fenetre
uo_tabs.of_add_page(/*key*/ "customers", /*title*/ "Clients", /*page*/ uo_page_customers)
uo_tabs.of_add_page(/*key*/ "invoices", /*title*/ "Factures", /*page*/ uo_page_invoices, /*closable*/ true)
// Une icone par onglet, posee sur le handle de la page
uo_tabs.of_page(/*key*/ "customers").is_icon = "mono:img\customers.svg"
uo_tabs.of_page(/*key*/ "invoices").is_icon = "mono:img\invoice.svg"
// Affiche le premier onglet
uo_tabs.of_select_page(/*key*/ "customers")
// event ue_selection_changed de uo_tabs : (string as_from_key, string as_key)
// Une cle vide : plus aucun onglet n'est affiche (tous masques)
if as_key <> "" then of_load_page(as_key)
Propriétés #
| Propriété | Type | Défaut | Rôle |
|---|---|---|---|
is_position | string | "top" | Placement du bandeau : top, bottom (bande horizontale), start, end (bande verticale). Constantes POSITION_TOP, POSITION_BOTTOM, POSITION_START, POSITION_END. START/END sont logiques et suivent le sens d'écriture |
is_overflow_mode | string | "menu" | Ce que fait une bande trop petite pour ses onglets. menu (défaut) garde chaque onglet lisible : ceux qui ne tiennent plus sortent de la bande et le bouton ··· les liste tous, l'onglet actif restant toujours affiché. compact les garde tous dans la bande et les laisse se réduire, jusqu'à la place que demande un texte tronqué. Constantes OVERFLOW_MENU, OVERFLOW_COMPACT |
ib_reorderable | boolean | false | Opt-in : l'utilisateur peut réordonner les onglets en faisant glisser leur en-tête à la souris (déclenche ue_tab_reordered) |
ib_veto_selection | boolean | false | Demander avant que l'onglet actif change — un geste de l'utilisateur (clic, clavier, raccourci, liste des onglets) et of_select_page : déclenche ue_selection_changing, qui peut refuser ; un of_select_page refusé renvoie -4. Désactivé par défaut, comme tout événement annulable : mettez-le à true pour pouvoir refuser (travail non enregistré). Chaque question d'un geste coûte un aller-retour vers PowerBuilder (~35 ms) |
ib_veto_close | boolean | false | Demander avant que l'utilisateur ferme un onglet (croix, clic du milieu, menu contextuel, Suppr) : déclenche ue_tab_closing, qui peut refuser. Désactivé par défaut : mettez-le à true pour garder une page qui détient du travail non enregistré |
ib_context_menu | boolean | true | Menu contextuel intégré sur un en-tête d'onglet : Fermer, Fermer les autres, Fermer à droite, Fermer tout, grisés quand ils n'ont pas de cible. Actif par défaut. Le clic droit sélectionne d'abord l'onglet visé : si l'application refuse le changement, aucun menu ne s'ouvre. Avec ib_veto_close, chaque fermeture passe par ue_tab_closing, une question par page : celle qui détient du travail non enregistré refuse seule et reste ouverte pendant que ses voisines partent. À false, le clic droit sur un onglet le sélectionne puis lève ue_tab_rclicked : ouvrez-y votre propre menu |
ib_cycle_keys | boolean | true | Ctrl+Tab / Ctrl+Maj+Tab et Ctrl+Page suivante / Ctrl+Page précédente passent d'onglet en onglet, depuis la bande et depuis une page hébergée. Actif par défaut. Mettez-le à false quand une page a besoin de ces touches pour elle-même : un champ multiligne qui tape une tabulation, un Tab natif de PowerBuilder posé dans une page |
is_close_mode | string | "always" | Où se montre la croix d'un onglet fermable : always (défaut) sur chaque onglet fermable, active sur l'onglet actif seulement, hover sur l'onglet actif et sur celui que survole le pointeur. La place de la croix est gardée : un onglet ne change jamais de largeur sous le pointeur. Le clic du milieu et Suppr ferment toujours. Constantes CLOSE_ALWAYS, CLOSE_ACTIVE, CLOSE_HOVER |
ii_strip_width | integer | 0 | Largeur d'une bande verticale (POSITION_START / POSITION_END), en pixels. 0 (défaut) = la largeur que demandent les titres, mais jamais plus de 40 % du composant : un titre long se termine alors par des points de suspension et la page hébergée garde sa place. Une bande horizontale l'ignore |
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 |
Propriétés d'une page — n_pbt_tab_page #
Obtenues par of_page(id), elles se modifient à chaud, sans reconstruire le bandeau.
| Propriété | Type | Défaut | Rôle |
|---|---|---|---|
is_title | string | "" | Libellé de l'onglet. Accepte le balisage riche |
is_icon | string | "" | Icône de l'onglet (formes acceptées : chemin, mono:, tint:, ressource de DLL). Vide = aucune icône |
ib_enabled | boolean | true | false grise l'onglet : aucun clic, touche, raccourci ni of_select_page ne l'active, et il n'a pas de croix. Désactiver l'onglet actif le laisse actif et sa page utilisable : désactivez la page elle-même s'il le faut (votre code sait si elle doit rester saisissable) |
ib_visible | boolean | true | false masque l'onglet sans supprimer la page ; masquer l'onglet actif active son voisin (celui de droite, sinon celui de gauche) ; masquer le dernier onglet visible cache la page et lève ue_selection_changed avec une clé vide |
ib_closable | boolean | false | Croix de fermeture sur cet onglet. Rarement connu au moment de l'ajout : il passe à true dès que le document tenu par la page est enregistré, à false pendant qu'un traitement y tourne. Un clic du milieu sur un onglet fermable le ferme aussi, comme sa croix |
is_shortcut | string | "" | Raccourci clavier qui active cet onglet : "Ctrl+2", "Alt+F", "F6"… Il répond où que soit l'utilisateur dans la fenêtre, page hébergée comprise — le raccourci est tenu par la DLL, pas par la barre d'onglets. Sélectionner ainsi est un clic : ue_selection_changing est posée si ib_veto_selection est actif, ue_selection_changed suit ; un onglet désactivé ou masqué l'ignore. "" le retire. Écrivez-le une fois la page ajoutée : sur une clé qu'aucune page ne porte, rien n'est inscrit et of_get_last_error() du composant dit pourquoi |
ib_modified | boolean | false | La page détient du travail non enregistré : un point prend la place de sa croix (la croix revient sous le pointeur), ou suit le titre d'un onglet qui ne se ferme pas ; un lecteur d'écran entend « Modifié » |
is_badge | string | "" | Un compteur après le titre, aux couleurs de l'accent : "3", "12", "!"… "" le retire |
is_tooltip | string | "" | Info-bulle simple affichée au survol de l'item |
is_super_tooltip_title | string | "" | Titre de l'info-bulle enrichie de l'item (prend le pas sur is_tooltip) |
is_super_tooltip_text | string | "" | Texte de l'info-bulle enrichie de l'item (balisage riche accepté) |
is_super_tooltip_image | string | "" | Image de l'info-bulle enrichie de l'item |
il_accent | long | -1 | Accent de cette page : il souligne son onglet quand c'est l'onglet actif (du côté qui touche la page) et colore son anneau de focus clavier. -1 lui rend l'accent du composant |
il_back_color | long | -1 | Fond de cet onglet, actif ou non (-1 = celui du composant, qui suit le thème) |
il_text_color | long | -1 | Couleur du texte de cet onglet (-1 = celle du composant) |
il_back_color_hover | long | -1 | Fond de cet onglet sous le pointeur (-1 = celui du composant) |
il_text_color_hover | long | -1 | Couleur du texte de cet onglet sous le pointeur (-1 = celle du composant) |
Méthodes #
| Méthode | Rôle | |
|---|---|---|
of_add_page (string as_key, string as_title, dragobject ado_page) | Ajoute un onglet non fermable, sans icône, et héberge le contrôle. Renvoie 0 une fois appliqué, -5 si la clé est vide, contient un / ou un ` | , est déjà prise, ou si la page manque ou est déjà hébergée (par cet onglet sous une autre clé, ou par un autre composant) : rien n'est ajouté alors, -2` si le composant n'est pas créé |
of_add_page (string as_key, string as_title, dragobject ado_page, boolean ab_closable) | Idem, avec croix de fermeture si ab_closable. Renvoie 0 une fois appliqué, -5 si la clé est vide, contient un / ou un ` | , est déjà prise, ou si la page manque ou est déjà hébergée (par cet onglet sous une autre clé, ou par un autre composant) : rien n'est ajouté alors, -2` si le composant n'est pas créé |
of_add_page (string as_key, string as_title, dragobject ado_page, boolean ab_closable, string as_icon) | Idem, avec l'icône posée dans la foulée (l'onglet s'affiche d'emblée complet). Renvoie 0 une fois appliqué, -5 si la clé est vide, contient un / ou un ` | , est déjà prise, ou si la page manque ou est déjà hébergée (par cet onglet sous une autre clé, ou par un autre composant) : rien n'est ajouté alors, -2` si le composant n'est pas créé |
of_add_page (string as_key, string as_title) | Ajoute un onglet sans son contrôle : il s'affiche tout de suite, et ue_page_needed demande le contrôle la première fois que la page est montrée — le CreateOnDemand d'un Tab PowerBuilder (voir of_supply_page). Onglet non fermable, sans icône. Renvoie 0 une fois appliqué, -5 si la clé est vide, contient un / ou un ` | , ou est déjà prise : rien n'est ajouté alors, -2` si le composant n'est pas créé |
of_add_page (string as_key, string as_title, boolean ab_closable, string as_icon) | La même chose, en disant si l'onglet se ferme et quelle est son icône. Renvoie 0 une fois appliqué, -5 si la clé est vide, contient un / ou un ` | , ou est déjà prise : rien n'est ajouté alors, -2` si le composant n'est pas créé |
of_insert_page (string as_key, string as_title, dragobject ado_page, integer ai_index) | Ajoute la page puis la déplace à la position ai_index (1 = la première). Renvoie 0 une fois appliqué, -5 pour les mêmes refus que of_add_page, -2 si le composant n'est pas créé. Une position 0 ou moins vaut la première, au-delà de la fin la dernière. Si l'onglet ne peut pas être mis à sa place, la page est retirée et le code est renvoyé | |
of_insert_page (string as_key, string as_title, dragobject ado_page, boolean ab_closable, string as_icon, integer ai_index) | Idem, en disant ce que dit of_add_page : si l’onglet se ferme, et son icône. Renvoie 0 une fois appliqué, -5 pour les mêmes refus que of_add_page, -2 si le composant n'est pas créé. Une position 0 ou moins vaut la première, au-delà de la fin la dernière. Si l'onglet ne peut pas être mis à sa place, la page est retirée et le code est renvoyé | |
of_move_page (string as_key, integer ai_index) | Déplace un onglet existant à la position ai_index (1 = la première) ; sa page hébergée et la sélection sont conservées. Renvoie 0 une fois appliqué, -5 si la clé ne désigne aucune page, -2 si le composant n'est pas créé. Une position 0 ou moins vaut la première, au-delà de la fin la dernière ; un onglet déjà à sa place ne bouge pas et rien n'est annoncé | |
of_select_page (string as_key) | Active un onglet, comme un clic sur lui : avec ib_veto_selection actif, ue_selection_changing est posée d'abord ; puis ue_selection_changed suit, comme pour un clic (juste après votre script, depuis la file d'événements), et of_selected_key() relu juste après rend déjà la nouvelle clé. Onglet déjà actif : rien n'est demandé ni levé. Renvoie 0 une fois appliqué (ou déjà actif), -4 si votre ue_selection_changing a refusé (rien ne bouge), -5 si la clé ne désigne aucune page ou si la page ne peut pas s'afficher (masquée, désactivée, au-delà du plafond de démonstration) — y compris quand plus aucune page n'est active ensuite, -2 si le composant n'est pas créé | |
of_remove_page (string as_key) | Retire l'onglet et rend le contrôle à sa fenêtre d'origine, masqué. Le contrôle reste utilisable et peut être hébergé ailleurs. Ne lève pas ue_tab_closed : c'est votre code qui l'a fait. Si c'était la page active, sa voisine devient active. Renvoie 0 une fois appliqué, -5 si la clé ne désigne aucune page, -2 si le composant n'est pas créé | |
of_selected_key ( ) | Identifiant de l'onglet actif, "" si aucun | |
of_get_layout ( ) | Relit la disposition courante en JSON : l'ordre des onglets et la visibilité de chacun. À stocker (fichier, base, registre) et à rendre par of_set_layout au démarrage suivant. La même paire porte les mêmes noms sur tous les composants réorganisables | |
of_set_layout (string as_layout_json) | Restaure une disposition lue par of_get_layout ou reçue par ue_layout_changed. Ce que la disposition ne nomme pas garde sa place à la fin : une disposition d'hier ne doit pas faire disparaître ce qui a été ajouté depuis. Quand elle change l'ordre ou la visibilité, ue_layout_changed est levé une fois ; une disposition qui ne change rien n'est pas annoncée. Si elle masque l'onglet actif, sa voisine devient active et ue_selection_changed le dit. Renvoie 0 une fois appliqué, -5 si le texte est vide ou n'est pas du JSON valide, -2 si le composant n'est pas créé | |
of_supply_page (string as_key, dragobject ado_page) | Donne son contrôle à une page ajoutée sans (of_add_page(key, title)) — dans ue_page_needed, ou quand votre code est prêt. La page à l'écran le montre aussitôt ; une autre le garde caché jusqu'à ce qu'elle soit choisie. Renvoie 0 une fois hébergé, -5 si la clé ne nomme aucune page, si la page a déjà son contrôle, ou si le contrôle manque ou est déjà hébergé, -2 si le composant n'est pas créé | |
of_page (string as_key) | Handle n_pbt_tab_page de la page (créé au premier accès). Une poignée est rendue pour toute clé, même celle qu'aucune page ne porte encore : testez avec of_has | |
of_refresh_page (string as_key) | Rafraîchit le rendu d'une page construite hors écran, sans scintillement. Renvoie 0, -5 si la clé ne désigne aucune page, -2 si le composant n'est pas créé | |
of_relayout ( ) | Republie la zone de page pour que le contrôle hébergé soit repositionné (utile après un affichage différé). Renvoie 0 une fois appliqué, -2 si le composant n'est pas créé | |
of_preload_icons (string as_icons[]) | Préchauffe un lot d'icônes au démarrage : un onglet ouvert plus tard affiche son icône instantanément. Renvoie 0 une fois appliqué, -2 si le composant n'est pas créé | |
of_reset ( ) | Vide le bandeau : chaque page hébergée est rendue à sa fenêtre d'origine, puis le composant revient à son état neuf. Renvoie 0 une fois appliqué, -2 si le composant n'est pas créé | |
of_set_redraw (boolean) | Regroupe une rafale de modifications en un seul rendu. Renvoie 0 une fois appliqué, -2 si le composant n'est pas créé | |
of_save_as_png (string) · of_save_as_jpg (string) | Exporte le rendu en image. Renvoie 0 une fois l'image écrite, -4 si l'écriture échoue, -2 si le composant n'est pas créé |
of_add_pagerenvoie un code négatif si l'identifiant est vide, déjà utilisé, ou si le contrôle passé n'est pas valide ou déjà hébergé.
Quand il y a trop d'onglets — ils se réduisent pour tenir dans la bande, mais pas en dessous d'une largeur lisible : l'icône et la croix de fermeture prennent leur place en plus du titre, jamais à sa place. Ceux qui ne tiennent plus sortent de la bande, et un bouton ··· apparaît à son extrémité : il ouvre la liste de tous les onglets visibles, l'actif coché, et le choix bascule dessus. L'onglet actif reste toujours affiché. La bande ne défile pas — ce bouton est le chemin d'accès aux onglets sortis du cadre. Rien à coder, le comportement est automatique.
Au clavier et à la souris — Ctrl+Tab et Ctrl+Page suivante passent à l'onglet suivant, Ctrl+Maj+Tab et Ctrl+Page précédente au précédent : seuls comptent les onglets qui peuvent devenir actifs (les masqués et les grisés sont sautés), et le parcours reboucle. Ces touches répondent quand le clavier est dans la bande d'onglets ou dans une page qu'elle héberge — un contrôle PowerBuilder de la page comme un autre composant posé dedans ; depuis un contrôle placé hors du tab, elles restent à la fenêtre. C'est un geste de l'utilisateur : ue_selection_changing est posée si ib_veto_selection est actif, puis ue_selection_changed suit. Un clic du milieu sur un onglet fermable le ferme, exactement comme sa croix : même question ue_tab_closing si ib_veto_close est actif, puis ue_tab_closed ; sur un onglet grisé ou non fermable, il ne fait rien. Rien à coder. Maj+F10 ou la touche Menu sur un onglet ouvre son menu sous l'onglet ; Ctrl+Maj+flèche déplace l'onglet qui a le focus quand ib_reorderable est à true. Si une page a besoin de Ctrl+Tab pour elle-même, mettez ib_cycle_keys à false.
Événements #
| Événement | Déclenché quand |
|---|---|
ue_selection_changed (string as_from_key, string as_key) | L'onglet actif a changé, par un geste (un clic, le clavier dont Ctrl+Tab, un raccourci, la liste des onglets), par of_select_page (un ordre de votre code le lève aussi, comme SelectTab lève SelectionChanged) ou parce qu'un onglet part (fermé, retiré, masqué). Mêmes arguments que ue_selection_changing : la question et son issue se lisent pareil, et as_from_key est la page quittée — même quand elle n'existe plus. Une clé as_key vide signifie qu'aucun onglet ne peut plus s'afficher : toutes les pages sont cachées. Fermer l'onglet actif lève ue_selection_changed(fermé, voisin) puis ue_tab_closed(fermé). Une page ajoutée sans son contrôle reçoit ue_page_needed avant cet event |
ue_tab_closed (string as_key) | L'utilisateur a fermé un onglet : sa croix, un clic du milieu sur lui, le menu contextuel ou la touche Suppr. L'onglet est déjà retiré et la page rendue à sa fenêtre. of_remove_page ne le lève jamais : c'est votre code qui l'a fait |
ue_tab_reordered (string as_key, integer ai_index) | L'utilisateur a déposé un en-tête à une nouvelle place — à la souris, ou par Ctrl+Maj+flèche sur un onglet qui a le focus (ib_reorderable). Levé seulement quand l'ordre a vraiment changé. ai_index est la nouvelle position, à partir de 1, comme of_move_page |
ue_layout_changed (string as_layout_json) | La disposition à enregistrer a changé : l'utilisateur a glissé un en-tête, ou votre code a déplacé un onglet (of_move_page, of_insert_page), en a masqué / réaffiché un (ib_visible) ou a appliqué une disposition (of_set_layout) — une fois par vrai changement, une fois pour une rafale faite sous of_set_redraw(false). L'ajout, la fermeture ou le retrait d'un onglet ne le lèvent pas : l'ordre des autres ne change pas. Porte la disposition entière, pas seulement ce qui a bougé : la conserver tient en une affectation |
ue_selection_changing (string as_from_key, string as_key) → boolean | Annulable, posé avant que l'onglet actif change — un geste de l'utilisateur ou of_select_page —, quand ib_veto_selection est à true (désactivé par défaut). Renvoyez false pour rester sur la page : rien ne bouge, et of_select_page renvoie -4 |
ue_tab_closing (string as_key) → boolean | Annulable, posé avant que l'utilisateur ferme un onglet, quand ib_veto_close est à true (désactivé par défaut). Nommé pour faire la paire avec ue_tab_closed : closing / closed. Renvoyez false pour garder l'onglet (et sa page hébergée) ouvert |
ue_tab_rclicked (string as_key, long al_x, long al_y) | Clic droit sur un en-tête d'onglet — ou Maj+F10 / la touche Menu sur un onglet qui a le focus — quand ib_context_menu est à false : l'onglet est d'abord sélectionné (par ue_selection_changing si elle est armée — une sélection refusée ne lève rien), puis cet event donne sa clé et al_x, al_y en pixels d'écran (le pointeur ; au clavier, le coin bas-gauche de l'onglet) — ce que prend of_show d'un contextmenu. Un menu PowerBuilder s'ouvre au pointeur de la fenêtre : PopMenu(PointerX(), PointerY()). Un onglet désactivé ne lève rien ; un seul event par clic droit |
ue_tab_double_clicked (string as_key) | Double-clic sur un en-tête d'onglet (le DoubleClicked d'un Tab PowerBuilder) : renommer la page, la détacher, l'agrandir — votre code décide. Le premier clic a déjà sélectionné l'onglet. Un geste seulement ; un onglet désactivé ne lève rien |
ue_page_needed (string as_key) | Une page ajoutée sans son contrôle (of_add_page(key, title)) va être montrée : créez son contrôle ici (OpenUserObject…) et donnez-le avec of_supply_page. Levé avant ue_selection_changed, et avant que of_select_page ne rende la main ; une fois par affichage, de nouveau au suivant tant que la page n'a pas son contrôle. D'ici là, le corps montre le fond du thème |
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) |
Exemples #
Un classeur de pages métier #
// event open : les userobjects de page sont deja poses sur la fenetre
uo_tabs.of_set_redraw(/*on*/ false)
// Un onglet par userobject de page
uo_tabs.of_add_page(/*key*/ "identity", /*title*/ "Identite", /*page*/ uo_identity)
uo_tabs.of_add_page(/*key*/ "addresses", /*title*/ "Adresses", /*page*/ uo_addresses)
uo_tabs.of_add_page(/*key*/ "accounting", /*title*/ "Comptabilite", /*page*/ uo_accounting)
// Une icone par onglet, posee sur le handle de la page
uo_tabs.of_page(/*key*/ "identity").is_icon = "mono:img\user.svg"
uo_tabs.of_page(/*key*/ "addresses").is_icon = "mono:img\map.svg"
uo_tabs.of_page(/*key*/ "accounting").is_icon = "mono:img\euro.svg"
// Un seul rendu pour tout, puis le premier onglet s'affiche
uo_tabs.of_set_redraw(/*on*/ true)
uo_tabs.of_select_page(/*key*/ "identity")
Documents fermables, ouverts à la demande #
// Local variables
string ls_key, ls_label
// Ouvrir un document dans un nouvel onglet fermable : sa cle et son titre
ls_key = "report42"
ls_label = "Rapport 42"
uo_tabs.of_add_page(/*key*/ ls_key, /*title*/ ls_label, /*page*/ uo_editor, /*closable*/ true, /*icon*/ "mono:img\doc.svg")
uo_tabs.of_select_page(/*key*/ ls_key)
// event ue_tab_closed de uo_tabs : (string as_key)
// L'onglet est deja retire ; il reste a liberer vos donnees metier.
of_free_document(as_key)
// La croix sur l'onglet actif seulement, un point sur une page qui detient
// du travail non enregistre, et un compteur sur une autre
uo_tabs.is_close_mode = uo_tabs.CLOSE_ACTIVE
uo_tabs.of_page(/*key*/ "report42").ib_modified = true
uo_tabs.of_page(/*key*/ "inbox").is_badge = "3"
Pages créées à la demande #
Une page lourde n'a pas besoin d'exister avant d'être visitée : ajoutez-la sans son contrôle, et créez-le dans ue_page_needed, comme le CreateOnDemand d'un Tab PowerBuilder.
// event open de la fenetre : les pages lourdes sont ajoutees SANS leur controle
uo_tabs.of_add_page(/*key*/ "orders", /*title*/ "Commandes")
uo_tabs.of_add_page(/*key*/ "history", /*title*/ "Historique")
// event ue_page_needed de uo_tabs : (string as_key)
// Local variables
u_orders luo_orders
// La page est montree pour la premiere fois : creer son controle, puis le donner
if as_key = "orders" then
parent.OpenUserObject(luo_orders)
uo_tabs.of_supply_page(/*key*/ as_key, /*page*/ luo_orders)
end if
Réordonnancement à la souris #
// The user may drag a tab to a new place
uo_tabs.ib_reorderable = true
// event ue_tab_reordered de uo_tabs : (string as_key, integer ai_index)
// ai_index = nouvelle position, a partir de 1 (comme of_move_page) : on memorise l'ordre choisi.
of_save_order(as_key, ai_index)
Bandeau vertical #
// Bande d'onglets sur le cote gauche, utile quand les libelles sont longs
uo_tabs.is_position = uo_tabs.POSITION_START
Griser ou masquer un onglet selon les droits #
// Le chemin passe toujours par le handle de la page
uo_tabs.of_page(/*key*/ "accounting").ib_enabled = of_is_allowed("accounting")
uo_tabs.of_page(/*key*/ "audit").ib_visible = gb_expert_mode
Réagir à la sélection #
// event ue_selection_changed de uo_tabs : (string as_from_key, string as_key)
choose case as_key
case "identity" ; uo_identity.of_refresh()
case "addresses" ; uo_addresses.of_refresh()
case "accounting" ; uo_accounting.of_refresh()
end choose
Refuser un changement d'onglet ou une fermeture #
// Les deux questions sont a ACTIVER : sans ces lignes, le composant ne demande
// rien et change de page ou ferme tout de suite.
uo_tabs.ib_veto_selection = true
uo_tabs.ib_veto_close = true
// event ue_selection_changing de uo_tabs : (string as_from_key, string as_key)
// Renvoyer FALSE garde l'utilisateur sur la page qu'il quitte.
if of_page_modified(as_from_key) then
if MessageBox("Modifications", "Quitter sans enregistrer ?", Question!, YesNo!) = 2 then
return false
end if
end if
return true
// event ue_tab_closing de uo_tabs : (string as_key)
// Renvoyer FALSE garde l'onglet et sa page hebergee ouverts.
return not of_page_modified(as_key)
Repartir d'un bandeau vide #
// of_reset rend CHAQUE page hebergee a sa fenetre d'origine avant de vider
uo_tabs.of_reset()
uo_tabs.of_add_page(/*key*/ "home", /*title*/ "Accueil", /*page*/ uo_home)
Bonnes pratiques #
- Les contrôles hébergés doivent exister avant l'appel : posez-les sur la fenêtre à la conception, le composant se charge de les masquer et de les repositionner.
- Chargez les pages une fois à l'
open, puis pilotez uniquement la sélection : c'est plus rapide qu'ajouter et retirer des pages en continu. - Appelez
of_preload_iconsau démarrage si vos onglets portent des icônes : sans cela, la première ouverture d'un onglet masqué montre un court délai avant l'icône. - Les deux questions sont opt-in : posez
ib_veto_selection/ib_veto_closeàtruepour pouvoir refuser un changement d'onglet ou une fermeture (un événement laissé vide autorise toujours l'action). Chaque question coûte un aller-retour vers PowerBuilder. - Un contrôle hébergé est une fenêtre native : il se dessine au-dessus de la couche web. Aucun effet visuel du composant ne peut passer par-dessus lui.
- N'oubliez pas
of_reset()avant de reconstruire un bandeau : sans lui, réutiliser un identifiant de page échoue et les contrôles précédents restent affichés. - Pour des zones redimensionnables et détachables plutôt que des pages exclusives, préférez dockcontainer.
- Au clavier, la bande d'onglets suit son axe : Gauche/Droite (inversées en écriture de droite à gauche), Haut/Bas en position
start/end, Début/Fin, Entrée ou Espace pour activer, Suppr pour fermer un onglet fermable. Les onglets désactivés et ceux sortis de la bande sont sautés. - Beaucoup de pages lourdes ? Ajoutez-les sans leur contrôle (
of_add_page(key, title)) et créez chacune dansue_page_needed: l'écran s'ouvre vite, et seules les pages visitées existent.
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.