crosstab — u_pbt_crosstab #
← Referencia de componentes · Índice de la guía
Tabla dinámica completa: áreas de filas / columnas / valores alimentadas desde un DataStore, agregaciones, filtros, formato condicional, agrupación de fechas, medidas calculadas y exportaciones CSV / Excel.
▶ Verlo en vivo — Aplicación de demostración, mosaico Crosstab: la vista previa, el código que lo genera y esta página, uno al lado del otro.
De un vistazo #
| Userobject | u_pbt_crosstab |
| Clase de items | — (los campos se colocan mediante métodos) |
| Sirve para | Ofrecer a sus usuarios un análisis cruzado de sus datos, que ellos mismos reorganizan, sin escribir SQL ni pasar por Excel |
| Límite en modo demo | 500 filas de origen procesadas; exportaciones CSV y Excel desactivadas — véase el modo demo |
El principio #
Usted proporciona al componente un conjunto de datos plano — un DataStore, es decir, cualquier consulta ya escrita en su aplicación. Del resto se encarga la tabla dinámica: deduce la lista de campos y usted los reparte en cuatro áreas.
| Área | Lo que contiene | Efecto |
|---|---|---|
| Filas | Campos de agrupación | Un nivel de filas por campo, plegable |
| Columnas | Campos de agrupación | Un nivel de encabezados de columna por campo |
| Valores | Campos numéricos y su agregación | Lo que se calcula en las celdas |
| Filtros | Campos de selección | Un filtro encima de la tabla, aplicado a todo |
Todo el cálculo se realiza en el componente: una vez transmitidos los datos, reorganizar la tabla no provoca ninguna ida y vuelta a la base de datos ni a PowerBuilder.
Inicio rápido #
// event open de la ventana
datastore lds
lds = create datastore
lds.dataobject = "d_ventes"
lds.SetTransObject(SQLCA)
lds.Retrieve()
// 1. Transmitir los datos: los campos se deducen de las columnas
uo_croise.of_set_data(lds)
// 2. Repartir los campos en las areas
uo_croise.of_add_row_field(/*campo*/ "region")
uo_croise.of_add_col_field(/*campo*/ "annee")
uo_croise.of_add_value_field(/*campo*/ "montant", /*agregacion*/ uo_croise.AGG_SUM)
// 3. Presentar: formato de los importes y totales generales
uo_croise.of_set_value_format(/*campo*/ "montant", /*decimales*/ 0, /*miles*/ "locale", /*simbolo*/ "$", /*simbolo_delante*/ true)
uo_croise.ib_row_grand_total = true
uo_croise.ib_col_grand_total = true
// event ue_cell_double_clicked de uo_croise: (string as_row_tuple_json, string as_col_tuple_json, double ad_value)
// El usuario quiere el detalle que hay detras de una cifra: abrir la lista correspondiente.
of_ouvrir_detail(as_row_tuple_json, as_col_tuple_json)
Constantes #
| Constante | Valor | Para |
|---|---|---|
TOTALS_BOTTOM · TOTALS_TOP | "bottom" "top" | is_totals_position |
VALUES_COLS · VALUES_ROWS | "cols" "rows" | is_values_axis |
AGG_SUM · AGG_COUNT · AGG_DISTINCT_COUNT | "sum" "count" "dcount" | of_add_value_field |
AGG_AVG · AGG_MIN · AGG_MAX | "avg" "min" "max" | of_add_value_field |
Las constantes de agregación se leen en el componente: uo_croise.AGG_SUM. Las de un campo (SHOW_*, CF_*) se leen en el handle del campo.
Propiedades #
| Propiedad | Tipo | Predeterminado | Función |
|---|---|---|---|
is_totals_position | string | "bottom" | Dónde se sitúa la fila del total general: TOTALS_BOTTOM (al pie, predeterminado) o TOTALS_TOP (arriba, justo debajo de los encabezados) |
is_values_axis | string | "cols" | Orientación de las medidas cuando hay varias: VALUES_COLS (una al lado de otra en columnas, predeterminado) o VALUES_ROWS (apiladas en filas) |
is_currency_symbol | string | "" | La moneda que el menú Formato de número de un chip de valor propone, junto a « Sin símbolo » y « % ». Vacío = la del idioma de visualización ($ en inglés, € en los demás) |
ib_field_list | boolean | true | Muestra el panel de campos, donde el usuario reorganiza la tabla con el ratón |
ib_row_subtotals | boolean | true | Muestra un subtotal por cada grupo de filas |
ib_col_subtotals | boolean | true | Muestra un subtotal por cada grupo de columnas |
ib_row_grand_total | boolean | true | Muestra la fila de total general bajo la tabla (la gemela de ib_col_grand_total) |
ib_col_grand_total | boolean | true | Muestra la columna de total general tras la tabla (la gemela de ib_row_grand_total) |
ib_enabled | boolean | true | Atenuado: la cuadrícula sigue mostrando sus cifras — una tabla dinámica vacía no es lo mismo que una que la aplicación ha apagado — pero deja de responder al puntero |
is_theme_style | string | fluent | Estilo visual del componente (constantes THEME_STYLE_*) |
is_theme_mode | string | light | Variante clara u oscura (constantes THEME_MODE_*) |
il_theme_accent | long | -1 | Color de acento de este componente (-1 = acento del tema) |
is_tooltip | string | "" | Tooltip simple mostrado al pasar el ratón por el componente |
is_super_tooltip_title | string | "" | Título del tooltip enriquecido (prevalece sobre is_tooltip) |
is_super_tooltip_text | string | "" | Texto del tooltip enriquecido (se acepta el marcado enriquecido) |
is_super_tooltip_image | string | "" | Imagen del tooltip enriquecido |
Propiedades de un campo #
of_field (string as_field) devuelve el handle de un campo: usted lo obtiene una vez y luego gobierna el campo a través de sus propiedades. El handle se crea en la primera llamada y se reutiliza después.
| Propiedad | Tipo | Predeterminado | Función |
|---|---|---|---|
is_label | string | "" | Etiqueta legible del campo ("montant" → "Facturación") |
is_show | string | "normal" | Lo que muestra la celda: "normal", "pctGrand" (% del total general), "pctRow" (% de la fila), "pctCol" (% de la columna), "running" (acumulado), "diff" (diferencia respecto al anterior) |
is_conditional_formatting | string | "none" | Formato condicional: CF_NONE, CF_SCALE (escala de colores) o CF_BARS (barras dentro de la celda) |
Los valores de is_show y de is_conditional_formatting también están disponibles como constantes en el handle (SHOW_PCT_COL, CF_SCALE…).
n_pbt_crosstab_field lnv_champ
lnv_champ = uo_croise.of_field(/*campo*/ "montant")
lnv_champ.is_label = "Facturación"
lnv_champ.is_conditional_formatting = lnv_champ.CF_SCALE
⚠️ Cambio incompatible. Esta propiedad se llamaba
is_cf: la abreviatura no decía nada en el punto de llamada. El nombre antiguo ya no existe: un código que lo utilice no compila. La sustitución es mecánica:is_cf→is_conditional_formatting, sin cambio de valores ni de comportamiento.
Métodos #
Alimentar y nombrar #
| Método | Función |
|---|---|
of_set_data (datastore ads_data) | Transmite el conjunto de datos: los campos se deducen de las columnas del DataStore y su etiqueta, del texto de encabezado. Devuelve 0 una vez cargados los datos, -5 si el DataStore no es válido o no tiene ninguna columna, -2 si el componente no está creado |
of_field (string as_field) | Devuelve el handle de un campo, para etiquetarlo o darle formato (véase Propiedades de un campo) |
Construir la tabla #
| Método | Función |
|---|---|
of_clear_layout ( ) | Vacía las cuatro áreas: la tabla vuelve a quedar en blanco, los datos siguen cargados. Devuelve 0 una vez aplicado, -2 si el componente no está creado |
of_add_row_field (string as_field) | Añade un campo al área Filas (el orden de las llamadas determina el orden de los niveles). Devuelve 0 una vez aplicado, -2 si el componente no está creado |
of_add_col_field (string as_field) | Añade un campo al área Columnas. Devuelve 0 una vez aplicado, -2 si el componente no está creado |
of_add_value_field (string as_field, string as_agg) | Añade una medida al área Valores, con su agregación. Devuelve 0 una vez aplicado, -2 si el componente no está creado |
of_add_filter_field (string as_field) | Añade un campo al área Filtros, encima de la tabla. Devuelve 0 una vez aplicado, -2 si el componente no está creado |
Las agregaciones aceptadas por of_add_value_field las publica el componente como constantes: AGG_SUM (predeterminado), AGG_COUNT, AGG_DISTINCT_COUNT (recuento de valores distintos), AGG_AVG, AGG_MIN, AGG_MAX.
Totales y subtotales #
| Método | Función |
|---|
Filtrar #
| Método | Función |
|---|---|
of_set_member_filter (string as_field, string as_values_tab) | Conserva solo los valores enumerados de un campo. Los valores van separados por tabulaciones (~t). Devuelve 0 una vez aplicado, -5 con un argumento no válido, -2 si el componente no está creado |
of_clear_member_filter (string as_field) | Quita este filtro. Devuelve 0 una vez aplicado, -2 si el componente no está creado |
of_set_value_filter (string as_field, string as_type, double ad_a, double ad_b, integer ai_measure_index) | Filtra sobre el total: "top" (los ad_a primeros), "gt", "lt", "between". ai_measure_index designa la medida afectada (la primera = 1). Devuelve 0 una vez aplicado, -5 con un argumento no válido, -2 si el componente no está creado |
of_clear_value_filter (string as_field) | Quita este filtro. Devuelve 0 una vez aplicado, -2 si el componente no está creado |
of_set_label_filter (string as_field, string as_type, double ad_a, double ad_b) | Filtra sobre el valor del campo en sí: "gt", "lt", "between". Devuelve 0 una vez aplicado, -5 con un argumento no válido, -2 si el componente no está creado |
of_clear_label_filter (string as_field) | Quita este filtro. Devuelve 0 una vez aplicado, -2 si el componente no está creado |
Dar formato #
| Método | Función |
|---|---|
of_set_value_format (string as_field, integer ai_decimals, string as_thousands, string as_suffix { , boolean ab_symbol_before }) | Formato de una medida: número de decimales (de 0 a 6), separador de miles ("locale", "space", "none"), símbolo — detrás del número por defecto (1 234 EUR), DELANTE cuando ab_symbol_before es true ($1,234). Devuelve 0 una vez aplicado, -5 con un argumento no válido, -2 si el componente no está creado |
of_clear_value_format (string as_field) | Vuelta al formato predeterminado. Devuelve 0 una vez aplicado, -2 si el componente no está creado |
of_set_member_order (string as_field, string as_values_tab) | Orden de visualización impuesto a los valores de un campo (separados por ~t); una cadena vacía restablece el orden natural. Devuelve 0 una vez aplicado, -5 con un argumento no válido, -2 si el componente no está creado |
Fechas y campos calculados #
| Método | Función |
|---|---|
of_group_date_field (string as_field, string as_part) | Crea un campo derivado de una columna de fecha: "year", "quarter" o "month". Se incorpora a la lista de campos y se emplea como los demás. Devuelve 0 una vez aplicado, -5 con un argumento no válido, -2 si el componente no está creado |
of_add_calc_field (string as_name, string as_label, string as_formula) | Campo calculado fila a fila ("[montant] * 0.8" = el neto de cada venta, sumado después como cualquier columna), utilizable en cualquier área. No para una razón de totales (precio medio): eso es of_add_calc_measure. Devuelve 0 una vez aplicado, -5 con un argumento no válido, -2 si el componente no está creado |
of_remove_calc_field (string as_name) | Quita un campo calculado. Devuelve 0 una vez aplicado, -2 si el componente no está creado |
of_add_calc_measure (string as_name, string as_label, string as_formula) | Medida calculada celda a celda, sobre los totales ("[marge] / [ca]" = tasa de margen global). Se coloca únicamente en el área Valores. Devuelve 0 una vez aplicado, -5 con un argumento no válido, -2 si el componente no está creado |
of_remove_calc_measure (string as_name) | Quita una medida calculada. Devuelve 0 una vez aplicado, -2 si el componente no está creado |
Una fórmula acepta los operadores + - * / ( ), números y campos entre corchetes. Una fórmula no válida dispara ue_calc_field_error — nada se bloquea.
Desplegar, memorizar, exportar #
| Método | Función |
|---|---|
of_expand_all ( ) · of_collapse_all ( ) | Despliega o pliega todos los grupos de filas. Devuelve 0 una vez aplicado, -2 si el componente no está creado |
of_expand_to_level (integer ai_level) | Despliega hasta un nivel dado (1 = solo el primer nivel). Devuelve 0 una vez aplicado, -2 si el componente no está creado |
of_get_layout ( ) → string | Devuelve el estado completo de la tabla — consérvelo tal cual y reprodúzcalo con of_set_layout |
of_set_layout (string as_state_json) | Restaura un estado obtenido anteriormente. Devuelve 0 una vez aplicado, -5 con un argumento no válido, -2 si el componente no está creado |
of_export_csv (string as_path) | Escribe un archivo CSV de la vista actual (UTF-8 con BOM, punto y coma); ue_csv_saved confirma. El gemelo de of_export_xlsx. Devuelve 0 una vez aplicado, -5 con un argumento no válido, -2 si el componente no está creado |
of_export_xlsx (string as_path) | Escribe un archivo Excel de la tabla, formato incluido; ue_xlsx_saved lo confirma. Devuelve 0 una vez aplicado, -5 con un argumento no válido, -2 si el componente no está creado |
Comunes #
| Método | Función |
|---|---|
of_reset ( ) | Devuelve el componente a su estado inicial. Devuelve 0 una vez aplicado, -2 si el componente no está creado |
of_set_redraw (boolean) | Agrupa una ráfaga de modificaciones en una sola representación. Devuelve 0 una vez aplicado, -2 si el componente no está creado |
of_save_as_png (string) · of_save_as_jpg (string) | Exporta la representación como imagen. Devuelve 0, -2 si el componente no está creado, -4 si la captura falla, -5 con una ruta vacía |
Eventos #
| Evento | Se activa cuando |
|---|---|
ue_layout_changed (string as_layout_json) | El usuario ha reorganizado la tabla (movido un campo, cambiado una agregación, plegado un grupo…) |
ue_cell_double_clicked (string as_row_tuple_json, string as_col_tuple_json, double ad_value) | Doble clic en una celda: los dos primeros argumentos describen el cruce; el tercero, el valor mostrado. Es el punto de entrada de un detalle |
ue_csv_saved (string as_path, boolean ab_ok, string as_error) | El archivo CSV se ha escrito — o no, y as_error dice por qué |
ue_xlsx_saved (string as_path, boolean ab_ok, string as_error) | El archivo Excel se ha escrito — o no, y as_error dice por qué |
ue_calc_field_error (string as_field, string as_message) | La fórmula de un campo o de una medida calculada no es válida |
ue_copy (string as_tsv) | El usuario ha copiado una selección de celdas (Ctrl+C): a usted le corresponde ponerla en el portapapeles |
ue_ready ( ) | El componente ha terminado de cargarse; todo lo enviado antes se ha reproducido |
ue_runtime_missing ( ) | El runtime WebView2 está ausente: el componente permanece vacío |
ue_bg_color (long al_color) | El componente ha calculado el color de fondo de su tema; el userobject ya lo ha adoptado (backcolor) |
Lo que el usuario puede hacer sin una línea de código #
La tabla está viva: es todo el interés del componente. Con el panel de campos visible (ib_field_list = true), el usuario puede:
- arrastrar un campo de un área a otra y reorganizar el cruce a voluntad;
- cambiar la agregación de una medida (suma, media, recuento…);
- filtrar los valores de un campo mediante una lista de casillas;
- plegar o desplegar un grupo de filas o de columnas;
- ordenar desde un encabezado;
- seleccionar y luego copiar un bloque de celdas.
Cada una de estas manipulaciones se notifica en ue_layout_changed: unido a of_get_layout / of_set_layout, esto permite ofrecer «vistas guardadas» a sus usuarios.
Con el teclado. Cada uno de esos gestos es alcanzable sin ratón: Tab lleva a un campo, a un triángulo de plegado o a un encabezado ordenable, Intro o Espacio lo dispara. Sobre un campo abre su menú — el que lleva Añadir a las filas / a las columnas / a los valores / a los filtros y Quitar: toda la construcción de la tabla pasa por ahí.
Ejemplos #
Un informe de ventas completo #
// Filas: region y luego ciudad dentro de cada region
uo_croise.of_clear_layout()
uo_croise.of_add_row_field(/*campo*/ "region")
uo_croise.of_add_row_field(/*campo*/ "ville")
// Columnas: una por ano
uo_croise.of_add_col_field(/*campo*/ "annee")
// Celdas: el importe total
uo_croise.of_add_value_field(/*campo*/ "montant", /*agregacion*/ uo_croise.AGG_SUM)
// Presentacion: importes legibles, subtotales y totales generales
uo_croise.of_set_value_format(/*campo*/ "montant", /*decimales*/ 0, /*miles*/ "locale", /*simbolo*/ "$", /*simbolo_delante*/ true)
uo_croise.ib_row_subtotals = true
uo_croise.ib_row_grand_total = true
uo_croise.ib_col_grand_total = true
// Colorear las celdas para detectar los importes altos de un vistazo
uo_croise.of_field(/*campo*/ "montant").is_conditional_formatting = n_pbt_crosstab_field.CF_SCALE
Etiquetas legibles #
Sus columnas suelen llamarse mt_ht o cd_reg. Cámbieles el nombre de una vez por todas, justo después de of_set_data.
uo_croise.of_set_data(lds)
uo_croise.of_field("region").is_label = "Región"
uo_croise.of_field("ville").is_label = "Ciudad"
uo_croise.of_field("categorie").is_label = "Categoría"
uo_croise.of_field("annee").is_label = "Año"
uo_croise.of_field("montant").is_label = "Facturación"
uo_croise.of_field("quantite").is_label = "Cantidad"
Analizar porcentajes en lugar de importes #
n_pbt_crosstab_field lnv_montant
uo_croise.of_clear_layout()
uo_croise.of_add_row_field(/*campo*/ "categorie")
uo_croise.of_add_col_field(/*campo*/ "annee")
uo_croise.of_add_value_field(/*campo*/ "montant", /*agregacion*/ uo_croise.AGG_SUM)
// Conservar solo dos categorias en pantalla (valores separados por una tabulacion)
uo_croise.of_set_member_filter(/*campo*/ "categorie", /*valores*/ "Informatique~tMobilier")
lnv_montant = uo_croise.of_field(/*campo*/ "montant")
// Mostrar la parte de cada celda en el total de su columna
lnv_montant.is_show = lnv_montant.SHOW_PCT_COL
// Una pequena barra en cada celda para comparar las partes de un vistazo
lnv_montant.is_conditional_formatting = lnv_montant.CF_BARS
Una medida propia: el precio medio #
Una medida calculada se evalúa sobre los totales de cada celda, no fila a fila: eso es lo que hace correcto un ratio.
uo_croise.of_clear_layout()
uo_croise.of_add_row_field(/*campo*/ "region")
// Los dos totales que serviran de base al calculo
uo_croise.of_add_value_field(/*campo*/ "montant", /*agregacion*/ uo_croise.AGG_SUM)
uo_croise.of_add_value_field(/*campo*/ "quantite", /*agregacion*/ uo_croise.AGG_SUM)
// Precio medio = importe total dividido por la cantidad total
uo_croise.of_add_calc_measure(/*nombre*/ "prix_moyen", /*etiqueta*/ "Precio medio", &
/*formula*/ "[montant] / [quantite]")
uo_croise.of_set_value_format(/*campo*/ "prix_moyen", /*decimales*/ 2, /*miles*/ "locale", /*simbolo*/ "$", /*simbolo_delante*/ true)
// Luego colocarla entre los valores como cualquier campo (el agregado no importa: una medida se calcula)
uo_croise.of_add_value_field(/*campo*/ "prix_moyen", /*agregado*/ uo_croise.AGG_SUM)
// event ue_calc_field_error de uo_croise: (string as_field, string as_message)
// Formula no valida: avisar sin romper nada, la tabla sigue mostrandose.
uo_statut.of_item("main").is_text = "Fórmula " + as_field + " : " + as_message
Analizar por mes, trimestre o año #
Una columna de fecha no se cruza tal cual — cada día formaría su propia fila. Derive primero el nivel deseado.
// Crear tres campos derivados de la columna date_vente
uo_croise.of_group_date_field(/*campo*/ "date_vente", /*nivel*/ "year")
uo_croise.of_group_date_field(/*campo*/ "date_vente", /*nivel*/ "quarter")
uo_croise.of_group_date_field(/*campo*/ "date_vente", /*nivel*/ "month")
// Despues cruzarlos como cualquier otro campo: ano en columnas, trimestre debajo
uo_croise.of_add_col_field("date_vente__year")
uo_croise.of_add_col_field("date_vente__quarter")
El ranking de las diez mejores regiones #
// Conservar solo las 10 regiones con el total mas alto sobre la primera medida
uo_croise.of_set_value_filter(/*campo*/ "region", /*tipo*/ "top", &
/*a*/ 10, /*b*/ 0, /*medida*/ 1)
Exportar #
La exportación reproduce exactamente la vista actual: los mismos filtros, los mismos totales, el mismo formato.
// Hacia Excel: el archivo se escribe directamente en la ruta indicada
uo_croise.of_export_xlsx("C:\temp\ventes.xlsx")
// event ue_xlsx_saved de uo_croise: (string as_path, boolean ab_ok, string as_error)
// inv_notif = un n_pbt_toaster declarado como variable de instancia de la ventana
if ab_ok then
inv_notif.is_title = "Exportación finalizada"
inv_notif.is_text = as_path
inv_notif.is_kind = inv_notif.KIND_SUCCESS
else
inv_notif.is_title = "Exportación imposible"
inv_notif.is_text = as_error
inv_notif.is_kind = inv_notif.KIND_ERROR
end if
inv_notif.of_show()
// Hacia CSV: un archivo, como para Excel; ue_csv_saved confirma
uo_croise.of_export_csv(/*ruta*/ "C:\exports\ventes.csv")
Ofrecer vistas guardadas #
string ls_vue
// Guardar la vista actual : of_get_layout responde de inmediato
ls_vue = uo_croise.of_get_layout()
// Conservar el contenido TAL CUAL : se reproduce sin transformacion.
of_enregistrer_vue(is_vue_courante, ls_vue)
// Mas tarde: reproducir una vista guardada
uo_croise.of_set_layout(of_lire_vue("Ventes par region"))
Bajar al detalle que hay detrás de una cifra #
// event ue_cell_double_clicked de uo_croise: (string as_row_tuple_json, string as_col_tuple_json, double ad_value)
// Los dos primeros argumentos describen el cruce (que valores de filas,
// que valores de columnas): lo suficiente para reconstruir una consulta de detalle.
w_detail_ventes lw_detail
OpenWithParm(lw_detail, as_row_tuple_json + "|" + as_col_tuple_json)
Buenas prácticas #
- Llame a
of_set_datauna sola vez por conjunto de datos: reorganizar la tabla después no cuesta nada, retransmitir los datos sale caro. - Ponga las etiquetas (
of_field("...").is_label) justo después deof_set_data: siguen al campo a todas partes, incluidos el panel de campos y las exportaciones. - Filtre en el lado SQL lo que no está destinado a ser analizado: la tabla dinámica es rápida, pero un DataStore la mitad de grande se abre el doble de rápido.
of_clear_layout()vacía las áreas sin retransmitir los datos: es la llamada adecuada para proponer varios análisis sobre la misma fuente.- Un campo de fecha se cruza siempre mediante
of_group_date_field, nunca directamente. - Deje el panel de campos visible en las pantallas de análisis y ocúltelo en los cuadros de mando fijos.
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.
| Miembros | Función | Detallado en |
|---|---|---|
of_count · of_keys_at · of_has | Recorrer lo que el componente contiene | 3.2 Los items |
of_reset | Poner el componente a cero | 3.6 Poner un componente a cero: of_reset() |
of_set_property · of_get_property · of_component_name | Controlar una propiedad por su nombre | 3.1 El motor de propiedades |
of_register_shortcut · of_clear_shortcuts | Atajos de teclado del componente | 3.5 Los atajos de teclado |
of_is_created · of_is_ready · of_get_last_error | Si ha nacido, si está listo, qué ha fallado | 3.7 Diagnóstico |
of_save_as_png · of_save_as_jpg | Exportar el render como imagen | 3.8 Exportar la representación como imagen |
of_set_redraw | Agrupar los cambios en un solo repintado | 3.10 Buenas prácticas |
of_preload_icons | Iconos mostrados sin retardo | Visualización instantánea: of_icon |
of_set_translation | Traducir una etiqueta del componente | 5.2 Adaptar una etiqueta: of_set_translation |
of_focus_webview | Dar el foco al componente | 6.4 Teclado y foco |
of_print · of_print_to_pdf | Imprimir, o escribir un PDF | 6.9 Imprimir |
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.