PBToolboxAI v4 ← Site

statictext — u_pbt_statictext #

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

Bloc de texte riche : balisage, alignements, liens et actions cliquables, allure d'en-tête, mode défilant (marquee) et zone de dépôt de fichiers.

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


En bref #

Userobjectu_pbt_statictext
Classe d'items— (composant sans items)
Sert àRemplacer un statictext PowerBuilder par un bloc de texte formaté, cliquable, capable de servir d'en-tête, de bandeau défilant ou de zone de dépôt
Options opt-inib_auto_height, ib_auto_width, ib_follow_end, ib_track_mouse, ib_track_cycle, ib_allow_drop, ib_selectable, ib_hover_effect

Démarrage rapide #

// event open de la fenetre
uo_text.is_text = "Bienvenue sur [b][accent]PBToolboxAI[/accent][/b][br]" &
                   + "Consultez la [hyperlink=https://pbtoolboxai.net]documentation[/hyperlink]."
uo_text.is_align = uo_text.ALIGN_CENTER
uo_text.is_valign = uo_text.VALIGN_CENTER

Le texte accepte le balisage riche : c'est ce composant qui en tire le meilleur parti, puisqu'il est le seul à rendre les zones [action=…] cliquables (un [hyperlink=…] s'ouvre partout).


Constantes #

ConstanteValeurPour
ALIGN_START · ALIGN_CENTER · ALIGN_END · ALIGN_JUSTIFY"start" "center" "end" "justify"is_align
VALIGN_TOP · VALIGN_CENTER · VALIGN_BOTTOM"top" "center" "bottom"is_valign

start et end sont logiques : ils suivent le sens d'écriture (Langue et RTL). Les valeurs physiques left et right restent acceptées comme alias.


Propriétés #

Texte et mise en forme #

PropriétéTypeDéfautRôle
is_textstring""Le texte affiché, avec le balisage riche : [b], [i], [u], couleurs, [picture=…], [hyperlink=…], [action=…]
is_alignstring"start"Alignement horizontal : ALIGN_START, ALIGN_CENTER, ALIGN_END, ALIGN_JUSTIFY
is_valignstring"top"Alignement vertical dans le contrôle : VALIGN_TOP, VALIGN_CENTER, VALIGN_BOTTOM
ib_wrapbooleantrueRetour à la ligne automatique. false force une ligne unique
ib_ellipsisbooleanfalseAvec ib_wrap = false, tronque le débordement par des points de suspension au lieu de le couper net
ib_ellipsis_tooltipbooleanfalseOpt-in : quand le texte ne tient pas dans la boîte, l'afficher en entier dans une info-bulle (balisage compris). Ne remplace jamais une info-bulle que vous avez posée avec is_tooltip ou is_super_tooltip_* : la vôtre gagne
is_font_familystring""Police par défaut du bloc (vide = police du thème)
ii_font_sizeinteger0Taille par défaut en points (0 = taille du thème)
il_text_colorlong-1Couleur de texte RGB() (-1 = couleur du thème). Les balises [color] restent prioritaires sur leur portion
ii_line_spacinginteger0Interligne en pourcentage, de 50 à 400 (150 = 1,5 ligne ; 0 = défaut). Une valeur hors de ces bornes est ramenée à la plus proche, et se relit telle qu'appliquée
ib_enabledbooleantrueBloc actif ou grisé (liens et actions inertes quand il est grisé)
ib_selectablebooleanfalseOpt-in : autorise l'utilisateur à sélectionner le texte et à le copier par Ctrl+C (coupé par défaut, comme un libellé). Relâcher la souris après une sélection ne lève pas ue_clicked

Allure de bloc (look « en-tête ») #

PropriétéTypeDéfautRôle
il_back_colorlong-1Fond du bloc RGB() (-1 = fond du thème). Avec ii_corner_radius, il suit l'arrondi, et hors des coins le bloc montre la couleur de l'objet sur lequel il est posé
il_border_colorlong-1Couleur de la bordure (-1 = pas de bordure)
ii_border_widthinteger0Épaisseur de la bordure en pixels (0 = pas de bordure)
ii_corner_radiusinteger0Rayon d'arrondi des angles, en pixels. La bordure ET le fond il_back_color le suivent
ii_paddinginteger-1Marge intérieure en pixels : -1 = celle du thème (défaut), 0 = aucune marge (le texte s'aligne sur le bord d'un champ voisin), au-delà = pixels
ib_hover_effectbooleanfalseOpt-in : léger assombrissement au survol (éclaircissement sur un thème sombre), pour un libellé-bouton

Mode défilant (marquee) #

PropriétéTypeDéfautRôle
ib_marqueebooleanfalseTransforme le bloc en bandeau défilant horizontalement
ii_marquee_speedinteger60Vitesse de défilement, en pixels par seconde (0 = vitesse par défaut, 60)
is_marquee_directionstringMARQUEE_STARTSens du défilement : MARQUEE_START (vers le début de lecture) ou MARQUEE_END. Alias physiques "left" / "right" acceptés : ils restent physiques, quel que soit le sens de lecture. Toute autre valeur vaut, et se relit, MARQUEE_START
ib_marquee_overflow_onlybooleanfalseOpt-in : ne défiler que si le texte est trop large pour la boîte. Un bandeau qui fait défiler un texte déjà lisible n'est que du bruit visuel. Désactivé par défaut, pour que ib_marquee = true continue de vouloir dire ça défile
ib_marquee_pause_on_hoverbooleanfalseOpt-in : arrête le défilement tant que le pointeur est sur le bloc, pour qu'un texte long soit lisible. La position de boucle est conservée : rien ne saute quand le pointeur s'en va

Interactions optionnelles #

PropriétéTypeDéfautRôle
ib_allow_dropbooleanfalseOpt-in : accepte le dépôt de fichiers depuis l'Explorateur Windows ; les chemins complets arrivent par ue_drop_files. Un texte désactivé (ib_enabled = false) refuse tout dépôt
ib_track_mousebooleanfalseOpt-in : active ue_mouse_enter / ue_mouse_leave
ib_track_cyclebooleanfalseOpt-in : active ue_cycle, levé à la fin de chaque passage du défilement ; sans lui, le texte défile en silence
ib_auto_heightbooleanfalseOpt-in : le bloc mesure sa hauteur idéale et redimensionne l'userobject ; voir Socle commun
ib_auto_widthbooleanfalseOpt-in : l'userobject prend la LARGEUR de son texte — la plus longue ligne, sans retour à la ligne (les [br] comptent), plus la marge et la bordure ; un nouveau texte, une police ou une marge le redimensionnent à nouveau, et ue_auto_width dit la largeur retenue. Un bandeau défilant (ib_marquee) n'a pas de largeur naturelle et n'en rapporte aucune
ib_follow_endbooleanfalseOpt-in, pour un journal écrit avec of_append_text : la vue reste EN BAS à mesure que les lignes arrivent — sauf si le lecteur est remonté lire une ligne plus ancienne : on ne l'en arrache jamais
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

Méthodes #

MéthodeRôle
of_reset ( )Remet toutes les propriétés à leur défaut et vide le texte. 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_refresh_parent_color ( )Relit la couleur de l'objet sur lequel le bloc est posé. Avec il_back_color et ii_corner_radius, les coins arrondis montrent cette couleur, lue quand ces deux propriétés sont posées : appelez-la après avoir changé le BackColor de votre fenêtre, ou déplacé le bloc vers un autre parent. Renvoie 0 une fois envoyée, -2 si le composant n'est pas créé
of_scroll_to_end ( )Descend au bas du texte. Pour un journal, dont la ligne la plus récente est à la fin : sans cela elle passe sous la ligne de flottaison dès que le texte dépasse la hauteur visible. Renvoie 0 une fois envoyée, -2 si le composant n'est pas créé
of_append_text (string as_markup)Ajoute UNE ligne à la fin du texte, pour un journal : seule cette ligne part vers le composant et seule elle est dessinée — réécrire is_text à chaque ligne renvoyait et redessinait tout le journal. as_markup prend le même balisage que is_text ; relu, is_text porte toutes les lignes, jointes par [br]. Avec ib_follow_end la vue reste en bas. Renvoie 0 une fois envoyée, -2 si le composant n'est pas créé

Événements #

ÉvénementDéclenché quand
ue_clicked ( )Clic gauche sur le bloc — pas déclenché sur une zone [action] ou [hyperlink] (aucun doublon), sur l'en-tête d'un [foldarea] (replier ne lève rien), ni après une sélection de texte
ue_hyperlink (string as_url)Une zone [hyperlink=url] a été cliquée. Le navigateur s'ouvre tout seul : l'event vous est remis en plus, pour tracer le clic ou en faire davantage
ue_action (string as_key)Une zone [action=id] a été cliquée : à vous d'y brancher votre code. La zone s'atteint aussi au clavier : Tab jusqu'à elle, puis Entrée ou Espace
ue_drop_files (string as_files[])Des fichiers ont été déposés depuis Windows : chemins complets, une entrée par fichier. Nécessite ib_allow_drop = true
ue_drag_enter ( )Un glissement de fichiers entre sur le composant (ib_allow_drop)
ue_drag_leave ( )Le glissement de fichiers quitte le composant
ue_auto_height (long al_height)Le bloc a calculé sa hauteur idéale — nécessite ib_auto_height = true
ue_auto_width (long al_width)Le bloc a pris une nouvelle largeur, en unités PowerBuilder — nécessite ib_auto_width = true
ue_rclicked ( )Clic droit sur le bloc
ue_double_clicked ( )Double-clic sur le bloc, comme le StaticText natif de PowerBuilder. Les clics simples qui le précèdent sont émis aussi, dans le même ordre. Pas déclenché sur une zone [action] ou [hyperlink], qui ont leur propre canal
ue_text_overflow (boolean ab_truncated)Le texte a cessé de tenir dans la boîte — ou y tient de nouveau. Émis uniquement sur changement, jamais en rafale : un bloc en retour à la ligne compte comme coupé quand il est rogné en bas, un bloc sur une ligne quand il est coupé sur le côté. À traiter pour élargir une colonne, proposer un bouton voir plus, ou simplement activer ib_ellipsis_tooltip
ue_mouse_enter ( )La souris entre — nécessite ib_track_mouse = true
ue_mouse_leave ( )La souris sort — nécessite ib_track_mouse = true
ue_cycle ( )Mode défilant uniquement : le texte vient de terminer un passage complet (une animation À L'INTÉRIEUR du texte ne compte jamais comme un passage) — nécessite ib_track_cycle = true
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 en-tête de section #

Fond plein, texte blanc centré et hauteur ajustée au contenu : le bloc se lit comme une vraie barre de titre.

// Geler l'affichage le temps de tout poser
uo_header.of_set_redraw(/*on*/ false)

// Le titre, centre
uo_header.is_text  = "[b]Tableau de bord des ventes"
uo_header.is_align = uo_header.ALIGN_CENTER

// Fond plein et texte blanc lisible
uo_header.il_back_color = RGB(/*red*/ 60, /*green*/ 110, /*blue*/ 190)
uo_header.il_text_color = RGB(/*red*/ 255, /*green*/ 255, /*blue*/ 255)
uo_header.ii_padding = 14

// Le bloc se colle a son contenu : il se lit comme une barre de titre
uo_header.ib_auto_height = true

// Tout se dessine en une fois
uo_header.of_set_redraw(/*on*/ true)
// event ue_auto_height de uo_header
of_reposition_below_header(al_height)   // decale le contenu sous l'en-tete

Texte riche avec lien et action #

// Un lien vers une page web, et une action que votre application traite (ue_action)
uo_text.is_text = "Votre licence expire le [b]31/12[/b]. " &
                   + "[hyperlink=https://pbtoolboxai.net]En savoir plus[/hyperlink] " &
                   + "ou [action=renew]la renouveler maintenant[/action]."
// event ue_action de uo_text : (string as_key)
choose case as_key
    case "renew" ; of_open_renewal()
end choose

ue_hyperlink est réservé aux URL (le navigateur s'ouvre tout seul) ; [action=id] est le bon choix quand le clic doit rester dans votre application. La variante [invisibleaction=id] déclenche le même ue_action sans l'apparence d'un lien.

Un bloc repliable #

// Deux sections repliables : la seconde commence repliee
uo_recap.is_text = "[b]Commande 2026-0148[/b][br]" &
                   + "[foldarea:[b]Livraison[/b]]Expedie le 12/07, sous 48 heures.[/foldarea]" &
                   + "[foldarea-closed:[i]Mentions legales[/i]]Retour accepte sous 14 jours.[/foldarea]"

// Le bloc se retracte quand une section est repliee
uo_recap.ib_auto_height = true

Un [foldarea:Titre] ajoute un en-tête cliquable au-dessus de son contenu : le lecteur replie la section d'un clic, et le marqueur passe de − à +. [foldarea-closed:Titre] produit le même bloc, replié dès l'affichage. Les blocs s'imbriquent, et le repli ne remonte aucun event : c'est une affaire de lecture, pas de code. Si ib_auto_height est actif, la hauteur est renotifiée à chaque repli. Le titre est du texte à balises : [foldarea:[b][accent]Commande 2026-0148[/accent][/b]] met le sien en gras et à la couleur d'accent.

Un bandeau défilant #

// Le message du bandeau
uo_banner.is_text = "[b]Information[/b] -- fermeture exceptionnelle du service le vendredi 12."

// Mode defilant, facon fil d'actualite
uo_banner.ib_marquee = true
uo_banner.ii_marquee_speed = 90        // pixels par seconde
uo_banner.is_marquee_direction = uo_banner.MARQUEE_START

Le défilement boucle sans temps mort. Pour l'arrêter, repassez ib_marquee à false : le texte reprend sa mise en page normale.

Une fois ib_track_cycle = true posé, l'événement ue_cycle est déclenché à chaque passage complet du texte — pratique pour faire tourner plusieurs messages :

// Dans ue_cycle du bandeau : passer au message suivant
ii_message = Mod(ii_message, UpperBound(is_messages)) + 1
uo_banner.is_text = is_messages[ii_message]

Une zone de dépôt de fichiers #

// Accepter les fichiers glisses depuis l'Explorateur Windows
uo_zone.ib_allow_drop = true

// Ce que la zone affiche, centre
uo_zone.is_text = "[size=32][accent][b]Deposez vos fichiers ici[/b][/accent][/size][br][br]" &
                  + "Glissez un ou plusieurs fichiers depuis l'Explorateur Windows."
uo_zone.is_align  = uo_zone.ALIGN_CENTER
uo_zone.is_valign = uo_zone.VALIGN_CENTER
// event ue_drop_files de uo_zone : (string as_files[])
integer li

// Chaque fichier depose, l'un apres l'autre
for li = 1 to UpperBound(as_files)
    of_import(as_files[li])       // as_files[li] = chemin COMPLET du fichier
next
// event ue_drag_enter de uo_zone : signaler la cible pendant le survol
uo_zone.il_border_color = RGB(/*red*/ 21, /*green*/ 101, /*blue*/ 192)
uo_zone.ii_border_width = 2

Les chemins reçus sont complets : vous pouvez les passer directement à FileOpen ou à votre routine d'import.

Un libellé qui se comporte comme un bouton #

// Un texte qui se comporte comme un bouton-lien
uo_link.is_text = "Tout selectionner"
uo_link.il_text_color = RGB(/*red*/ 21, /*green*/ 101, /*blue*/ 192)
uo_link.ii_padding = 8
uo_link.ii_corner_radius = 6
uo_link.ib_hover_effect = true       // reagit au survol comme un bouton
// event ue_clicked de uo_link
of_select_all()

Un journal qui s'écrit ligne à ligne #

Chaque appel n'envoie que la ligne ajoutée ; ib_follow_end garde la dernière en vue tant que le lecteur ne remonte pas.

// Once, when the window opens
uo_log.ib_follow_end = true
uo_log.is_text = "[b]Import[/b]"

// For every row imported : one line, sent alone
uo_log.of_append_text(/*markup*/ "Row " + String(ll_row) + " [color=#2e7d32]imported[/color]")

Une étiquette à la largeur de son texte #

// A status chip : background, rounded corners, and the width of its text
uo_status.is_text = "[b]Status :[/b] connected"
uo_status.il_back_color = RGB(/*red*/ 232, /*green*/ 245, /*blue*/ 233)
uo_status.ii_corner_radius = 12
uo_status.ib_auto_width = true

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_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

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