PBToolboxAI v5 ← Site

chartpie — u_pbt_chartpie #

← Referencia de componentes · Índice de la guía

Gráfico circular: tarta, anillo o media rueda. Cada ángulo es una parte del todo — la leyenda oculta una porción, las demás ocupan su sitio.

▶ Verlo en vivo — Aplicación de demostración, mosaico Pie chart : la vista previa, el código que lo produce y esta página, lado a lado.


En resumen #

Userobjectu_pbt_chartpie
Clase de elementosn_pbt_chartpie_slice (of_item(key))
Sirve paraMostrar cómo se reparte un todo — ventas por región, incidencias por estado, presupuesto consumido
PrincipioUsted añade porciones (una clave, un nombre, un valor); los ángulos, los porcentajes, la leyenda y la animación son cosa nuestra

Inicio rápido #

// One slice per region : a key, a label and a value
uo_pie.of_add_slice(/*key*/ "north", /*label*/ "North", /*value*/ 420)
uo_pie.of_add_slice(/*key*/ "south", /*label*/ "South", /*value*/ 310)
uo_pie.of_add_slice(/*key*/ "east", /*label*/ "East", /*value*/ 260)

// The share of each region, written on its slice
uo_pie.ib_data_labels = true
uo_pie.is_label_format = "#percent#"

Una porción es una PARTE del todo #

Usted da valores, nunca ángulos: el componente suma las porciones mostradas y da a cada una el ángulo de su parte de esa suma. Ocultar una porción — con un clic en la leyenda, o mediante ib_visible — la cierra en su sitio: las demás se reparten de nuevo la rueda, y #percent#, id_percent y of_total() siguen. Un valor negativo no tiene ángulo: se dibuja como cero y se relee tal como lo dio.

Los ángulos se cuentan en grados, 0 arriba, en el sentido del dibujo: ii_start_angle = -90 e ii_sweep_angle = 180 dan la mitad superior de un círculo — un indicador. La rueda se ajusta al espacio que ocupa ese ángulo: una media rueda se dibuja el doble de grande.


Propiedades #

PropiedadTipoPredeterminadoFunción
is_titlestring""Título del gráfico, encima de la rueda. Se admite marcado
ib_show_legendbooleantrueMuestra la leyenda. Hacer clic en una entrada oculta su porción y lanza ue_slice_toggled
is_legend_locationstringendDónde va la leyenda (constantes LEGEND_*): al lado de la rueda (END, START, en columna) o encima y debajo (TOP, BOTTOM, una junto a otra). START/END son lógicas: siguen el sentido de lectura. Una posición desconocida vale end, y se relee así
ib_legend_valuesbooleanfalseEscribe el valor y la parte de cada porción en la leyenda, tras su nombre
ib_value_tooltipbooleantrueEl panel que nombra la porción bajo el puntero — o la del teclado — con su valor y su parte. No es is_tooltip, la información del componente entero. La información de una porción (su is_tooltip) se escribe en este panel, incluso en false
ib_data_labelsbooleanfalseUna etiqueta por porción, que dice lo que dice is_label_format, donde la pone is_label_position. En una porción demasiado estrecha, la etiqueta se omite en lugar de escribirse sobre sus vecinas
is_label_formatstring""Lo que dice una etiqueta: #value# el valor, #percent# su parte del todo, #label# su nombre (sin marcado), #key# su clave, #total# el total; #participation# dice lo mismo que #percent#. El resto se escribe tal cual. Vacío = solo el valor
is_label_positionstringinsideDónde van las etiquetas (constantes LABEL_*): INSIDE, sobre la porción, en negro o en blanco según lo que se lea encima; OUTSIDE, al lado de la rueda, unidas a su porción por una línea y separadas para que ninguna se solape
id_inner_radiusdouble0El agujero, en fracción del radio: 0 una tarta, 0.6 un anillo (limitado a 0..0,9). La rueda se desliza de una a otro
is_center_textstring""Texto en el agujero de un anillo, se admite marcado. Marcadores: #total# el total de las porciones mostradas (en el formato de números), #count# su número; #hover_label#, #hover_value#, #hover_percent# la porción bajo el puntero o la del teclado — en reposo, el todo: Total, el total, 100 %; #percent:key# y #value:key# la parte y el valor de una porción, al día hagan lo que hagan los valores (un indicador escribe él mismo su «72 %»). Una clave desconocida no escribe nada. En una tarta no se escribe nada
ii_start_angleinteger0Dónde empieza la primera porción, en grados: 0 arriba, 90 a la derecha, -90 a la izquierda (450 se relee 90)
ii_sweep_angleinteger360Qué parte del círculo se reparten las porciones, en grados (limitada a 10..360). Con ii_start_angle = -90, 180 dibuja la mitad superior — un indicador
ib_clockwisebooleantrueLas porciones se suceden en el sentido de las agujas del reloj, o en el otro. Las flechas del teclado siguen el orden del dibujo
is_sortstring"none"El orden del dibujo (constantes SORT_*): NONE el orden en que se dieron las porciones, DESC la mayor primero, ASC la menor primero. La rueda, la leyenda y el teclado lo siguen; el modelo conserva su orden — of_get_values, of_count y los colores de la paleta no se mueven. Un valor desconocido vale none
id_hover_push_outdouble0.08Cuánto sale la porción bajo el puntero — o la del teclado —, en fracción del radio (limitado a 0..0,4). Se suma al id_push_out de la porción. 0 = nada se mueve
ib_track_hoverbooleanfalseSuscripción a ue_slice_hovered: un evento lanzado a cada movimiento del puntero solo se envía a una aplicación que lo ha pedido
is_formatstring""El formato de todos los números que escribe el gráfico — etiquetas, leyenda, panel de valores, texto central — en la sintaxis de un formato de DataWindow: #,##0.00, $#,##0, #,##0 "unidades", secciones positivo;negativo;cero. Los separadores son los del idioma de visualización. Vacío (o un formato que no es numérico) = el número tal cual, a la milésima. Las partes (#percent#) se escriben siempre a la décima
id_others_thresholddouble0Agrupa las porciones pequeñas: toda porción cuya parte del todo esté por debajo de este porcentaje se une a una porción «Otros», dibujada la última en un gris neutro — la leyenda la muestra en su lugar. Los miembros se juzgan sobre todas las porciones, mostradas u ocultas: ocultar una porción grande nunca saca a las pequeñas, y la porción mayor nunca entra. Su clave es OTHERS_KEY ("__others") en todos los eventos, su valor es la suma de sus miembros mostrados, of_others_keys los nombra, of_item(OTHERS_KEY) lee su valor y su parte o la oculta. Una sola porción pequeña conserva su sector. 0 = nunca
ii_others_topinteger0Agrupa por número: las N porciones mayores conservan su sector, todas las demás se unen a «Otros» (dos como mínimo, como con el umbral). Se suma a id_others_threshold: una porción entra en cuanto una de las dos reglas lo dice. 0 = ninguna regla así
is_others_labelstring""El nombre de la porción «Otros». Se admite marcado en la leyenda y el panel de valores; las etiquetas y el resumen leído por un lector de pantalla escriben su texto plano. Vacío = la palabra del idioma de visualización (Others, Otros…)
ib_auto_heightbooleanfalseEl componente anuncia su altura ideal y el userobject se ajusta (ue_auto_height). El ancho la dicta: una media rueda es la mitad de alta
ib_enabledbooleantrueAtenuado, el gráfico sigue mostrando lo que muestra pero deja de responder: ni clic, ni doble clic, ni teclado, ni leyenda, y sale del orden de tabulación
ib_animatedbooleantrueLa rueda llega animada — se abre desde su inicio, porción tras porción — y los nuevos valores se deslizan: los bordes entre las porciones se mueven juntos, la rueda nunca muestra un hueco ni una porción sobre su vecina; una porción quitada se cierra en su sitio. Un equipo configurado para reducir el movimiento nunca anima, y la rueda llega al mismo sitio
ii_anim_durationinteger450Duración de la llegada y de cada movimiento, en milisegundos (limitada a 0..5000)
is_anim_easingstringease-outLa curva del movimiento (constantes EASING_*, los nombres de LiveCharts2): back-out se pasa y vuelve, bounce-out rebota, elastic-out restalla
ii_anim_delayinteger40Solo a la llegada (una rueda que no tenía nada en pantalla), el desfase entre dos porciones, en milisegundos (0 a 1000): la rueda se abre porción tras porción, nunca más de 600 ms después en total, tenga las porciones que tenga. 0 = todas a la vez. Un cambio de valores siempre desliza todas las porciones a la vez
is_theme_stylestring""Estilo visual del componente (constantes THEME_STYLE_*); vacío = el de la aplicación, seguido en cada cambio
is_theme_modestring""Variante clara u oscura (constantes THEME_MODE_*); vacío = la de la aplicación, seguida en cada cambio
il_theme_accentlong-1Color de acento de este componente (-1 = acento del tema)
is_tooltipstring""Información sobre herramientas simple al pasar por encima del componente
is_super_tooltip_titlestring""Título de la información enriquecida (tiene prioridad sobre is_tooltip)
is_super_tooltip_textstring""Texto de la información enriquecida (se acepta marcado enriquecido)
is_super_tooltip_imagestring""Imagen de la información enriquecida

Métodos #

MétodoFunción
of_add_slice ( string as_key, string as_label, double ad_value { , long al_color } )Añade una porción: su clave, su nombre (se admite marcado) y su valor; la sobrecarga con un color lo fija, sin ella elige la paleta (un juego para un tema claro, otro para uno oscuro). Devuelve 0 una vez añadida, -5 si la clave está vacía, contiene / o `, empieza por __ (las claves del propio gráfico, como OTHERS_KEY) o **ya está tomada** (añadir nunca reemplaza una porción), -2` si el componente no está creado
of_clear ( )Quita todas las porciones — sus handles se van con ellas — y olvida las filas de of_from_datastore: un of_map o un of_reload posterior no las trae de vuelta. Los ajustes se quedan, también los roles de of_map; en su lugar se dibuja una rueda vacía. Devuelve 0 una vez vaciado, -2 si el componente no está creado
of_from_datastore (datastore ads)Alimenta el gráfico desde un DataStore: una fila = una porción. Una columna desempeña un rol cuando lleva su nombre (key, label, value, color) o cuando of_map lo dice; hace falta una columna ROLE_VALUE. Sin columna ROLE_KEY, la clave de una porción es su número de fila; con ella, las filas que comparten una clave se suman en una sola porción (el nombre y el color de la primera) — un año de ventas se convierte en una porción por categoría, sin bucle. Números y fechas se leen como la DataWindow los escribe en el puesto (coma decimal, fechas regionales: una fecha pasa a yyyy-mm-dd). Una segunda carga actualiza las porciones en su sitio: una clave que vuelve conserva lo que el usuario y su código le dieron (oculta en la leyenda, desplazada, un color del código, su info-burbuja) y su handle; las porciones de las claves que se fueron se van; las porciones añadidas a mano se quedan, después de las de las filas. Devuelve 0 una vez cargado — una fila cuya clave está vacía, contiene / o `, empieza por __ o está tomada por una porción añadida a mano se descarta, y of_get_last_error dice cuántas —, -5 si el DataStore no es válido, ninguna columna desempeña ROLE_VALUE o una columna nombrada por of_map no está (of_get_last_error la nombra), -2` si el componente no está creado
of_from_datastore (datawindow adw)Lo mismo desde las filas de una DataWindow — la que el usuario ve junto al gráfico. Sus datos se comparten con un DataStore de paso: una DataWindow que no puede compartirlos se rechaza (-5, con el motivo). Devuelve 0 una vez cargado, -5 como arriba, -2 si el componente no está creado
of_from_datastore (datawindowchild adwc)Lo mismo desde las filas de un DataWindowChild (una DataWindow desplegable, un informe anidado). Devuelve 0 una vez cargado, -5 como arriba, -2 si el componente no está creado
of_get_last_error ( )Por qué se rechazó la última llamada (un rol de of_map que las filas no tienen…), o cuántas filas descartó el último of_from_datastore y por qué; si no, el último error de la DLL, como para todo componente
of_get_values ( ref string as_keys[], ref double ad_values[] )Rellena los dos arreglos con las porciones que el gráfico tiene ahora, en el orden en que se dieron (is_sort solo cambia el dibujo), y devuelve su número — lo que lee el gráfico, no lo que se envió
of_item ( string as_key )El handle n_pbt_chartpie_slice de una porción, para leer o cambiar su nombre, valor, color, desplazamiento o visibilidad. of_item(OTHERS_KEY) siempre es válido: la porción «Otros», su valor, su parte, su visibilidad (of_has no la nombra: es del gráfico, no suya). Una clave que el gráfico no tiene da un handle que no cambia nada y lee valores vacíos — una propiedad no puede responder -5: compruebe antes con of_has una clave venida de fuera
of_map ( string as_role, string as_column )Da un rol a una columna cuando su nombre no lo dice: of_map(ROLE_VALUE, "amount"). Roles: ROLE_KEY (las filas de una misma clave se suman), ROLE_LABEL, ROLE_VALUE, ROLE_COLOR (un long RGB() o #rrggbb). Antes de of_from_datastore, o después: las filas se releen entonces en su sitio. La columna la juzga el próximo of_from_datastore (-5 allí si falta); cuando las filas ya dadas no la tienen, no se releen — el rol espera las filas que va a dar, y of_get_last_error lo dice. Una columna vacía devuelve el rol a la columna que lleva su nombre. Devuelve 0 una vez puesto, -5 si el rol no es una constante ROLE_, -2 si el componente no está creado
of_others_keys ( ref string as_keys[] )Rellena el arreglo con las claves de las porciones agrupadas en «Otros» ahora (ver id_others_threshold e ii_others_top), en el orden en que se dieron, y devuelve su número — 0 cuando ninguna porción está agrupada. De lo que trata un clic en OTHERS_KEY
of_reload ( )Relee las filas del último of_from_datastore — tras un Retrieve, tras una edición — y actualiza las porciones en su sitio, como un segundo of_from_datastore. Devuelve 0 una vez releído, -5 si no se dio ninguna fila (o of_clear las olvidó, o el DataStore se destruyó), -2 si el componente no está creado
of_remove_slice ( string as_key )Quita una porción; las demás ocupan su sitio, su handle se destruye. Devuelve 0 una vez quitada, -5 si ninguna porción tiene esa clave, -2 si el componente no está creado
of_set_values ( string as_keys[], double ad_values[] )Nuevos valores para varias porciones en una llamada — lo que un cuadro de mando llama en cada refresco: los bordes entre las porciones se deslizan juntos a sus nuevos ángulos, la rueda nunca abre un hueco. Devuelve 0 una vez aplicado, -5 si los dos arreglos difieren en longitud o una clave no existe (entonces no se aplica nada), -2 si el componente no está creado
of_total ( )El total de las porciones mostradas — lo que vale el 100 % ahora: una porción oculta en la leyenda no cuenta, ni un valor negativo
of_reset ( )Vacía el gráfico — handles de porción incluidos — y devuelve todas las propiedades a su valor de origen. Devuelve 0 una vez hecho, -2 si el componente no está creado

Eventos #

EventoSe dispara cuando
ue_slice_clicked (string as_key, double ad_value)Se ha hecho clic en una porción — o se ha confirmado con Intro o Espacio en la porción del teclado (Tab hasta el gráfico, luego las flechas): su clave y su valor — OTHERS_KEY y la suma de sus porciones para la porción «Otros». El clic se juzga donde la porción reposa: cerca del centro, el hueco que deja una porción señalada al salir sigue siendo suyo. Una porción oculta no tiene nada que pulsar
ue_slice_dblclicked (string as_key, double ad_value)Doble clic en una porción: su clave y su valor — el sitio donde abrir las filas que hay detrás (un desglose: un segundo of_from_datastore con las filas de esa porción). Los dos clics anteriores lanzaron ue_slice_clicked, como en una DataWindow; Intro sigue siendo un clic
ue_slice_rclicked (string as_key, long al_x, long al_y)Clic derecho en una porción, o tecla Menú (Mayús+F10) en la porción del teclado. al_x, al_y: dónde, en píxeles de pantalla — el puntero, o el centro de la porción para la tecla Menú, nunca donde esté el ratón. Un componente contextmenu se abre allí: uo_menu.of_show(al_x, al_y)
ue_slice_toggled (string as_key, boolean ab_visible)El usuario ha ocultado o vuelto a mostrar una porción con un clic en la leyenda (o con Intro / Espacio en su entrada: la leyenda es una sola parada de Tab, las flechas la recorren). La última porción también puede ocultarse: la rueda dice entonces Todas las porciones están ocultas. Lo que el gráfico muestra ya no es entonces lo que la aplicación envió. Poner ib_visible es un valor, como marcar una casilla: este evento informa del gesto del usuario
ue_slice_hovered (string as_key)Solo con ib_track_hover: el puntero o el teclado alcanza otra porción — su clave; una clave vacía cuando las deja todas: el puntero fuera de la rueda, Esc, el foco que sale del gráfico
ue_auto_height (long al_height)Con ib_auto_height: el userobject acaba de redimensionarse a su altura ideal

Propiedades de elemento #

Leídas y escritas en el handle de una porción: uo_pie.of_item(/*key*/ "north").id_value = 450. Cada lectura pregunta al gráfico.

PropiedadTipoPredeterminadoFunción
is_labelstring""El nombre de la porción, tal como lo muestran la leyenda y el panel; vacío = su clave
id_valuedouble0Su valor; su ángulo es su parte del total, y se desliza hasta él
il_colorlong-1Su color; -1 = el color de la paleta. Los colores de elemento heredados (il_accent, il_back_color, il_text_color y sus variantes al pasar el ratón) no tienen efecto sobre una porción: decide il_color
id_push_outdouble0La saca de la rueda para destacarla, en fracción del radio (limitado a 0..0,4)
ib_visiblebooleantrueOculta la porción sin quitarla: las demás se reparten de nuevo la rueda, la leyenda conserva un camino de vuelta
id_percentdouble0Su parte de lo que muestra la rueda, de 0 a 100; 0 cuando está oculta (solo lectura). Cada parte se escribe a la décima: tres porciones iguales leen 33,3 % cada una, 99,9 % juntas — las partes nunca se fuerzan a sumar 100
is_tooltipstring""Su información sobre herramientas, escrita en el panel que nombra la porción bajo el puntero (o la del teclado) — nunca una segunda burbuja. Con ib_value_tooltip en false, el panel se abre igualmente para ella, sin las cifras. Se admite marcado
is_super_tooltip_titlestring""El título en negrita de su información, escrito en el panel bajo su nombre
is_super_tooltip_textstring""El texto de su información, en el panel. Se admite marcado
is_super_tooltip_imagestring""Una imagen en la cabecera de su información, en el panel (ruta del bundle, ruta absoluta o resources.dll:nombre)

Ejemplos #

Un anillo y su total #

// A hole of 60 % of the radius : a doughnut
uo_pie.id_inner_radius = 0.6

// In the hole : the slice under the pointer, in bold above its name ;
// at rest, the total of the slices shown above the word Total
uo_pie.is_center_text = "[b]#hover_value#[/b][br]#hover_label#"

// Whole numbers with a thousands separator : a display format, as in a DataWindow
uo_pie.is_format = "#,##0"

Una media rueda como indicador #

// From the left, over half a circle : the upper half
uo_pie.ii_start_angle = -90
uo_pie.ii_sweep_angle = 180
uo_pie.id_inner_radius = 0.62

// What is spent and what is left, in the colour they mean
uo_pie.of_add_slice(/*key*/ "spent", /*label*/ "Spent", /*value*/ 72, /*color*/ RGB(/*red*/ 15, /*green*/ 108, /*blue*/ 189))
uo_pie.of_add_slice(/*key*/ "left", /*label*/ "Remaining", /*value*/ 28, /*color*/ RGB(/*red*/ 150, /*green*/ 150, /*blue*/ 150))

// The share spent, in the hole : worked out by the chart, it follows every new value
uo_pie.is_center_text = "[b]#percent:spent#[/b][br]spent"

Un cuadro de mando vivo #

// Timer event of the window : new values for the same slices
// Local variables
string ls_keys[] = {"s1", "s2", "s3"}
double ld_load[]

// Read the figures, then hand them to the slices already on the chart : they
// SLIDE to their new angles instead of replaying their arrival
ld_load = wf_read_load()
uo_pie.of_set_values(/*keys*/ ls_keys, /*values*/ ld_load)

Abrir las filas detrás de una porción #

// Event ue_slice_dblclicked of uo_pie : the key of the slice is the region
wf_open_orders(/*region*/ as_key, /*amount*/ ad_value)

Un menú sobre una porción #

// Event ue_slice_rclicked of uo_pie : (string as_key, long al_x, long al_y)
// Remember the slice, then open the contextmenu of the window where the gesture
// was made : the pointer, or the middle of the slice for the Menu key
is_menu_slice = as_key
uo_menu.of_show(/*x*/ al_x, /*y*/ al_y)

Desde un DataStore #

// Local variables
long ll_rc

// One slice per category : the rows of a category are SUMMED into its slice
uo_pie.of_map(/*role*/ u_pbt_chartpie.ROLE_KEY, /*column*/ "category")
uo_pie.of_map(/*role*/ u_pbt_chartpie.ROLE_LABEL, /*column*/ "category")
uo_pie.of_map(/*role*/ u_pbt_chartpie.ROLE_VALUE, /*column*/ "amount")

// ONE call reads every row of the DataStore retrieved when the window opened
// (an instance variable), no loop
ll_rc = uo_pie.of_from_datastore(/*ads*/ ids_sales)

// A row with no category is skipped : the chart says how many
if uo_pie.of_get_last_error() <> "" then wf_status(uo_pie.of_get_last_error())

La DataWindow en pantalla, releída en su sitio #

// Open event of the window : the chart reads the DataWindow the user sees
uo_pie.of_map(/*role*/ u_pbt_chartpie.ROLE_KEY, /*column*/ "region")
uo_pie.of_map(/*role*/ u_pbt_chartpie.ROLE_VALUE, /*column*/ "amount")
uo_pie.of_from_datastore(/*adw*/ dw_sales)
// After a Retrieve : the slices follow IN PLACE - a region the user hid from
// the legend stays hidden, a new region gets its slice
dw_sales.Retrieve()
uo_pie.of_reload()

Las porciones pequeñas en «Otros» #

// Every slice under 5 % of the total joins ONE slice, drawn last in grey,
// and only the six largest products keep a slice of their own
uo_pie.id_others_threshold = 5
uo_pie.ii_others_top = 6
uo_pie.is_others_label = "Other products"

// The largest first : the reader compares them from the top
uo_pie.is_sort = u_pbt_chartpie.SORT_DESC
// Event ue_slice_clicked of uo_pie : a click on Others opens the slices it holds
// Local variables
string ls_keys[]

// Others names the slices it gathered
if as_key = uo_pie.OTHERS_KEY then
	uo_pie.of_others_keys(/*keys*/ ls_keys)
	wf_open_products(/*keys*/ ls_keys)
end if

Buenas prácticas #

Heredado de la base común #

Estos miembros existen en todos los componentes visuales — no son propios de este. Se detallan una sola vez, en los capítulos transversales; esta tabla solo dice dónde leerlos.

MiembrosFunciónDetallado en
of_count · of_keys_at · of_hasRecorrer lo que el componente contiene3.2 Los items
of_resetPoner el componente a cero3.6 Poner un componente a cero: of_reset()
of_register_shortcut · of_clear_shortcutsAtajos de teclado del componente3.5 Los atajos de teclado
of_is_created · of_is_ready · of_get_last_errorSi ha nacido, si está listo, qué ha fallado3.7 Diagnóstico
of_save_as_png · of_save_as_jpgExportar el render como imagen3.8 Exportar la representación como imagen
of_set_redrawAgrupar los cambios en un solo repintado3.10 Buenas prácticas
of_preload_iconsIconos mostrados sin retardoVisualización instantánea: of_icon
of_set_translationTraducir una etiqueta del componente5.2 Adaptar una etiqueta: of_set_translation
of_focus_webviewDar el foco al componente6.4 Teclado y foco
of_print · of_print_to_pdfImprimir, o escribir un PDF6.9 Imprimir
of_set_property · of_get_property · of_component_nameControlar una propiedad por su nombre3.1 El motor de propiedades
is_accessible_name · is_accessible_descriptionEl nombre y la descripción que dice un lector de pantalla3.4 Propiedades y eventos opcionales

Dos ayudas no se heredan: of_icon y of_escape_markup viven en n_pbt_utils. Declare uno — n_pbt_utils lnv_utils, nada que crear — y llámelas sobre él.

← Referencia de componentes · Índice de la guía