PBToolboxAI v5 ← Site

chartcartesian — u_pbt_chartcartesian #

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

Graphique cartésien : colonnes, barres, lignes, aires et nuages de points, sur un axe de catégories et un ou deux axes de valeurs. Le type se règle par série.

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


En bref #

Userobjectu_pbt_chartcartesian
Classe d'itemsn_pbt_chartcartesian_series (of_item(key)) · n_pbt_chartcartesian_axis (of_axis(axis))
Sert àComparer des valeurs le long d'un axe — mois, produits, régions
PrincipeVous posez les catégories puis les séries ; les échelles, la grille et l'animation sont à nous

Démarrage rapide #

// Local variables
string ls_months[] = {"Jan", "Feb", "Mar", "Apr", "May", "Jun"}
double ld_sales[] = {420, 510, 480, 620, 700, 660}

// The categories FIRST : they fix how many values a series carries
uo_chart.of_set_categories(/*labels*/ ls_months)
uo_chart.of_add_series(/*key*/ "sales", /*label*/ "Revenue", /*type*/ u_pbt_chartcartesian.TYPE_BAR, /*values*/ ld_sales)

Le type appartient à la SÉRIE, pas au composant #

C'est la décision qui structure tout le reste. Un composant par type — un pour les barres, un pour les lignes — ne peut jamais produire un combiné : des barres surmontées d'une ligne d'objectif, avec un second axe. C'est pourtant la forme la plus demandée d'un tableau de bord.

Ici il y a un seul composant, et chaque série porte son is_type (TYPE_BAR, TYPE_LINE, TYPE_AREA, TYPE_SCATTER, TYPE_STEPLINE). Changer le type d'une série ne touche pas les autres.

ib_secondary place une série sur le second axe de valeurs. C'est ce qui permet à un nombre de commandes et à un chiffre d'affaires de cohabiter : sans lui, l'un des deux est une ligne plate au ras de l'axe.

of_set_categories vient avant les séries : leur nombre fixe combien de valeurs chaque série doit porter.

// Local variables
double ld_target[] = {400, 500, 550, 600, 680, 720}

// Bars and a line in the SAME chart : the type belongs to the series
uo_chart.of_add_series(/*key*/ "target", /*label*/ "Target", /*type*/ u_pbt_chartcartesian.TYPE_LINE, /*values*/ ld_target)

// And its own scale, when the two do not share a unit
uo_chart.of_item(/*key*/ "target").ib_secondary = true

Propriétés #

PropriétéTypeDéfautRôle
is_titlestring""Titre du graphique, affiché au-dessus
ib_show_legendbooleantrueAffiche la légende. Cliquer une entrée masque sa série — le moyen le moins cher de comparer deux séries sur cinq
is_legend_locationstringbottomOù va la légende (constantes LEGEND_*) : au-dessus ou au-dessous du tracé, ou à côté — START/END la posent en colonne sur un côté, et le tracé lui cède la place. START/END sont logiques : ils suivent le sens de lecture. Une position inconnue vaut le bas, et se relit telle
ib_show_gridbooleantrueLes traits de fond, à chaque valeur ronde. Sans eux, seule la forme reste lisible, jamais une valeur
ib_value_tooltipbooleantrueLe panneau des valeurs : quand la souris passe sur une catégorie, toutes les séries et leur valeur à cet endroit, d'un coup, et un réticule marque la colonne. Ce n'est pas is_tooltip (hérité), qui est l'infobulle du composant entier — celui-ci suit le pointeur et dit de quoi le graphique est fait. Chaque série écrit sa ligne avec son propre is_label_format ; une valeur absente n'a pas de ligne. L'info-bulle d'une série (son is_tooltip) s'écrit dans ce panneau, sous la ligne de la série pointée, même à false
is_orientationstringverticalColonnes ou barres (constantes ORIENTATION_*). Fait pivoter tout le repère, lignes et aires comprises
ib_stackedbooleanfalseEmpile les séries de barres au lieu de les mettre côte à côte ; les séries d'aires s'empilent entre elles — jamais les barres avec les aires. Une ligne ne s'empile jamais : elle dit un niveau. Les barres du second axe forment leur propre pile, à côté de celle de l'axe principal
is_stack_modestringvalueSomme ou part (constantes STACK_*). En percentage, chaque pile est ramenée à 100 : l'axe lit alors des parts et non des totaux — jusqu'à -100 quand des parts sont négatives. Ne veut rien dire hors empilement
ib_enabledbooleantrueGrisé : le composant continue de montrer ce qu'il montre — un graphique sans données n'est pas la même chose qu'un graphique que l'application a éteint — mais il cesse de répondre : ni clic, ni touche, ni entrée de légende, et il sort de l'ordre de tabulation. true par défaut
ib_animatedbooleantrueLe graphique arrive animé : les formes montent de l'axe — tout le graphique quand il passe de vide à dessiné et quand une série s'ajoute. De nouvelles valeurs glissent à leur place, et une forme qu'un graphique en direct pousse (of_append_values) monte seule : un tableau de bord qui se rafraîchit peut garder l'animation. Un poste réglé sur « moins d'animations » n'anime pas, sauf si l'application insiste (PBT_SetAnimationPolicy, section 4.8)
ii_anim_durationinteger450Durée de cette arrivée, en millisecondes (0 à 5000)
is_anim_easingstringease-outCourbe de l'arrivée (constantes EASING_*) : linear, ease-out, back-out qui dépasse puis revient, bounce-out qui rebondit, elastic-out qui claque. C'est elle qui donne son caractère à l'animation
ii_anim_delayinteger0Décalage entre deux séries à l'arrivée, en millisecondes (0 à 1000). Elles entrent alors l'une après l'autre au lieu de surgir ensemble, ce qui donne le sens de lecture du graphique. 0 = toutes en même temps
is_formatstring""Le format de tous les nombres que le graphique écrit — axes de valeurs, étiquettes et panneau des valeurs — dans la syntaxe d'un format de DataWindow : #,##0.00, $#,##0, #,##0 "unités", sections positif;négatif;zéro. Les séparateurs sont ceux de la langue d'affichage. Un axe peut porter le sien (of_axis(AXIS_VALUE2).is_format), qui passe devant celui-ci. Vide (ou un format qui n'est pas numérique) = le nombre tel quel, au millième
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 = accent 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_set_categories ( string as_labels[] )Les libellés de l'axe des catégories — du texte : une balise qu'ils contiennent est retirée, l'axe, le panneau et #x# disent la même chose. À appeler avant les séries. Renvoie 0 une fois appliqué, -2 si le composant n'est pas créé
of_set_value_labels ( string as_labels[] )Des libellés sur l'axe des valeurs. Vide — le cas normal — cet axe porte des nombres. Rempli, il porte des bandes comme l'axe des catégories : le repère à deux catégories dans lequel se dessine une carte de chaleur. Renvoie 0 une fois appliqué, -2 si le composant n'est pas créé
of_get_value_labels ( ref string as_labels[] )Remplit as_labels[] avec ce que l'axe des valeurs porte maintenant et renvoie le nombre. Zéro = il porte des nombres ; un libellé qui contient `` se relit entier
of_get_categories ( ref string as_labels[] )Remplit as_labels[] avec les catégories que le graphique porte maintenant — après qu'of_append_categories a retiré les plus anciennes, après qu'of_from_datastore les a lues — et renvoie leur nombre
of_get_last_error ( )Pourquoi le dernier appel a été refusé (un rôle de of_map que les lignes n'ont pas, une borne NULL, une position hors d'une série…), ou combien de lignes le dernier of_from_datastore a écartées et pourquoi ; sinon la dernière erreur de la DLL, comme pour tout composant
of_add_heat_series ( string as_key, string as_label, long al_x[], long al_y[], double ad_weight[] )Une carte de chaleur : une cellule par couple (catégorie, libellé de valeur), colorée par son poids. al_x est le rang de la catégorie et al_y celui du libellé, à partir de 1 — les rangs d'un tableau PowerScript, qu'une double boucle écrit sans calcul. Poser les deux listes de libellés avant. Un poids NULL est une case vide : rien n'y est dessiné, étiqueté ni cliquable. Renvoie 0 une fois ajoutée, -5 si la clé est vide, contient / ou `, ou est déjà prise, -2` si le composant n'est pas créé
of_add_ohlc_series ( string as_key, string as_label, double ad_open[], double ad_high[], double ad_low[], double ad_close[] )Une série OHLC : l'étendue du bas au haut, un tiret à gauche pour l'ouverture et un à droite pour la clôture. Quatre nombres par point, et l'axe se lit sur le haut et le bas — les deux autres sont dedans par construction. Les quatre tableaux sont tronqués au plus court. Renvoie 0 une fois ajoutée, -5 si la clé est vide, contient / ou `, ou est déjà prise, -2` si le composant n'est pas créé
of_add_candle_series ( string as_key, string as_label, double ad_open[], double ad_high[], double ad_low[], double ad_close[] )Les mêmes quatre nombres, dessinés en chandeliers : une mèche du bas au haut, et un corps plein entre l'ouverture et la clôture. Un doji — ouverture égale à clôture — garde un pixel de corps, pour rester une ligne que l'œil retrouve. Renvoie 0 une fois ajoutée, -5 si la clé est vide, contient / ou `, ou est déjà prise, -2` si le composant n'est pas créé
of_set_series_ohlc ( string as_key, double ad_open[], double ad_high[], double ad_low[], double ad_close[] )De nouveaux cours pour une série financière déjà tracée. Ce que of_set_series_values est à une série de valeurs. Renvoie 0 une fois appliqué, -5 si aucune série ne porte cette clé ou si elle n'est pas financière, -2 si le composant n'est pas créé
of_get_series_ohlc ( string as_key, ref double ad_open[], ref double ad_high[], ref double ad_low[], ref double ad_close[] )Remplit les quatre tableaux avec ce que la série porte maintenant et renvoie le nombre de points. Une série non financière renvoie 0
of_add_series ( string as_key, string as_label, string as_type, double ad_values[] { , long al_color } )Ajoute une série avec son type — TYPE_BAR, TYPE_LINE, TYPE_AREA, TYPE_SCATTER ou TYPE_STEPLINE ; la surcharge prend aussi sa couleur (RGB()), sinon la palette choisit. Une valeur NULL (SetNull) est un trou : rien n'est dessiné, étiqueté ni cliquable à cet endroit, et une ligne s'y interrompt. Une clé déjà tenue est refusée, jamais remplacée : of_set_series_values et la poignée of_item changent une série qui existe. Renvoie 0 une fois ajoutée, -5 si le type n'est pas l'un de ces cinq (une carte de chaleur et les séries financières ont leur méthode), ou si la clé est vide, contient / ou `, ou est déjà prise, -2` si le composant n'est pas créé
of_set_series_values ( string as_key, double ad_values[] )De nouvelles valeurs pour une série déjà tracée, le reste inchangé. C'est l'appel d'un tableau de bord qui vit : la série garde son identité, donc les formes glissent au lieu de sauter. Une valeur NULL est un trou. Renvoie 0 une fois appliqué, -5 si aucune série ne porte cette clé ou si elle porte des points ou des cotations (of_set_series_points, of_set_series_ohlc les remplacent), -2 si le composant n'est pas créé
of_set_point_color ( string as_key, long al_position, long al_color )La couleur d'un point — le mois qui a dépassé sa limite, en rouge. al_position compte à partir de 1 ; -1 (ou NULL) rend au point la couleur de sa série. Barres, marqueurs de ligne et points de nuage la prennent, et elle glisse avec son point dans un graphique en direct. Renvoie 0 une fois appliqué, -5 si aucune série ne porte cette clé, si la position est hors de la série, ou pour une carte de chaleur ou une série financière (leurs couleurs sont leur rampe et leur sens), -2 si le composant n'est pas créé
of_get_point_color ( string as_key, long al_position )Renvoie la couleur (un long RGB()) qu'of_set_point_color — ou une colonne ROLE_COLOR — a donnée au point al_position, compté à partir de 1, ou -1 quand il n'en a pas (il prend la couleur de sa série), et pour une clé ou une position inconnue
of_append_values ( string as_key, double ad_values[], long al_max_points )Un graphique en direct : pousse de nouvelles valeurs à la fin d'une série et retire les plus anciennes dès qu'elle en porte plus de al_max_points (0 = sans limite). Seules les nouvelles valeurs voyagent — la série n'est pas renvoyée à chaque tic. À coupler avec of_append_categories. Les nouvelles formes montent seules, les autres glissent. Poussez chaque série, avec le même maximum que of_append_categories : une série oubliée se décale de ses catégories. Renvoie 0 une fois appliqué, -5 si aucune série ne porte cette clé ou si elle porte des points ou des cotations, -2 si le composant n'est pas créé
of_append_categories ( string as_labels[], long al_max_count )De nouvelles catégories à la fin de l'axe, les plus anciennes retirées au-delà de al_max_count (0 = sans limite) : les libellés d'un graphique en direct glissent avec ses valeurs. Poussez chaque série avec of_append_values et le même maximum. Renvoie 0 une fois appliqué, -2 si le composant n'est pas créé
of_add_point_series ( string as_key, string as_label, double ad_x[], double ad_y[] { , double ad_weight[] } )Une série positionnée par valeur sur les deux axes : x dit où le long de l'axe des catégories, y à quelle hauteur. Cet axe cesse alors d'être un axe de catégories — il devient un second axe de valeurs, avec ses propres graduations. Une surcharge prend un poids par point, qui donne la taille de la bulle. Un poids NULL garde la taille par défaut, hors de l'échelle des autres. Ne mélangez pas ces séries avec des séries de valeurs sur un graphique de catégories : les libellés des catégories laissent la place aux graduations. Renvoie 0 une fois ajoutée, -5 si la clé est vide, contient / ou `, ou est déjà prise, -2` si le composant n'est pas créé
of_set_series_points ( string as_key, double ad_x[], double ad_y[], double ad_weight[] )De nouveaux points pour une série qui en porte déjà. Ce que of_set_series_values est à une série de valeurs. Renvoie 0 une fois appliqué, -5 si aucune série ne porte cette clé ou si elle porte des valeurs ou des cotations, -2 si le composant n'est pas créé
of_get_series_points ( string as_key, ref double ad_x[], ref double ad_y[], ref double ad_weight[] )Remplit les trois tableaux avec ce que la série porte maintenant et renvoie le nombre de points. Une série de valeurs ne rend rien dans ad_x : elle n'a pas d'abscisse à elle
of_get_series_values ( string as_key, ref double ad_values[] )Remplit ad_values[] avec ce que la série porte maintenant et renvoie le nombre. Lecture vive : elle interroge le graphique, pas le dernier envoi
of_remove_series ( string as_key )Retire une série ; les autres gardent leur couleur — prise à leur ajout — et leur visibilité ; son info-bulle et ses couleurs d'item partent avec elle. Sa poignée (of_item) est détruite avec elle : un of_item suivant sur la même clé en crée une neuve. Renvoie 0 une fois retirée, -5 si aucune série ne porte cette clé, -2 si le composant n'est pas créé
of_clear ( )Vide le graphique — séries et catégories ; les poignées de série partent avec elles. Les axes gardent leurs réglages et leurs sections. Renvoie 0 une fois vidé, -2 si le composant n'est pas créé
of_from_datastore ( datastore ads )Nourrit le graphique depuis un DataStore (un DataWindow, un DataWindowChild : surcharges), comme le graphe d'un DataWindow : une colonne de catégories, une colonne de valeurs et, s'il y en a une, une colonne de séries — une série par valeur trouvée, une série nommée d'après la colonne des valeurs sans elle. Les lignes qui partagent une catégorie et une série sont sommées ; les catégories viennent dans l'ordre des lignes (triez le DataStore) ; une catégorie sans ligne est un trou. Une colonne de couleur colore son point. Une colonne joue un rôle quand elle porte son nom (category, series, value, color) ou quand of_map le dit ; nombres et dates du poste sont lus juste. Redonné, le graphique change en place : une série garde son type, sa couleur et son axe, une série ajoutée à la main n'est jamais touchée ; une nouvelle série est une barre. Renvoie 0 une fois chargé (les lignes dont la série ne peut pas être une clé sont sautées : of_get_last_error dit combien), -5 si le DataStore n'est pas valide ou qu'aucune colonne ne joue ROLE_CATEGORY ou ROLE_VALUE (of_get_last_error dit laquelle), -2 si le composant n'est pas créé
of_map ( string as_role, string as_column )Donne un rôle à une colonne du DataStore (ROLE_CATEGORY, ROLE_SERIES, ROLE_VALUE, ROLE_COLOR) quand son nom ne le dit pas. Avant of_from_datastore, ou après : les lignes sont relues. Une colonne vide rend le rôle à la colonne qui porte son nom. Renvoie 0 une fois posé, -5 si le rôle n'est pas une constante ROLE_ ou si la colonne n'est pas l'une du dernier DataStore, -2 si le composant n'est pas créé
of_reload ( )Relit les lignes du DataStore (ou du DataWindow) donné à of_from_datastore — après un Retrieve, une saisie, un filtre — et change le graphique en place : les formes glissent vers leurs nouvelles valeurs. Renvoie 0 une fois relu, -5 si aucun DataStore n'a été donné ou s'il n'est plus valide, -2 si le composant n'est pas créé
of_item ( string as_key )Renvoie la poignée d'une série, pour la modifier ensuite
of_axis ( string as_axis )Renvoie la poignée d'un axe (AXIS_CATEGORY, AXIS_VALUE, AXIS_VALUE2), pour le régler ensuite. Tout autre rôle ne rend aucune poignée (IsValid() est faux)
of_add_axis_section ( string as_axis, string as_key, double ad_from, double ad_to, long al_color )Une bande en travers du tracé, derrière les données : « sous 200 c'est mauvais ». Dessinée sous les formes, elle ne leur fait jamais concurrence. Sur l'axe des catégories, ad_from et ad_to sont des positions comptées à partir de 1 (2 à 3 couvre la deuxième et la troisième catégorie). Une couleur -1 (ou NULL) est un lavis pâle de l'accent du thème. Renvoie 0 une fois ajoutée, -5 si l'axe n'est pas l'un des AXIS_*, si une borne est NULL ou si la clé est vide, contient / ou `, ou est déjà prise sur cet axe, -2` si le composant n'est pas créé
of_add_axis_threshold ( string as_axis, string as_key, double ad_at, long al_color, integer ai_thickness )Une ligne en travers du tracé à une valeur — un objectif, une limite. Même registre que les bandes, mais dessinée pour être vue. Une couleur -1 (ou NULL) la trace dans l'accent du thème. Renvoie 0 une fois ajoutée, -5 si l'axe n'est pas l'un des AXIS_*, si une borne est NULL ou si la clé est vide, contient / ou `, ou est déjà prise sur cet axe, -2` si le composant n'est pas créé
of_clear_axis_sections ( string as_axis )Retire toutes les bandes et tous les seuils d'un axe. Renvoie 0 une fois vidé, -5 si l'axe n'est pas l'un des AXIS_*, -2 si le composant n'est pas créé
of_remove_axis_section ( string as_axis, string as_key )Retire une bande ou un seuil d'un axe : les autres restent. Renvoie 0 une fois retiré, -5 si l'axe n'est pas l'un des AXIS_* ou ne porte aucune section de cette clé, -2 si le composant n'est pas créé
of_reset ( )Vide le graphique — poignées de série et d'axe comprises — et remet toutes les propriétés à leur valeur d'origine. Renvoie 0 une fois fait, -2 si le composant n'est pas créé

Sans clé (mode démo), le graphique ne dessine que ses 3 premières séries, légende comprise. Les autres restent dans le modèle — of_count, of_get_series_values et leurs poignées les voient — et la clé posée les montre sans que vous ayez rien à renvoyer.


Événements #

ÉvénementDéclenché quand
ue_point_clicked (string as_key, long al_index, double ad_value)Une barre, un point, une case ou une cotation a été cliqué — ou validé par Entrée : la clé de la série, la position du point dans la série, à partir de 1, et sa valeur — celle du point quelle que soit la forme de la série : le y d'un nuage, le poids d'une case de chaleur, la clôture d'une cotation. Au clavier, Gauche/Droite parcourent les catégories et Haut/Bas choisissent la série que le panneau souligne ; une série de points ou une carte de chaleur choisie se parcourt point par point. Un trou n'a rien à cliquer ; le point où est le clavier est cerclé, et dit au lecteur d'écran
ue_point_rclicked (string as_key, long al_index, double ad_value, long al_x, long al_y)Un clic droit sur une barre, un point, une case ou une cotation — ou la touche Menu (Maj+F10) sur le point où est le clavier : la clé de la série, la position à partir de 1 et la valeur, comme ue_point_clicked les donne. C'est là qu'on ouvre son menu ; al_x, al_y : où ouvrir le menu, en pixels d'écran — le pointeur, ou le milieu de la forme du point au clavier (touche Menu, Maj+F10) ; un contextmenu s'y ouvre tel quel (uo_menu.of_show(al_x, al_y))
ue_rclicked ( )Un clic droit sur le graphique là où aucun point n'est dessiné — les axes, le tracé vide, la légende. Un clic droit sur un point lève ue_point_rclicked à la place, jamais les deux
ue_series_toggled (string as_key, boolean ab_visible)L'utilisateur a masqué ou remontré une série d'un clic dans la légende. Ce que le graphique affiche n'est alors plus ce que l'application a envoyé. Poser ib_visible est une valeur, comme cocher une case : cet événement rapporte le geste de l'utilisateur

L'animation est une entrée, pas un calcul : la géométrie finale est posée tout de suite, et seule l'arrivée est jouée. Un graphique jamais affiché — né hors écran, dans un onglet que personne n'ouvre — montre donc les bonnes barres, en silence.


Propriétés d'item #

PropriétéTypeDéfautRôle
is_labelstring""Le nom de la série, tel que la légende l'affiche
is_typestringbarbar · line · area · scatter · stepline (constantes TYPE_*). Change le dessin de cette série seule — c'est ce qui fait un graphique combiné. Seul un type de la même famille est pris : une série de valeurs parmi bar, line, area, scatter et stepline, une série financière entre ohlc et candle ; un autre est ignoré et is_type relit le type gardé
il_colorlong-1Couleur de la série (RGB()). -1 tant qu'aucune n'est posée : la palette choisit, au moment de l'ajout, et la série la garde : retirer une autre série ne la recolore jamais. Un point peut prendre la sienne (of_set_point_color). Les couleurs d'item héritées (il_accent, il_back_color, il_text_color et leurs variantes de survol) n'ont aucun effet sur une série : il_color décide
ib_visiblebooleantruefalse masque une série sans la retirer — la légende garde le chemin du retour. Comme une case à cocher, c'est une valeur posée : ue_series_toggled rapporte, lui, le clic de l'utilisateur dans la légende
ib_secondarybooleanfalseTrace la série sur le second axe. C'est ainsi qu'un nombre et un montant vivent sur le même graphique
ib_data_labelsbooleanfalseÉcrit la valeur de chaque point à côté de lui. Éteint par défaut : sur cinquante points, les étiquettes couvrent le dessin qu'elles expliquent
is_label_formatstring""Ce que dit chaque étiquette et chaque ligne du panneau : #y# la valeur, #x# la catégorie (le x d'une série de points, la colonne d'une case de chaleur), #v# la ligne d'une case de chaleur, #label# le nom de la série, #open# #high# #low# #close# les cours ; le reste s'écrit tel quel — "$#y#K". Vide = la valeur seule. Une étiquette écrite dans une barre empilée prend le noir ou le blanc que sa barre porte
id_smoothnessdouble1Lignes et aires seulement : à quel point la ligne est arrondie, 0 = des segments droits, 1 = pleinement courbe, à la manière de LiveCharts. Un escalier l'ignore — il dit que le niveau a TENU jusqu'à la catégorie suivante, une courbe dirait qu'il a dérivé. Une courbe peut passer au-delà de ses points ; elle est découpée au cadre du tracé et ne peint jamais sur les libellés des axes
ib_fillbooleantrueLignes et aires : le lavis sous le trait, jusqu'à l'axe, dans la teinte de la série. C'est le retrait qui est l'acte délibéré — pour une ligne posée par-dessus autre chose (des colonnes, des bandes d'axe colorées) que le lavis cacherait
il_fill_colorlong-1La couleur de ce lavis. -1 = celle de la ligne elle-même
is_markerstring"circle"Lignes, escaliers et nuages : la FORME du marqueur posé sur chaque point (constantes MARKER_* : none, circle, square, triangle, diamond). Ce n'est pas de la décoration — deux lignes qui se croisent, imprimées en gris, se distinguent par leur marqueur et par rien d'autre
ii_thicknessinteger2Lignes et aires : l'épaisseur du trait, en pixels
il_point_countlong0Combien de points cette série porte — des valeurs, des couples (x, y) ou des cotations (lecture seule). Un long : une série en direct peut en garder plus de 32 767
il_cold_colorlong-1Cartes de chaleur seulement : la borne FROIDE de la rampe, celle de la lecture la plus légère. -1 = la rampe du composant, un seul bleu, du très pâle au soutenu
il_mid_colorlong-1La borne MÉDIANE. Trois bornes et non deux : interpoler d'un bout à l'autre délave le milieu de l'échelle, là où se tiennent la plupart des lectures. -1 = le bleu moyen du composant
il_hot_colorlong-1La borne CHAUDE, celle de la lecture la plus lourde. C'est elle que la légende affiche. -1 = le bleu soutenu du composant
il_up_colorlong-1Séries financières seulement : la couleur d'un point qui clôture au-dessus de son ouverture. -1 = le vert du composant
il_down_colorlong-1Et celle d'un point qui clôture en dessous. Deux couleurs parce que le sens est ce qu'on lit sur un tel graphique — une seule le masquerait. -1 = le rouge du composant
is_tooltipstring""Son info-bulle, écrite dans le panneau des valeurs, juste sous la ligne de la série — seulement quand c'est la série pointée (sa barre, son point ou sa ligne sous la souris, ou la série choisie au clavier par Haut / Bas), jamais pour les autres séries de la colonne, jamais en seconde bulle. Une colonne survolée là où aucune forme n'est dessinée ne pointe aucune série. Avec ib_value_tooltip à false, le panneau s'ouvre quand même pour elle, sans les chiffres. Une série de points ou une carte de chaleur la montre dans le panneau que le clavier ouvre sur son point. Balisage accepté
is_super_tooltip_titlestring""Le titre en gras de son info-bulle, écrit dans le panneau sous sa ligne
is_super_tooltip_textstring""Le texte de son info-bulle, dans le panneau. Balisage accepté
is_super_tooltip_imagestring""Une image en tête de son info-bulle, dans le panneau (chemin du bundle, chemin absolu ou resources.dll:nom)

Propriétés d'axe #

PropriétéTypeDéfautRôle
is_titlestring""Titre écrit le long de l'axe. Vide = pas de titre, et pas de place réservée pour un. L'info-bulle et les couleurs d'item qu'une poignée d'axe hérite (is_tooltip, is_super_tooltip_*, il_accent, il_back_color, il_text_color…) n'ont aucun effet sur un axe
id_mindoubleNULLBorne basse imposée. Elle l'emporte sur les données et n'est pas arrondie : qui écrit 0 veut 0. NULL (SetNull) n'impose rien : l'axe suit à nouveau ses données, et une borne libre se relit NULL (IsNull), jamais 0. Libre, un axe de valeurs ne prend zéro que si une barre ou une aire s'y tient : des cours et des lignes se lisent sur leur propre étendue
id_maxdoubleNULLBorne haute imposée, même règle. Ce qui la dépasse est coupé au bord du tracé
id_stepdouble0Distance entre deux lignes de grille, en valeurs. 0 = un pas rond lu dans l'étendue
ii_label_rotationinteger0Rotation des libellés de cet axe, en degrés (-90 à 90) — noms de catégories ou graduations de valeurs. Douze noms de mois ne tiennent sous un graphique qu'inclinés ; quand ils ne tiennent toujours pas, le graphique en écrit un sur N, le premier et le dernier toujours
ib_separatorbooleantrueSes lignes de grille. Un axe de catégories en a rarement besoin, un axe de valeurs presque toujours
ii_section_countinteger0Combien de bandes et de seuils cet axe porte (lecture seule)
ib_logarithmicbooleanfalseAxes de valeurs seulement : une échelle logarithmique, graduée par décades (1, 10, 100…), chaque décade de la même hauteur — pour des chiffres qui couvrent plusieurs ordres de grandeur. Zéro et les valeurs négatives n'y ont pas de place et ne sont pas dessinés
is_formatstring""Le format de cet axe — ses graduations, et les étiquettes et le panneau des séries tracées dessus — par-dessus le is_format du graphique : un montant d'un côté, un nombre de commandes de l'autre. Même syntaxe (#,##0, 0.0 "u"…). Vide = le format du graphique

Exemples #

Régler l'animation selon l'écran #

// A dashboard that refreshes every few seconds : no arrival animation
uo_chart.ib_animated = false

// Elsewhere, a slower arrival that is actually seen
uo_chart.ii_anim_duration = 1200

Ouvrir les lignes derrière un point #

// Event ue_point_clicked of uo_chart : the series key, the position of the
// point (from 1) and its value - enough to open the rows behind it
// Local variables
string ls_month

// On a series of values, the position IS the rank of the category
ls_month = is_months[al_index]
wf_open_orders(/*series*/ as_key, /*month*/ ls_month, /*amount*/ ad_value)

Un tableau de bord qui vit #

// Timer event of the window : new values for the same series, so the bars
// SLIDE to their new height instead of replaying their arrival
// Local variables
double ld_sales[]

// Read the figures, then hand them to the series already on the chart
ld_sales = wf_read_sales()
uo_chart.of_set_series_values(/*key*/ "sales", /*values*/ ld_sales)

Un graphique en direct qui glisse #

// Timer event of the window, every second : ONE new reading. Only that value
// travels ; past sixty, the oldest leaves on both the axis and the series
// Local variables
string ls_time[]
double ld_cpu[]

// The time of the reading on the axis, the reading itself in the series
ls_time[1] = String(Now(), "hh:mm:ss")
ld_cpu[1] = wf_read_cpu()
uo_chart.of_append_categories(/*labels*/ ls_time, /*max_count*/ 60)
uo_chart.of_append_values(/*key*/ "cpu", /*values*/ ld_cpu, /*max_points*/ 60)

Une mesure manquante, et le graphique en image #

// March was not measured : a NULL value is a gap, the line is cut there
// Local variables
double ld_temp[] = {18.5, 19.2, 0, 21.4}

// The third reading is missing : NULL, not zero
SetNull(ld_temp[3])
uo_chart.of_add_series(/*key*/ "temp", /*label*/ "Temperature", /*type*/ u_pbt_chartcartesian.TYPE_LINE, /*values*/ ld_temp)

// The chart as it is on screen, title and legend included, to a PNG file
uo_chart.of_save_as_png(/*path*/ "C:\Reports\temperature.png")

Une bande et un objectif sur l'axe des valeurs #

// A pale red band below 200 and a target line at 600, behind the bars
uo_chart.of_add_axis_section(/*axis*/ u_pbt_chartcartesian.AXIS_VALUE, /*key*/ "low", /*from*/ 0, /*to*/ 200, /*color*/ RGB(/*red*/ 255, /*green*/ 220, /*blue*/ 220))
uo_chart.of_add_axis_threshold(/*axis*/ u_pbt_chartcartesian.AXIS_VALUE, /*key*/ "target", /*at*/ 600, /*color*/ RGB(/*red*/ 200, /*green*/ 70, /*blue*/ 70), /*thickness*/ 2)

// The value axis says what it measures
uo_chart.of_axis(/*axis*/ u_pbt_chartcartesian.AXIS_VALUE).is_title = "Sales ($K)"

Un graphique nourri par un DataStore #

// The month on the category axis, one series per product category, the amounts
// of the rows summed by the chart - what the graph of a DataWindow does
// Local variables
datastore lds_sales

// Your DataStore and its Retrieve, sorted : the categories come in the order of the rows
lds_sales = create datastore
lds_sales.DataObject = "d_sales"
lds_sales.SetTransObject(SQLCA)
lds_sales.Retrieve()
lds_sales.SetSort("month A")
lds_sales.Sort()

// Which column plays which role, then ONE call reads every row
uo_chart.of_map(/*role*/ u_pbt_chartcartesian.ROLE_CATEGORY, /*column*/ "month")
uo_chart.of_map(/*role*/ u_pbt_chartcartesian.ROLE_SERIES, /*column*/ "category")
uo_chart.of_map(/*role*/ u_pbt_chartcartesian.ROLE_VALUE, /*column*/ "amount")
uo_chart.of_from_datastore(/*ads*/ lds_sales)

// Later, the rows changed (an edit, a new Retrieve) : read again IN PLACE, the
// bars slide and every series keeps what you set on it
lds_sales.Retrieve()
uo_chart.of_reload()

La couleur d'un point, un menu sur un autre #

// May passed its limit : ONE bar of the series in red, the others keep their colour
uo_chart.of_set_point_color(/*key*/ "sales", /*position*/ 5, /*color*/ RGB(/*red*/ 200, /*green*/ 40, /*blue*/ 40))
// Event ue_point_rclicked of uo_chart : a menu about the point under the mouse
// Local variables
m_point lm_menu

// Remember which point the menu is about, then open it where the pointer is
is_menu_series = as_key
il_menu_position = al_index
lm_menu = create m_point
lm_menu.m_popup.PopMenu(w_main.PointerX(), w_main.PointerY())
destroy lm_menu

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