12. Migrar de la 4.0 a la 5.0 #
← Migrar de la 3.0 a la 4.0 · Índice · Notas de la versión →
La 5.0 no cambia ninguna firma de los treinta y siete componentes de la 4.0, ni ningún evento — salvo la barra de botones (buttonbar, 12.7) y el evento ue_link_clicked del visor Markdown (markdownview), que recibe un segundo argumento, as_kind (12.5). Tres componentes cambian de palabras. La barra de progreso (progressbar) adopta las de los indicadores — ib_label, il_color e is_label_format desaparecen en favor de ib_show_value, il_value_color, is_format e is_unit (12.1). El gráfico cartesiano (chartcartesian) escribe sus números mediante is_format, como los indicadores y el gráfico circular: of_set_value_format y of_clear_value_format desaparecen, y ii_point_count de una serie pasa a ser il_point_count (12.4). La tabla dinámica (crosstab) sigue el mismo camino: of_set_value_format y of_clear_value_format desaparecen en favor de is_format — en el campo, o en un solo valor mediante of_value — y de ib_negative_red (12.8). El compilador le muestra cada línea que hay que retocar. La barra lateral (listbar) cambia un evento: ue_item_rclicked recibe además el punto de pantalla del clic, al_x y al_y (12.9). El panel de mosaicos (tilesbox) renombra un evento: ue_tile_context(as_keys) pasa a ser ue_tile_rclicked(as_keys, al_x, al_y), y la posición de of_move_tile y de of_insert_tile pasa a long al_position (12.12). El menú radial (radialmenu) pierde cuatro propiedades de información sobre herramientas que nunca mostró — is_tooltip, is_super_tooltip_title, is_super_tooltip_text e is_super_tooltip_image (12.5). El calendario (scheduler) cambia tres eventos de gesto: ue_appointment_changing recibe as_kind, ue_appointment_moved y ue_appointment_resized reciben los valores anteriores (12.10). El explorador del shell (shellexplorer) cambia un evento: ue_error recibe además la ruta y un motivo constante, as_path y as_reason (12.11). El bloque de texto enriquecido (statictext) cambia un evento: ue_hyperlink recibe además ab_opened, si el enlace se abrió de verdad (12.5). La pestaña (tab) cambia un evento: ue_tab_rclicked recibe además el punto de pantalla del clic, al_x y al_y (12.13). El reproductor de sonidos (soundplayer) cambia tres eventos: ue_started, ue_ended y ue_failed reciben además el número del sonido, al_sound (12.14). El toaster (toaster) cambia un evento: ue_toast_dismissed recibe además el motivo del cierre, as_reason (12.15). El navegador web (webbrowser): of_go_back, of_go_forward y of_stop devuelven un long, y con ib_veto_navigation una dirección escrita por el usuario se pregunta a ue_navigating (12.17). La barra de herramientas (toolbar) cambia un evento: ue_item_rclicked recibe además el punto de pantalla del clic, al_x y al_y (12.18). El reproductor de vídeo (video) cambia una firma: of_stop pasa a ser una función que devuelve un long (12.16) — una llamada escrita como instrucción sigue compilando. Tres componentes cambian un evento de clic derecho de un elemento, que recibe además su punto de pantalla al_x, al_y: la barra de botones (ue_button_rclicked), la ruta de navegación (breadcrumb, ue_item_rclicked) y el gráfico cartesiano (ue_point_rclicked); la barra de estado (statusbar) da ese punto como los demás, sin multiplicarlo ya por la escala de la pantalla (12.19). La base (12.20): el motivo del fallo de un componente no visual se lee con of_get_last_error() — la propiedad is_last_error desaparece de crypto, restclient, soundplayer, speechout, xml, u_pbt_regex y u_pbt_zip —, y of_stop, of_close y of_reset de los componentes no visuales devuelven un long.
El resto no pide nada a su código: la cuadrícula de datos (datagrid) y la cinta (ribbon) ganan máscaras de entrada numéricas, y el editor de una columna numérica de la cuadrícula se abre ahora sobre el texto de la máscara (12.2, 12.3). Los nuevos componentes de la 5.0 se presentan en las notas de la versión.
12.1 progressbar: las palabras de los indicadores #
La 5.0 trae dos indicadores, lineal (gauge) y de esfera (angulargauge). Una barra de progreso también muestra un valor sobre una escala: la biblioteca ya solo habla un idioma para ello, y la barra, que decía lo mismo con otras palabras, adopta las palabras de los indicadores. Ningún nombre antiguo sobrevive: ni una propiedad, ni un nombre aceptado por of_set_property.
| Qué | 4.0 | 5.0 |
|---|---|---|
| Mostrar la lectura | uo.ib_label = true | uo.ib_show_value = true |
| Color del valor (-1 = el tema, sin cambios) | uo.il_color = RGB(…) | uo.il_value_color = RGB(…) |
| Una lectura que escribe el valor | uo.is_label_format = "{value} of {max} rows" | uo.is_format = "#,##0" + uo.is_unit = "of 500 rows" |
| El porcentaje (por defecto, sin cambios) | uo.is_label_format = "" | uo.is_format = "" |
| Controlar por nombre | of_set_property("label", …), ("label_format", …), ("color", …) | ("show_value", …), ("format", …), ("unit", …), ("value_color", …) |
is_formates un formato de visualización de PowerBuilder aplicado al valor ("#,##0","$#,##0.00"), con los separadores del idioma de visualización, exactamente como en los indicadores. Vacío, la barra muestra el porcentaje, como antes.- Los marcadores
{percent},{value},{min}y{max}ya no existen. Una etiqueta que mezclaba valor y porcentaje ("{value} of {max} rows ({percent})") no tiene equivalente exacto: elija el valor (formato y unidad) o el porcentaje (y una unidad). El máximo, que su código conoce, se escribe en la unidad. is_unites nuevo: un texto plano escrito tras la lectura, separado por un espacio — tras el valor como tras el porcentaje.of_resetlo vacía.- Una máscara que contiene
%escribe la parte realizada, no el valor:is_format = "0.0%"da «35.0%» para 1.687 filas de 4.820, redondeada hacia abajo como el porcentaje — el porcentaje con decimales que{percent}no sabía escribir. - Una espera en pausa o en error se convierte en una barra llena. En la 4.0, una barra de espera (
ib_indeterminate) que recibíaSTATE_PAUSEDoSTATE_ERRORse congelaba en su deslizamiento, a menudo fuera de su pista: el fallo no se veía. En la 5.0 se detiene como barra (anillo) llena del color del estado, como la barra de tareas de Windows, y el lector de pantalla ya no la anuncia ocupada sino que dice su estado. of_set_property("tooltip", …)ysuper_tooltip_*devuelven-5: la barra no publica tooltip, y la puerta por nombre, que ponía uno, está cerrada como las propiedades.- Novedad, sin nada que retocar:
is_orientation(ORIENTATION_VERTICAL: una barra de pie, en lugar de unaVProgressBar),is_accessible_name(el nombre que dice el lector de pantalla) y el texto de una espera (solois_unitmientras la barra está en espera).
// 4.0 : the label wrote the value through placeholders
uo_progress.ib_label = true
uo_progress.il_color = RGB(/*red*/ 0, /*green*/ 120, /*blue*/ 215)
uo_progress.is_label_format = "{value} of {max} rows"
// 5.0 : the words of the gauges - a display format for the value, then a unit
uo_progress.ib_show_value = true
uo_progress.il_value_color = RGB(/*red*/ 0, /*green*/ 120, /*blue*/ 215)
uo_progress.is_format = "#,##0"
uo_progress.is_unit = "of 500 rows"
La receta: compile; cada ib_label, il_color e is_label_format de una barra de progreso queda señalado. Sustituya los dos primeros por ib_show_value e il_value_color. Para el tercero: un texto vacío sigue vacío en is_format; una etiqueta que escribía el valor pasa a ser un formato ("#,##0") y una unidad; una etiqueta que escribía el porcentaje deja is_format vacío y pone su texto en is_unit. Un of_set_property que nombraba label, label_format o color ahora devuelve -5 y no hace nada (of_get_last_error nombra la propiedad): busque esos nombres en su código.
12.2 datagrid: un editor numérico que teclea a través de una máscara #
Ninguna firma cambia, y ue_cell_edited sigue recibiendo el número desnudo (1234.5). Lo que cambia se ve en pantalla: la escritura en una columna numérica sigue ahora una máscara de entrada, en la sintaxis del DataWindow — la que usted da con la nueva propiedad is_mask de la columna, si no su formato de visualización despojado de sus literales.
| Qué | 4.0 | 5.0 |
|---|---|---|
El editor de una celda mostrada $1,234.50 | se abría con el número desnudo 1234.5; se aceptaba cualquier carácter | se abre con 1,234.50; la agrupación aparece a medida que llegan las cifras, los decimales se limitan a la máscara, las letras se rechazan; un número pegado se lee en el idioma de visualización |
| Un número de cuatro cifras con un formato numérico | sin agrupar en algunos idiomas (1234 en español) | agrupado en todos los idiomas (1.234 en español) |
| Un negativo redondeado a cero | -0 | 0 |
| Abrir y cerrar el editor sin teclear | podía cambiar un valor que el formato redondea | no cambia nada |
Una celda de valoración (rating) leída por un lector de pantalla | cinco signos de estrella | 4 / 5 |
// 5.0 : the input mask of a numeric column - the cell still receives the bare number
uo_grid.of_column(/*key*/ "revenue").is_mask = "#,##0.00"
La receta: nada que cambiar. Un código que leía el texto tecleado no lo ve: ue_cell_edited sigue devolviendo el número. Una columna cuya entrada debe quedar libre (un código, un número de pieza) es una columna de texto, no numérica.
12.3 ribbon: las máscaras de un contador #
Nada cambia para un contador sin máscara. Dos propiedades nuevas de su handle, en la sintaxis de PowerBuilder: is_mask, la máscara de entrada ("#,##0.00", "0%"), e is_format, el formato de visualización con sus literales (0 "pt" muestra 11 pt, que se teclea 11). id_value y ue_value_changed conservan el número desnudo, el cambio entre ambos no lanza ningún evento, y las máscaras siguen al contador en el panel de un grupo contraído.
// 5.0 : a font size shown "11 pt", typed "11"
uo_ribbon.of_item(/*keys*/ "home/font/size").is_format = "0 ~"pt~""
La receta: nada que cambiar.
12.4 chartcartesian: el formato de los números mediante is_format #
El gráfico cartesiano escribía sus números con una función de cuatro argumentos (decimales, prefijo, sufijo, separador de miles). La 5.0 pone gráficos e indicadores bajo un solo idioma: un formato de visualización de PowerBuilder, el de una columna de DataWindow, en la propiedad is_format — del gráfico entero, y de un eje mediante su handle. Las secciones positivo;negativo;cero, los literales y el porcentaje vienen con él, y los separadores siguen siendo los del idioma de visualización. Ningún nombre antiguo sobrevive.
| Qué | 4.0 | 5.0 |
|---|---|---|
| El formato del gráfico | uo.of_set_value_format(0, "$", "", true) | uo.is_format = "$#,##0" |
| El formato de un eje | uo.of_set_value_format(AXIS_VALUE2, 1, "", " u", false) | uo.of_axis(AXIS_VALUE2).is_format = '0.0" u"' |
| Volver al número tal cual | uo.of_clear_value_format() | uo.is_format = "" (y "" en cada eje que tenga el suyo) |
| Controlar por nombre | — | of_set_property("format", "#,##0") |
| El número de puntos de una serie (solo lectura) | uo.of_item("k").ii_point_count (integer) | uo.of_item("k").il_point_count (long) |
- El formato de un eje prevalece sobre el del gráfico, y lo conserva. Poner el formato del gráfico ya no borra el de los ejes (la forma de
of_set_value_formatsin eje lo hacía): un eje vuelve al formato del gráfico conis_format = "". - Sin formato (vacío, o un formato que no es numérico), el número se escribe tal cual, a la milésima, con el separador decimal del idioma de visualización — como hacía el formato predeterminado.
// 4.0 : decimals, prefix, suffix and thousands as four arguments
uo_chart.of_set_value_format(/*decimals*/ 0, /*prefix*/ "$", /*suffix*/ "K", /*thousands*/ true)
uo_chart.of_set_value_format(/*axis*/ u_pbt_chartcartesian.AXIS_VALUE2, /*decimals*/ 1, /*prefix*/ "", /*suffix*/ " u", /*thousands*/ false)
// 5.0 : a display format, written as in a DataWindow - for the chart, then for one axis
uo_chart.is_format = "$#,##0K"
uo_chart.of_axis(/*axis*/ u_pbt_chartcartesian.AXIS_VALUE2).is_format = '0.0" u"'
La receta: compile; cada of_set_value_format y of_clear_value_format queda señalado. Escriba el formato como en un DataWindow: decimals da el número de 0 tras el punto (-1 = #,##0.###), thousands la , de agrupación, el prefijo y el sufijo se escriben delante y detrás (entre comillas si contienen cifras o espacios). El formato de un eje va en of_axis(<eje>).is_format.
12.5 Otros comportamientos que puede ver #
| Qué | 4.0 | 5.0 | ||
|---|---|---|---|---|
Menús nativos de un componente con un acento propio (il_theme_accent) | el acento solo se veía en la casilla de una entrada marcada | la entrada señalada también lo muestra, con un ribete en el borde inicial (a la derecha en RTL) | ||
button: Ctrl, Alt o Mayús + Intro (y Ctrl / Alt + Espacio, Ctrl + Esc) sobre el botón que tiene el foco | pulsaban ese botón | van a la ventana, como desde cualquier otro control: se activa el atajo de otro botón (is_shortcut = "Ctrl+Enter"), no el botón con el foco; Intro y Espacio solos siguen pulsándolo | ||
button atenuado con ib_default (o ib_cancel), el más cercano al foco, en una hoja MDI | Intro (Esc) iba al botón predeterminado de otra hoja | la tecla se queda en su hoja: la recibe el campo, o el CommandButton PB predeterminado | ||
breadcrumb: ii_max_visible puesto | un número exacto de segmentos en OVERFLOW_COLLAPSE (el ancho ya no plegaba nada), ignorado en OVERFLOW_SCROLL y OVERFLOW_SHRINK | un techo en los tres modos; en OVERFLOW_COLLAPSE el ancho pliega todavía más cuando la barra es demasiado estrecha, y el lugar actual ya no sale de la barra | ||
breadcrumb: of_add_child con un texto vacío | una línea vacía en el menú | la clave de la rama, como of_add_children | ||
breadcrumb: Ctrl+S, F5 y los demás atajos de la ventana mientras se escribe la ruta | no se activaban | se activan, como desde un SingleLineEdit; Intro y Esc se quedan en el campo | ||
breadcrumb: ue_children_needed que nunca devuelve el control | ningún chevron se abría hasta el siguiente of_reset | un clic en otro chevron abandona la pregunta, y la ruta la deja caer al cabo de 10 segundos | ||
chartcartesian: una banda o un umbral sin color (-1 o NULL) | un bloque lleno del color del texto | una veladura pálida del acento del tema (la línea de un umbral: el acento); un límite NULL se rechaza (-5) | ||
chartcartesian: un peso NULL en un mapa de calor | la celda pintada del color más cálido, con la etiqueta « NaN » | una celda vacía: allí nada se dibuja, etiqueta ni pulsa; una burbuja sin peso conserva el tamaño predeterminado, fuera de la escala | ||
chartcartesian: of_remove_series | las series siguientes cambiaban de color; el tooltip de la serie quitada vestía la siguiente serie con la misma clave | cada serie conserva el color tomado al añadirla; el tooltip y los colores de elemento se van con la serie | ||
chartcartesian: of_append_values / of_append_categories con ib_animated | todo el gráfico volvía a caer sobre el eje y subía en cada añadido, mientras la ventana no estaba llena | solo sube la forma añadida, las demás se deslizan; la llegada entera solo se repite al añadir una serie | ||
chartcartesian: barras apiladas en los dos ejes de valores | las dos pilas se superponían | una al lado de otra en la categoría | ||
chartcartesian: una etiqueta de marcado en una categoría o una etiqueta de valor | escrita tal cual en el eje, interpretada en el panel | texto en todas partes: la etiqueta se quita (el eje, el panel, #x#, #label#) | ||
chartcartesian: Esc sin nada abierto, Intro en un hueco | retenidos por el gráfico | van a la ventana: su botón Cancelar, su botón predeterminado | ||
codeeditor: Ctrl+Tab o Alt+Tab en el editor | sangraban el código: el teclado ya no salía del editor | van a la ventana (la página siguiente de una pestaña); Esc y luego Tab sale del editor, Ctrl+M o ib_tab_moves_focus dejan salir Tab | ||
codeeditor: of_find con una expresión regular no válida | devolvía 0 | devuelve -5, como of_replace | ||
codeeditor: un nuevo is_text durante una búsqueda | la barra seguía abierta y lanzaba ue_find_result | la barra se cierra, sin lanzar nada (un valor es mudo) | ||
codeeditor: is_syntax = "SQL" releído | "sql" | "SQL", tal como se escribió | ||
codeeditor plegado: #regionopen, la copia y of_selected_text | mostrado #region; la copia devolvía lo mostrado, sin las líneas de las regiones cerradas | mostrado tal como se escribió; la copia y of_selected_text devuelven el origen del rango, regiones cerradas incluidas | ||
codeeditor: marcadores e il_doc_line cuando se añaden o quitan líneas encima | se quedaban en el mismo número de línea | acompañan a su línea; una línea eliminada se lleva sus marcadores | ||
codeeditor: el cursor tras «Reemplazar todo» (of_replace_all) | en el último reemplazo | se queda donde estaba, desplazado por lo insertado antes | ||
codeeditor: Ctrl+Z, Ctrl+Y | el historial del navegador, perdido cuando el texto se escribía con el foco en otro sitio | el historial del componente (of_undo, of_redo): también cuenta lo que hace su código, un nuevo is_text lo vacía | ||
crypto: of_totp_verify(secret, code, ref al_step) con un código tecleado con espacios («864 010») | rechazado, paso 0 | aceptado, como en la forma de dos argumentos; los espacios se ignoran | ||
crypto: of_base64_encode_file de un archivo de 32 a 64 MB en una aplicación de 32 bits | prometido hasta 64 MB; la memoria del proceso podía agotarse | "" e of_get_last_error() (32 MB como máximo en 32 bits); of_base64_encode_file_to_file codifica un archivo de cualquier tamaño en otro archivo | ||
crypto: of_totp_uri de un secreto tecleado a mano («gezd gnbv», un «0») | escrito tal cual en la URI | escrito en base32 en mayúsculas, sin espacios ni =; otro carácter: "" e of_get_last_error() | ||
crypto: un argumento NULL | is_last_error podía volver NULL | cuenta como vacío; of_get_last_error() nunca es NULL | ||
crypto: un destino \x o C:x (of_base64_decode_to_file, of_encrypt_file, of_decrypt_file) | -5 y un mensaje falso («not a base64 value», «all needed») | -5, e of_get_last_error() dice que la ruta depende de la carpeta actual de una unidad | ||
commandpalette: una búsqueda y los comandos usados recientemente (is_recent) | un comando reciente ganaba hasta il_max_recent × 4 puntos: con un límite alto adelantaba a una coincidencia mejor | solo desempata resultados que coinciden más o menos igual de bien | ||
commandpalette: un comando sin grupo (as_group = "") declarado entre dos grupos | listado bajo el encabezado del grupo declarado antes | al principio de la lista, sin encabezado | ||
commandpalette: Inicio / Fin en el campo con texto, Mayús+Inicio | movían la selección en la lista; Mayús+Inicio no seleccionaba nada | mueven el cursor en el campo; Ctrl+Inicio / Ctrl+Fin llegan a la lista; Mayús selecciona en el campo | ||
commandpalette: un clic derecho o central en una fila | lanzaba el comando | no hace nada | ||
commandpalette: of_command con una clave que ningún comando lleva | ib_enabled / ib_visible se leían true, una escritura se perdía en silencio | se leen false; una escritura se pierde y of_get_last_error lo dice | ||
commandpalette: se destruye un segundo objeto paleta que había tomado un atajo | la tecla no respondía a nadie hasta que el primero la volvía a registrar | el atajo vuelve al primero | ||
commandpalette: is_recent con espacios o claves repetidas, il_max_recent más bajo | "a, b" solo conservaba a; un duplicado aparecía dos veces; is_recent seguía largo | limpiado, recortado al límite y devuelto limpio a is_recent al abrir | ||
dockcontainer: construir el dock, restaurar una disposición | ue_layout_changed en cada adición, el primero conocía un solo panel: una disposición guardada en el evento se sobrescribía con una a medio construir | una vez para una ráfaga enmarcada por of_set_redraw(false) … (true), al reanudar (y para cambios a menos de 40 ms); of_set_layout lo lanza una vez. Lea el ajuste guardado antes de crear los paneles | ||
dockcontainer: el panel al frente de una pila cambia sin clic en su pestaña | no se lanzaba nada (un panel apilado por of_add_panel u of_move_panel, el de delante cerrado, desacoplado o retirado, un panel reacoplado) | ue_panel_selected del panel que pasó al frente, tras ue_panel_closed, ue_panel_floated o ue_panel_docked; una disposición restaurada no lo lanza. n_pbt_dock_panel.ib_front lo relee | ||
dockcontainer: ib_visible = true en un panel cerrado de una pila | volvía detrás de la pestaña activa | pasa al frente, y ue_panel_selected sigue; en un grupo plegado se queda en el riel | ||
dockcontainer: of_move_panel hacia el propio panel (as_target = as_key) | devolvía 0 sin hacer nada, o dividía su pila | devuelve -5; para dividir una pila, apunte a otro panel de la pila (of_move_panel("b", "a", POSITION_BOTTOM)) | ||
dockcontainer: un panel movido a un grupo plegado, o fuera de él | ib_pinned cambiaba sin evento | ue_panel_pinned sigue | ||
dockcontainer: un clic sin desplazamiento en un separador | lanzaba ue_layout_changed | no lanza nada: nada ha cambiado | ||
dockcontainer: of_keys_at con claves numéricas | primero las claves enteras (2, 10, zeta) | el orden de adición (zeta, 10, 2) | ||
dockcontainer destruido en ejecución (CloseUserObject) | sus controles volvían a la ventana, ocultos | recuperan la visibilidad que tenían antes de of_add_panel | ||
dockcontainer: of_add_panel de un control que CONTIENE el dock | las ventanas se encerraban en bucle | devuelve -5, el control se queda donde estaba | ||
crosstab: AGG_COUNT | contaba las filas | cuenta los valores no vacíos, como la Cuenta de Excel; AGG_COUNT_ROWS, nuevo, cuenta las filas | ||
crosstab: una suma sin ningún valor; una « diferencia respecto al anterior » junto a una celda vacía | 0 | una celda vacía (of_get_cell_value devuelve NULL) | ||
crosstab: Top N o Bottom N (of_set_value_filter, o el menú) en un campo situado bajo otro de su área | clasificados sobre toda la tabla | clasificados dentro de cada padre (la mejor ciudad de cada región); en el primer nivel, sin cambios; los miembros empatados con el N-ésimo se quedan todos | ||
crosstab: ningún campo en Columnas | una columna de total que duplicaba la única columna (`Nord | 650 | 650`) | ya no hay columna de total; ib_col_grand_total conserva su valor |
crosstab: varias medidas y campos en Columnas | una columna Total por medida, sin nombre de medida, y que no se ordenaba | un encabezado « Total » y después un encabezado por medida, ordenable | ||
crosstab: ue_layout_changed | disparado por los gestos del usuario, y solo por is_thousands y of_remove_field | disparado también por toda orden del código que cambia lo que devuelve of_get_layout (of_set_layout incluido), una vez por orden; una sola vez al final de una construcción enmarcada por of_set_redraw(false) … (true); nunca si nada cambia, ni con of_reset | ||
crosstab: un porcentaje (SHOW_PCT_*) | 57.9 % en todos los idiomas | escrito como lo escribe el idioma de visualización: 57.9% en inglés, 57,9 % en francés | ||
crosstab: el filtro de etiqueta | propuesto por el menú del chip de un campo numérico solamente; en una fecha, of_set_label_filter comparaba el año (2025-03-15 valía 2025) | propuesto para cualquier campo; en una fecha, la sobrecarga de texto toma días: LABEL_BEFORE, LABEL_AFTER, LABEL_BETWEEN ("yyyy-mm-dd", días incluidos); la sobrecarga numérica, o LABEL_CONTAINS / LABEL_BEGINS / LABEL_ENDS, en una fecha: -5 | ||
crosstab: of_group_date_field en un campo que no contiene fechas | 0, y un único miembro « (vacío) » | -5 | ||
crosstab: of_add_calc_field / of_add_calc_measure rechazados por la cuadrícula (nombre ya tomado, fórmula que no compila) | 0; solo ue_calc_field_error lo decía | -5 y el motivo en of_get_last_error (ue_calc_field_error se sigue disparando); un nombre que contiene / o ` | : -5; una fórmula acepta .5 y 1e3` | |
crosstab: of_set_value_filter Top o Bottom de menos de 1 miembro; of_expand_to_level por debajo de 1 | llevados a 1 | -5 | ||
crosstab: of_get_cell_value llamado desde un evento disparado durante una orden de este script | -2, como un componente no creado | -4, y of_get_last_error dice por qué: lea después del evento | ||
crosstab: el menú Opciones de la cuadrícula (el engranaje) | « Total general » y « Subtotales » cambiaban los dos ejes según el de las filas | una entrada por eje: fila y columna de total general, subtotales de filas y de columnas | ||
crosstab: of_from_datastore — una columna CHAR, un decimal, el Format de una columna | los blancos de relleno se quedaban en el miembro; el Format se ignoraba | los blancos de relleno se quitan; un decimal se lee con el separador del puesto; el Format de la columna es el formato predeterminado de sus valores | ||
datagrid: una fila seleccionada que la búsqueda o un filtro oculta, o que of_remove_row quita | seguía seleccionada en silencio (of_selected_keys y ue_row_menu_clicked la llevaban) | sale de la selección, y ue_selection_changed lo dice; of_select_rows no toma una fila oculta | ||
datagrid: ib_hidden, is_pin, ii_index puestos al valor que ya tienen; un clic en el asa sin arrastrarla | lanzaban ue_layout_changed | no lanzan nada: nada ha cambiado | ||
datagrid: cambios de disposición entre of_set_redraw(false) y of_set_redraw(true) | un ue_layout_changed por cambio | uno solo, al reanudar, con la disposición final | ||
datagrid: un tipo o un renderizador fuera de las constantes (of_add_column, is_renderer, is_selection_mode); of_add_row_menu_item sin componente creado | aceptados y releídos tal cual, sin efecto; 0 | of_add_column devuelve -5 (of_get_last_error dice cuál); un renderizador desconocido se relee "", un modo desconocido SELECT_NONE; -2 | ||
datagrid: of_reload_row u of_update_row de una celda modificada | la marca «modificada» se quedaba | desaparece: la fila vuelve a tener lo que tiene el DataStore | ||
datagrid: editar una columna con tabla de códigos, una fecha; una columna time de un DataStore | el <select> y el campo de fecha del motor; una hora era texto | la lista y el calendario de la biblioteca (una fecha también se TECLEA, en el orden del idioma); una hora (TYPE_TIME): ordenación, filtro > 09:00, formato, tecleada 9:5 | ||
datagrid: un filtro > 3 sobre una valoración sin tipo o sobre una columna con tabla de códigos | buscaba el texto «> 3»: ninguna fila | compara el dato (el número, el código) | ||
datagrid: un árbol bajo una búsqueda; una fila cuyo padre no está en la cuadrícula | el hijo encontrado seguía oculto; la fila nunca aparecía | se muestran sus antepasados, abiertos; la fila cuelga de la raíz | ||
datagrid: of_from_datastore / of_load_rows tras of_open_source; of_append_rows sin clave tras of_from_datastore; un valor CHAR | la cuadrícula seguía con esqueletos; la fila se rechazaba (-5); conservaba su relleno de espacios | se abandona el origen; la clave sigue al mayor RowID; recortado | ||
datagrid: of_export_xlsx | las fechas se escribían como texto; sin techo | fechas Excel reales; un libro demasiado pesado (más de unos 18 MB) se rechaza, ue_xlsx_saved dice por qué | ||
messagebox: Esc o Alt+F4 en un cuadro sin botón de cancelación | cerraban el cuadro y devolvían 0 — también of_info, que prometía 1 | como en Windows: un cuadro con un solo botón se cierra por ese botón (of_info devuelve 1), un cuadro Sí / No no se cierra — hay que responder; ib_closable = true devuelve el 0 de la 4.0. Una prueba = 2 migrada de un MessageBox ya no deja pasar una eliminación | ||
messagebox: un atajo (of_info, of_error, of_confirm, of_prompt…) tras poner il_accent, is_position, ib_movable, un tamaño o ib_input_password | todo se borraba en silencio: la contraseña de of_prompt se mostraba en claro | el atajo solo sustituye el contenido (título, mensaje, icono, botones, casilla, elecciones); el aspecto y los ajustes del campo se quedan. of_reset() lo borra todo | ||
messagebox: of_reset() tras un cuadro | of_get_last_error, of_checked, of_action y of_input_value seguían hablando del cuadro anterior | se restablecen | ||
messagebox: un campo obligatorio lleno de espacios | aceptado | vacío: el botón predeterminado espera (el valor escrito vuelve tal cual) | ||
messagebox: una zona [action] en el título, una etiqueta o la nota; un enlace en una elección; dos botones con el mismo acceso | la zona no hacía nada; el enlace abría el navegador Y elegía; Alt+letra respondía con el primer botón | la zona responde como en el mensaje (of_action); el enlace se abre sin elegir; Alt+letra pasa el foco de un botón a otro, Intro elige | ||
messagebox: Ctrl+C | perdía el & de &&, copiaba las etiquetas de un botón, ignoraba la entrada | las etiquetas tal como se muestran, « etiqueta: valor » del campo (nunca una contraseña), los detalles y la nota | ||
messagebox: un descendiente que llamaba a xx_set_style_override o xx_clear_style_override (protegidas) | sobrescribía un token de tema del cuadro | han desaparecido: il_accent colorea el cuadro | ||
json y jsontree: un nivel de ruta que contiene ~0 o ~1 | leído tal cual; una clave que contiene / no tenía ruta | ~1 es un / de la clave, ~0 un ~ (JSON Pointer, RFC 6901): paths/~1users lee la clave /users; una clave que contiene un ~ se escribe ~0 en una ruta | ||
json: un nivel de ruta vacío (a//b, a/) o una ruta que empieza por / | rechazado con -5, leído como ausente | un nivel vacío es la clave "", una / inicial es la forma completa del puntero: /name vale name, / designa la clave "" de la raíz | ||
json: of_get_number, of_get_decimal, of_get_longlong sobre una cadena como "12 kg" o "1,5" | leía el principio: 12, 1 | 0: una cadena solo cuenta si es entera un número JSON — "12.50" sigue valiendo 12,5 | ||
json: of_set_members de una clave que el documento ya tiene | la clave se escribía por segunda vez: n_pbt_json leía la primera, un navegador o un servidor la última | el valor se reemplaza en el sitio; una clave que el fragmento repite conserva su último valor | ||
json: of_pretty de un documento con un valor of_set_raw anidado más de 512 niveles | otro documento, cortado a 512 niveles | un texto vacío | ||
jsontree: clic en una clave que contiene /, una clave vacía, o bajo una clave duplicada | una ruta que leía OTRO valor en n_pbt_json | x~1y para la clave x/y, a//b para una clave vacía; of_selected_addressable devuelve false bajo la segunda de dos claves idénticas | ||
jsontree: Ctrl+C con un trozo de texto resaltado con el ratón | el nodo entero | el trozo resaltado | ||
jsontree: un texto JSON que empieza con un BOM | rechazado (ue_error) | mostrado, como lo lee n_pbt_json; is_json se relee tal como se puso | ||
jsontree: el mensaje de ue_error en inglés | Invalid JSON : … | Invalid JSON: … (cada idioma conserva su puntuación); 01, 1., 1e dicen Bad number | ||
jsontree: of_expand_path durante una búsqueda | plegado de nuevo en el siguiente paso de la búsqueda, sin ue_node_toggled | sigue abierto, con los bloques abiertos encima | ||
jsontree: Espacio sobre un valor seleccionado | desplazaba el árbol una página | no hace nada (un bloque sigue plegándose) | ||
xmltree: un espacio entre dos hijos (<b>x</b> <i>y</i>) | no tenía línea: /p/text()[1] devolvía -5 | una línea propia, mostrada ␠, con su ruta: los números de línea de un contenido mixto cambian | ||
xmltree: un texto entre dos hijos (Hello <b>x</b> again) | Hello, again: espacios de los bordes recortados | Hello , again: solo desaparecen los saltos de línea de maquetación | ||
xmltree: of_select_path de un XPath cuyo primer nodo es un espacio de maquetación (//text()) | -5 | se selecciona el primer nodo que el árbol MUESTRA | ||
xmltree: of_selected_value de un elemento que solo contiene saltos de línea (mostrado <x/>) | "" | esos saltos de línea, como los lee n_pbt_xml | ||
xmltree: Ctrl+C con un trozo de texto resaltado con el ratón | el XML del nodo entero | el trozo resaltado | ||
xmltree: el mensaje de ue_error en inglés | Invalid XML : … | Invalid XML: … (cada idioma conserva su puntuación) | ||
xmltree: of_expand_path durante una búsqueda | plegado de nuevo en el siguiente paso de la búsqueda, sin ue_node_toggled | sigue abierto, con los elementos abiertos encima | ||
xmltree: Espacio sobre una hoja seleccionada | desplazaba el árbol una página | no hace nada (un elemento con hijos sigue plegándose) | ||
jsontree, xmltree: una búsqueda que se cierra (Esc en el cuadro, of_clear_search, of_reset, ib_search_enabled = false) | ningún evento: una línea « 3 / 12 » de la aplicación quedaba errónea | ue_search_result(0, 0), una vez; nada cuando no había ninguna búsqueda en curso | ||
PBT_SetDefaultFont con un tamaño: codeeditor, jsontree, xmltree, ribbon, toolbar, crosstab, datagrid, tilesbox, stepbar, listbar, dockcontainer, video, picture, menús e información sobre herramientas | el código, el documento, la cinta (su tamaño del tema) y muchos textos secundarios conservaban su tamaño | siguen el tamaño de la aplicación, en sus proporciones; el tamaño de la aplicación prevalece sobre el de la cinta del tema; un ii_font_size del codeeditor prevalece sobre ambos | ||
markdownview: ue_link_clicked | (string as_url) | (string as_url, string as_kind): un script ya escrito para el evento sigue siendo válido; as_kind (LINK_WEB, LINK_MAIL, LINK_DOCUMENT, LINK_FILE, LINK_OTHER) dice lo que es el enlace — clasifique por él en lugar de por el texto de la dirección | ||
markdownview: una imagen de un documento en un recurso compartido de red | cargada | rechazada, salvo si está en el recurso compartido desde el que se leyó el documento, o con ib_network_pictures; un documento leído de la Web no muestra ningún archivo del equipo | ||
markdownview: un nuevo is_markdown del mismo documento, of_refresh | la vista volvía arriba | la posición de lectura se conserva; un nuevo is_source sigue empezando arriba | ||
markdownview: of_toc, of_scroll_to y una búsqueda justo después de is_source | actuaban sobre el documento anterior | el archivo se lee en segundo plano: of_toc devuelve 0, of_scroll_to y la búsqueda lo esperan; lea la tabla en ue_loaded | ||
markdownview: una columna alineada por el autor (:--, --:) en una aplicación de derecha a izquierda | cambiaba de lado | conserva su lado; solo la alineación por defecto sigue el sentido | ||
markdownview: ue_load_failed para un texto fijado por is_markdown | nunca lanzado | lanzado (REASON_FAILED, as_source vacío) para un texto que el componente no sabe leer; el documento anterior sigue mostrado | ||
menubar: el atajo de una entrada (is_shortcut) | actuaba sobre el estado que dejó la última apertura del menú | lanza primero ue_menu_opening de su menú, como Windows: una entrada que ese evento atenúa no responde, y ue_menu_closed lo dice | ||
menubar: una apertura abandonada antes de mostrarse (deslizamiento rápido, Esc o Alt durante ue_menu_opening, pérdida del foco) | ue_menu_opening sin ue_menu_closed; tras Esc el desplegable se abría igualmente | no se abre nada, y sigue ue_menu_closed: cada ue_menu_opening recibe exactamente un ue_item_selected o un ue_menu_closed | ||
menubar: Alt y luego Esc, F10 y luego Esc | Esc iba también a la ventana: su botón Cancelar | Esc sale del modo menú y se queda en la barra | ||
menubar: un menú abierto con el teclado (Alt+letra, F10 y luego Intro) | ninguna entrada resaltada: Intro no elegía nada | la primera entrada está resaltada, Intro la elige | ||
menubar: Alt cuando la barra ya tiene el foco | el modo menú cambiaba al pulsar: Alt+Mayús (distribución del teclado) lo encendía | al soltar un Alt solo, como Windows | ||
menubar: un clic en un título atenuado o en la parte vacía de la barra | la barra se quedaba el teclado, el campo en edición lo perdía | el teclado se queda en el control donde se escribía | ||
menubar: is_shortcut en una dirección que no designa ninguna entrada | la tecla quedaba tomada en toda la ventana, incluso tras of_clear | no se arma nada: póngalo después de of_add_item | ||
pdfviewer: ib_allow_save / ib_allow_print de un visor | valían para todos los visores de la aplicación; un of_reset en otro lugar devolvía Guardar a un documento confidencial | cada visor conserva su propio ajuste | ||
pdfviewer: ib_allow_save / ib_allow_print asignados antes de is_source | tres cargas, tres ue_load_completed; un documento fallido se reintentaba en cada cambio | una sola carga; un documento fallido no se reintenta | ||
pdfviewer: ii_page asignado mientras se muestra un documento, luego otro is_source | el documento siguiente se abría en esa página | la página era la del documento mostrado: el siguiente se abre en su primera página; para abrir un documento en una página, asigne is_source y luego ii_page | ||
pdfviewer: el mismo valor asignado otra vez (ii_page, ii_zoom, is_fit, ib_viewer_toolbar) | volvía a cargar el documento y activaba ue_load_completed | no hace nada | ||
pdfviewer: ii_zoom fuera de 25 a 500 | pasado tal cual al lector | llevado a 25-500, releído tal como se aplicó | ||
pdfviewer: una dirección https://nombre:secreto@…; un origen hecho de espacios | pasada al lector, que la rechazaba con un motivo impreciso, el secreto volvía en los eventos; releído tal cual, of_refresh devolvía 0 | rechazada de inmediato con ue_load_failed (REASON_UNSUPPORTED): descargue el documento con el restclient; releído "", of_refresh devuelve -4 | ||
picture: id_max_zoom en una imagen más grande que su marco | la rueda, + e id_zoom subían hasta el tamaño real | se detienen en el tope; solo la tecla 1 va más allá | ||
picture: una nueva is_source, o ib_zoomable = false, en una imagen ampliada | el zoom volvía a 1.0 sin decir nada | se lanza ue_zoom_changed(1.0) (of_reset sigue mudo); fije id_zoom después de is_source | ||
picture: una ruta rodeada de espacios (una columna CHAR) | rechazada, REASON_UNSUPPORTED | mostrada; is_source se relee tal como se escribió | ||
picture: las teclas del zoom con Ctrl, Alt o Windows pulsado | Ctrl++ ampliaba, Alt+1 mostraba el tamaño real | se dejan a su aplicación (atajos, teclas de acceso) | ||
picture: una imagen recoloreada (mono:, tint:) de otro sitio cuyo servidor rechaza las peticiones de otro origen | ue_loaded y un marco vacío | ue_error con REASON_FAILED, el mensaje dice por qué | ||
radialmenu: is_tooltip, is_super_tooltip_title, is_super_tooltip_text, is_super_tooltip_image | existían, nunca mostraban nada: el lanzador no tiene superficie | retiradas: el compilador muestra la línea, bórrela | ||
radialmenu: of_close, un segundo of_show, of_clear u of_reset mientras una rueda está abierta | ue_dismissed llegaba cuando la rueda dejaba la pantalla; of_is_open seguía verdadero hasta entonces | ue_dismissed en el acto, una vez por apertura; of_is_open falso en cuanto vuelve la llamada | ||
radialmenu: of_remove_item de una rama que la rueda abierta no muestra (oculta) | la rueda se cerraba (ue_dismissed) | la rueda sigue abierta; solo se cierra si mostraba la rama | ||
radialmenu: of_remove_item con una clave suelta ("csv") | -5 | resuelta como lo hace of_item (la única rama que la lleva); -5 si dos ramas la comparten | ||
radialmenu: of_show de una rueda sin nada que mostrar mientras otra está abierta | ue_dismissed, y la rueda anterior seguía en pantalla | la rueda anterior también se cierra: un ue_dismissed por cada apertura | ||
radialmenu: il_back_color_hover de una rama sin il_text_color_hover | la etiqueta señalada conservaba el texto del tema (blanco sobre rosa pálido en un tema oscuro) | se elige un texto legible sobre ese tono; un color que usted pone nunca se cambia | ||
restclient: ib_windows_auth o is_client_certificate, y una redirección hacia otro host | las credenciales de Windows y el certificado seguían la redirección | solo el host y el puerto de la petición los reciben: el otro host recibe la petición sin ellos | ||
restclient: un valor de cabecera más allá del Latin-1 (griego, japonés…) | aceptado por of_set_header (0), luego cada petición del objeto devolvía -5 | rechazado ya por of_set_header (-5, of_get_last_error() dice por qué); of_set_basic los acepta: su par sale como base64 de su UTF-8 | ||
restclient: un método mal formado ("GE T"), credenciales en la URL (https://user:pwd@…), un nombre de campo de of_upload con una comilla | -4 «request failed: 0»; las credenciales desaparecían sin decir nada; el cuerpo multipart quedaba roto | -5, y el motivo en of_get_last_error() (para credenciales: use of_set_basic) | ||
restclient: una 303, o una 301 o 302 tras un POST, que sigue como GET | conservaba el Content-Type del cuerpo de partida | sale sin Content-Type | ||
restclient: ue_progress | lanzado para todo cuerpo asíncrono, sin llegar nunca al total: una barra se quedaba en el 39 % | lanzado para todo cuerpo asíncrono (la documentación lo dice), y el último, justo antes de ue_response, vale el total | ||
restclient: of_response_header de una cabecera enviada varias veces (Link, Set-Cookie) | solo el primer valor | todos, unidos por , — Set-Cookie por un salto de línea | ||
restclient: el User-Agent enviado | PBToolboxAI/4.0, escrito en el código | la versión de la biblioteca; of_set_header("User-Agent", …) lo sigue sustituyendo | ||
restclient: una petición cuando el cliente HTTP no pudo crearse | salía en una sesión desechable, sin autenticación de Windows, certificado de cliente ni cookies | -2, y il_status lo dice | ||
restclient: of_set_header("Authorization", …) tras of_set_basic | salían las dos autenticaciones | una sola autenticación: la Authorization puesta sustituye a la Basic | ||
ribbon: un valor escrito por código (is_text, id_value) mientras el campo de un cuadro combinado o de un contador tiene el foco | el campo conservaba el texto antiguo; al salir se lanzaba ue_combo_changed / ue_value_changed con el valor antiguo, que reemplazaba el suyo | el campo lo muestra de inmediato, salvo si el usuario está tecleando (gana lo tecleado); salir del campo sin teclear no lanza nada | ||
ribbon: una etiqueta con marcas (is_label, título de una pestaña, de un grupo, de una banda, botón de aplicación) | mostrada tal cual, marcas incluidas (el panel de un grupo replegado sí las interpretaba) | el texto enriquecido con etiquetas se interpreta en todas partes; un texto del usuario pasa por of_escape_markup | ||
ribbon: la rueda sobre la cinta | cada pequeño movimiento de un panel táctil cambiaba de pestaña; una cinta replegada también cambiaba de pestaña sin mostrar nada | una pestaña por muesca de la rueda (los pequeños movimientos se suman); nada en una cinta replegada | ||
ribbon: of_add_spinner con un paso de 0 o menos, o un mínimo por encima del máximo; id_min / id_max / id_step incoherentes | aceptados: flechas muertas o invertidas, un valor fuera del rango mostrado | of_add_spinner devuelve -5 y mantiene el valor dentro del rango; un paso de 0 o menos se rechaza (of_get_last_error dice por qué); un límite escrito más allá del otro lo arrastra consigo, como en un NumericUpDown — el orden de las dos escrituras ya no importa | ||
ribbon: un is_keytip que no está hecho de letras A-Z y cifras ("É", "-") | guardado y leído, nunca alcanzable con el teclado | rechazado: nada cambia, of_get_last_error dice por qué | ||
ribbon: Esc en el segundo nivel de las teclas de acceso (los comandos de una pestaña) | cerraba todas las teclas | vuelve a las letras de las pestañas, como en Office; un segundo Esc cierra | ||
speechout: of_speak_from(0) o un número negativo | leía desde la primera frase | -5, no se lee nada (las posiciones cuentan desde 1) | ||
speechout: ii_rate, ii_pitch, ii_volume puestos fuera de su intervalo (ii_rate = 1000) | se releían tal como se pusieron (1000) mientras la voz aplicaba el límite | se releen tal como se aplican (400) | ||
speechout: un trozo [rate]…[/rate] en una frase | una frase propia: su ue_sentence, su número, y un punto tras [/rate] se volvía una «frase» | se queda en su frase: un solo ue_sentence con el texto entero, un solo número, ue_word cuenta en ese texto, of_spoken_text una línea por frase; la puntuación va con el trozo | ||
speechout: [rate=0] | leído al 100 % | la velocidad más lenta, 10 % | ||
speechout: una regla de of_add_replacement sobre una palabra que es también el nombre o el valor de una etiqueta (total con [mark=total], rate, una palabra en [spell]) | reescribía la etiqueta: la marca cambiaba de nombre, la etiqueta se leía en voz alta, el texto deletreado cambiaba | la regla solo reescribe el texto entre las etiquetas | ||
speechout: un equipo sin ninguna voz | ue_error, luego una lectura «en curso»: ue_started, cada ue_sentence, ue_stopped; of_speak_sync devolvía 0 | ue_error y nada más: ninguna lectura, ningún ue_started; of_speak_sync devuelve -4 | ||
speechout: is_lang sin región ("fr", "en") | ue_voice_fallback en cada lectura | ningún repliegue para una voz de ese idioma, sea cual sea su región | ||
speechout: of_clear_queue tras un of_speak (la lectura en curso no es un texto de la cola) | ue_queue_done al final de la lectura | ningún ue_queue_done: no se leyó ningún texto de la cola | ||
speechout: una inicial (John F. Kennedy), un mes abreviado (Oct. 10), una sigla con puntos (U.S.) | terminaba la frase | se queda en la frase (un mes o una sigla la termina ante una mayúscula, como etc.): los números de frase pueden cambiar | ||
statusbar: un panel clicable atenuado que lleva una información sobre herramientas | la información no aparecía nunca | aparece, para decir por qué el panel está atenuado | ||
statusbar: of_count, of_keys_at, of_has sobre la dirección de un panel ("enc") | 0, "", false: las entradas de su lista no se veían | las entradas de su lista, sin los separadores | ||
statusbar: una posición en una lista desplegable (of_insert_menu_item, of_move_menu_item) | contaba los separadores | cuenta solo las entradas, como las posiciones de los paneles | ||
statusbar: una clave de panel o de entrada que empieza por __ | aceptada | rechazada, -5: está reservada al componente | ||
statusbar: is_tooltip y los cinco colores en una entrada de lista (of_menu_item) | guardados y releídos, sin efecto | ignorados, releídos vacíos (-1 para un color): el menú nativo no los muestra | ||
statusbar: el asa (ib_show_resize_grip) en una hoja MDI, o una barra que no está al pie de su ventana | redimensionaba el marco, desde su esquina | redimensiona la hoja; sin asa cuando la barra no ocupa la esquina inferior | ||
statusbar: la tecla Menú o Mayús+F10 en un panel con el foco | nada | ue_panel_rclicked, en la esquina inferior izquierda del panel | ||
stepbar: Intro o Espacio sobre un paso, en una ventana que tiene un botón predeterminado | ue_step_clicked y el botón predeterminado («Siguiente») se disparaba | solo ue_step_clicked: la tecla se queda en la barra | ||
stepbar: of_clear_steps mientras la barra está en un paso | no lanzaba nada | ue_step_changed(número abandonado, clave abandonada, 1, ""), como la retirada del paso en curso; of_reset no lanza nada | ||
stepbar: ii_current más allá de «todo terminado» (más que el número de pasos + 1) | ue_step_changed anunciaba enseguida un número que no existía; la llegada del paso era muda | no se lanza nada mientras la barra espera; ue_step_changed se lanza cuando llega el paso | ||
stepbar: of_move_step en una barra «todo terminado» | podía reabrir la barra: un paso volvía a estar en curso, con ue_step_changed | la barra sigue en «todo terminado», no se lanza nada | ||
stepbar: NAV_VISITED, un paso insertado o desplazado delante del paso en curso | pulsable | mostrado terminado, pero no pulsable: nunca se alcanzó | ||
stepbar: un paso con advertencia (STATE_WARNING) | un marcador ámbar | un marcador ámbar y un segundo anillo ámbar: ya no se parece a un paso hecho donde el acento es ámbar | ||
statictext: ue_hyperlink | (string as_url) | (string as_url, boolean ab_opened): un script ya escrito para el evento sigue siendo válido; ab_opened vale FALSE cuando el enlace no se abrió (un esquema distinto de http, https, mailto — of_get_last_error() dice por qué —, o mantenido cerrado por ue_hyperlink_opening) | ||
statictext desactivado sobre un fondo propio (il_back_color, un fragmento [bk]) | el texto tomaba el gris del tema, ilegible sobre un fondo oscuro o de color | sus colores se conservan, atenuados; sobre la superficie del tema, el gris del tema, como antes | ||
statictext: PBT_SetDefaultFont con un tamaño | el tamaño se quedaba en 11 pt | se aplica el tamaño dado (11 pt sin él, sin cambios) | ||
statictext: ii_font_size fuera de 6 a 200 | aplicado tal cual | llevado al límite más cercano, como la etiqueta [size], y releído tal como se aplicó | ||
statictext: doble clic en una palabra con ib_selectable | un solo ue_clicked antes de ue_double_clicked | dos ue_clicked y luego ue_double_clicked, como el StaticText de PowerBuilder; soltar tras un arrastre que selecciona sigue sin clic | ||
statictext: of_reset de un texto anunciado como cortado | nada | ue_text_overflow(false) | ||
statictext: is_text releído tras of_append_text, cuando una línea dejaba una etiqueta abierta | [b]Start[br]two: vuelto a poner, la negrita seguía en la línea siguiente | [b]Start[/b][br]two, lo que muestra la pantalla; una línea vacía conserva su altura; con ib_marquee, las líneas se desplazan como una sola línea | ||
statictext: ib_auto_width y un texto vaciado | conservaba el ancho del texto anterior | se encoge a su margen; un cambio de tema también vuelve a medir el ancho | ||
xml: of_count, of_get_values, of_get_attrs, of_get_attr_names cuando no hay nada cargado, un elemento construido sigue abierto o el motor rechaza el XPath | devolvían 0, como una búsqueda sin resultado | devuelven -4 (-2 si la página no responde), of_get_last_error() dice por qué; 0 es siempre un cero real. Una prueba > 0 no cambia; una prueba = 0 que quería decir «nada encontrado» ve ahora el rechazo aparte | ||
xml: of_get_attr y of_remove_attr de un atributo ausente, of_get_attrs con un nombre vacío | vacío sin motivo, 0 («hecho»), 0 | vacío y «no such attribute» en of_get_last_error() (un atributo escrito vacío queda sin motivo), -4, -5 | ||
xml: of_set_value, of_set_attr, of_add_child de un texto con un carácter de control (Char(1)) o un CR | escrito tal cual: el documento ya no se recargaba, el CR volvía como LF | el carácter prohibido se elimina, como hace el builder; el CR se escribe y se relee | ||
xml: builder — un segundo elemento en la cima, un texto sin elemento abierto, un atributo tras un hijo | escrito (dos raíces) o ignorado sin decir nada | dejado fuera, e of_get_last_error() dice por qué | ||
xml: of_get_value("sum(//qty)") sobre un texto no numérico; of_get_value("/") | el texto NaN; vacío | vacío y «the expression is not a number»; el texto del documento |
La receta: nada que cambiar.
12.6 Lo que se ha añadido #
Nada de lo siguiente pide modificar su código. Los ocho nuevos componentes de la 5.0 se presentan en las notas de la versión.
| Objeto | Añadido |
|---|---|
| progressbar | is_unit: un texto escrito tras la lectura ("of 500 rows", "MB") |
| datagrid | is_mask de una columna (n_pbt_datagrid_column): la máscara de entrada de una columna numérica; una columna sin formato de visualización muestra su is_mask |
| datagrid | el teclado de los encabezados (Flecha arriba desde la primera fila; Intro ordena, Mayús+Intro añade a la ordenación; Alt+Abajo o la tecla Menú abre el menú de la columna; Ctrl+Mayús+flechas la mueven, Alt+flechas cambian su ancho); TYPE_TIME; of_get_last_error dice por qué una llamada devolvió -5 |
| ribbon | is_mask e is_format de un contador (n_pbt_ribbon_item); is_group: conmutadores excluyentes de un grupo (n_pbt_ribbon_item) y entradas de opción de un menú (n_pbt_ribbon_menu_item); ue_item_rclicked (clic derecho en un control, un grupo, una pestaña o un botón de la barra de acceso rápido, con el punto de pantalla al_x, al_y; también tecla Menú y Mayús+F10) y ue_rclicked (fuera de todo item); is_title de un grupo contextual (n_pbt_ribbon_ctx_group), cuya información aparece en la banda; teclas de acceso de los botones de la barra de acceso rápido; colores de item de las entradas de menú y de los botones de la barra de acceso rápido; nombres accesibles de todos los controles |
| breadcrumb | escribir la ruta se convierte en una barra de direcciones: ib_auto_complete, ue_path_typing y of_add_suggestion (compleción mientras se escribe), ib_veto_path, ue_path_entering e is_path_error (una ruta rechazada conserva lo escrito) |
| chartcartesian | of_from_datastore (DataStore, DataWindow, DataWindowChild), of_map y las constantes ROLE_*, of_reload: el gráfico de un DataWindow (filas sumadas por categoría y serie, releídas en su sitio); of_set_point_color / of_get_point_color; ue_point_rclicked, ue_rclicked; of_get_categories; of_remove_axis_section |
| codeeditor | of_undo, of_redo, ib_can_undo, ib_can_redo y ue_undo_state_changed (el historial de deshacer controlable); ue_modified_changed; of_toggle_comment (Ctrl+/); of_next_marker (F8); ib_match_brackets; ib_tab_moves_focus (Ctrl+M) |
| crypto | los blobs (of_base64_encode_blob, of_base64_decode_blob, of_hash_blob, of_hmac_blob, of_crc32_blob, of_encrypt_blob, of_decrypt_blob); of_base64_encode_file_to_file; of_jwt_verify_jwks, of_jwk_to_pem, of_pem_to_jwk; los claims esperados de of_jwt_verify e il_jwt_leeway_seconds; JWT_HS384/HS512, JWT_RS384/RS512, JWT_PS256/PS384/PS512, JWT_ES384 y KEY_EC_P384; el esquema y el hash de of_sign / of_verify (SIGN_PKCS1, SIGN_PSS); los datos adicionales de of_encrypt_with_key / of_decrypt_with_key; el hash de of_rsa_encrypt / of_rsa_decrypt; los ajustes de of_totp_code, of_totp_verify, of_totp_uri y of_hotp_code; of_password_needs_rehash |
| buttonbar | is_style de un botón (STYLE_PRIMARY, STYLE_FLAT, STYLE_DANGER), is_badge (una insignia de texto), il_badge_color, is_mnemonic, ii_image_size e ii_badge_size de la barra, ib_enabled de la barra entera, ue_button_rclicked y ue_rclicked, of_clear_shortcuts |
| commandpalette | of_load_menu(menu): la paleta llenada desde un menú PowerBuilder, releído en cada apertura; of_loaded_item(as_key) devuelve el elemento de un comando; of_get_last_error() |
| dockcontainer | ib_front de un panel (n_pbt_dock_panel, solo lectura): el panel que muestra su pila; la entrada Ocultar automáticamente del menú del panel, también en la lengüeta del riel; Mayús+F10 y la tecla Menú abren ese menú bajo la pestaña; el panel activo, el que tiene el teclado: of_active_panel() y ue_active_panel_changed(as_key) |
| crosstab | of_value(position) y su handle n_pbt_crosstab_value (un valor del área Valores: is_agg, is_show, is_conditional_formatting, is_format, ib_negative_red, is_label, of_field()); of_value_count, of_remove_value, of_move_value; of_get_cell_rows (las filas del DataStore detrás de una celda); is_format de un campo; AGG_COUNT_ROWS, LABEL_BEFORE, LABEL_AFTER |
| messagebox | of_messagebox (los argumentos de MessageBox(), Question! y YesNo! incluidos) y las constantes BUTTONS_*; of_retry_cancel; el botón predeterminado de of_confirm, of_yes_no, of_yes_no_cancel (al_default); Reintentar, Anular, Omitir, Cerrar traducidos; ib_closable, ib_sound; is_details, is_details_label; is_footer, is_footer_icon; ib_input_multiline, il_input_max_length, is_input_pattern, is_input_error; of_prompt que enmascara y exige; una elección desactivada (of_add_choice, ab_enabled) |
| jsontree | of_get_layout, of_set_layout y ue_layout_changed (los pliegues, la selección, la línea de arriba); of_selected_addressable, of_selected_type, of_selected_count, of_copy_path; ue_node_rclicked (clic derecho, tecla Menú); ib_find_decoded (la búsqueda en los valores decodificados, botón &) |
| xmltree | of_find_xpath (cada nodo de un XPath, recorrido con of_search_next); of_get_layout, of_set_layout y ue_layout_changed (los pliegues, la selección, la línea de arriba); of_selected_kind (constantes KIND_*), of_selected_name, of_selected_namespace, of_copy_path; ue_node_rclicked (clic derecho, tecla Menú); ib_find_decoded (la búsqueda en los valores decodificados, botón &) |
| json | of_from_datastore y of_to_datastore (DataStore, DataWindow, DataWindowChild): un DataStore como array de objetos tipados, y vuelta; fechas ISO 8601 (of_set_date, of_set_datetime, of_set_time, of_add_date, of_add_datetime, of_add_time, of_get_date, of_get_datetime, of_get_time); of_get_last_error y of_error_position (dónde un texto no es JSON); of_escape_key |
| listbar | ue_item_invoked (un clic en la entrada, incluida la ya seleccionada); ib_search, is_filter, ue_filter_changed (una búsqueda); of_from_datastore (DataStore, DataWindow, DataWindowChild), of_map y las constantes ROLE_* (una fila = una entrada) |
| markdownview | is_base_path, ib_allow_html (una lista corta de etiquetas HTML inertes), ib_network_pictures, ib_remote_pictures, ib_tasks_editable y ue_task_toggled, ib_track_heading y ue_heading_visible, is_position, ii_zoom, of_selected_text, of_copy y Ctrl+Insert, las constantes LINK_*; las alertas de GitHub, las direcciones de correo sueltas y los emojis |
| menubar | of_load_menu(menu): toda la barra a partir del menú PowerBuilder de una ventana, releído en cada apertura, sus Clicked ejecutados; of_loaded_item; of_insert_item (una entrada en un rango) y of_clear_items (vaciar una cascada conservando la entrada); of_open, of_close, of_is_open |
| pdfviewer | of_load_blob(blob) y of_load_blob(blob, string): un PDF contenido en un blob (leído con SELECTBLOB), mostrado sin fichero, sea cual sea su tamaño; is_find (un texto resaltado al abrir); ib_navigation_pane (el panel lateral del lector); is_destination (abrir en un destino con nombre del PDF); ib_allow_search, ib_allow_rotate y ib_allow_fullscreen (los comandos Buscar, Girar y Pantalla completa de la barra del lector) |
| picture | of_set_picture(blob): una imagen guardada en memoria (SelectBlob), como SetPicture del Picture nativo; ib_clickable: la imagen se convierte en un botón para el teclado (Tab, Intro, Espacio); los formatos TIFF, WMF, EMF y RLE, convertidos al vuelo; un nombre para los lectores de pantalla que dice el distintivo y el fallo |
| radialmenu | of_show_over(dragobject ado_control {, boolean ab_keyboard}): la rueda centrada en un control, su primera rama encendida cuando viene del teclado; en el manejador de rama, is_image (icono cambiado en su sitio), is_tone (constantes TONE_* de u_pbt_radialmenu) e is_group (grupo de opción) |
| restclient | of_url y of_url_encode (una consulta de URL codificada); of_post_form y of_post_form_async (un formulario HTML); of_oauth_client_credentials (un token OAuth2 renovado solo); of_retrieve (DataStore, DataWindow, DataWindowChild: un array JSON en filas); las cabeceras de una sola petición (of_request y of_request_async, cuarto argumento as_headers); is_last_request; ib_check_revocation |
| statusbar | ib_spring (y una anchura de -1 en of_add_panel, of_insert_panel): un panel que toma el espacio libre; of_dock_bottom (la barra al pie de su ventana); is_help e is_help_panel (la MicroHelp de un marco PowerBuilder); ib_announce (lectores de pantalla); la información de un texto recortado |
| tilesbox | of_move_tile(as_keys, as_to_key, al_position): un mosaico enviado por el código a otro grupo, con sus colores, su distintivo y sus caras; Esc cancela un arrastre, el panel se desplaza cuando el puntero se acerca a su borde; un lector de pantalla oye el distintivo y la banda de un mosaico; un icono SVG se mantiene nítido en un mosaico grande; el encabezado de un grupo se ilumina bajo el puntero; se respeta el ajuste «menos animaciones» de Windows |
| statictext | ib_mnemonic (el & de una etiqueta PowerBuilder), ii_max_lines (como máximo N líneas, «…»), il_max_log_lines y of_clear (un registro acotado, vaciado), ii_max_width (techo de ib_auto_width), ib_veto_links y ue_hyperlink_opening (decidir si un enlace se abre); un registro se anuncia línea a línea a los lectores de pantalla; desactivado, las zonas del marcado salen del orden de Tab |
| xml | of_get_number, of_get_decimal, of_get_longlong, of_get_boolean, of_get_date, of_get_datetime: el valor en el XPath comprobado contra su tipo XML Schema y leído igual en cualquier máquina (NULL e of_get_last_error() si no es de ese tipo) |
| xml | sobrecargas decimal, date, datetime, boolean de of_leaf, of_element_attr y of_set_value: escritas con un punto y en ISO 8601 en cualquier máquina |
12.7 buttonbar: clave, etiqueta y luego icono; el « & » y el atajo #
La barra de botones hablaba distinto del resto de la biblioteca: el icono antes de la etiqueta, la posición como segundo argumento, y un is_shortcut que quería decir « letra Alt » donde en todas partes quiere decir « atajo » — is_shortcut = "Ctrl+S" armaba Alt+C. La 5.0 la alinea con button, la barra de herramientas y el CommandButton de PowerBuilder.
| Qué | 4.0 | 5.0 |
|---|---|---|
| Agregar un botón | uo.of_add_button("save", "img\save.png", "Save") | uo.of_add_button("save", "&Save", "img\save.png") |
| Un botón de solo texto | uo.of_add_button("ok", "", "OK") | uo.of_add_button("ok", "OK") |
| Insertar un botón | uo.of_insert_button("mid", 2, "", "Mid") | uo.of_insert_button("mid", "Mid", "", 2) |
| La letra Alt de un botón | is_shortcut ← "S" (Alt+S) | la etiqueta "&Save", o uo.of_button("save").is_mnemonic = "S" |
| Un atajo en un botón | uo.of_register_shortcut("Ctrl+S", "save") | lo mismo, o uo.of_button("save").is_shortcut = "Ctrl+S" — mostrado en el tooltip |
| Un « & » en una etiqueta | mostrado tal cual | marca la letra Alt; && para un « & » escrito |
| La insignia | uo.of_button("inbox").il_badge = 3 | uo.of_button("inbox").is_badge = "3" (un texto: "New", "!"); il_badge sigue aceptado |
El botón con el foco, sin is_default | pintado con el acento lleno | solo su anillo de foco |
is_shortcutde un botón es un atajo. Durante la 5.0, una letra sola todavía se lee ahí como la letra Alt de la 4.0 (pasa ais_mnemonic); escriba mejor el « & » en la etiqueta. Un atajo que la ventana nunca puede lanzar (una letra sola,Ctrl+Shift) se rechaza:is_shortcutse relee vacío,of_register_shortcutdevuelve-5.- Un botón deshabilitado ya no roba una tecla. El botón predeterminado deshabilitado de una barra, o la letra Alt de un botón deshabilitado, deja Intro y la letra a la ventana — ya no van al botón de OTRA barra (dos hojas MDI); el atajo de un botón deshabilitado deja su tecla a la ventana (un acelerador de menú, por ejemplo). Las flechas saltan un botón deshabilitado.
// 4.0 : the icon before the label
uo_bar.of_add_button(/*key*/ "save", /*image_file*/ "img\save.png", /*text*/ "Save")
// The Alt letter went to is_shortcut (the letter S alone), the chord to of_register_shortcut
uo_bar.of_register_shortcut(/*chord*/ "Ctrl+S", /*key*/ "save")
// 5.0 : key, label, icon - the "&" of the label gives Alt+S
uo_bar.of_add_button(/*key*/ "save", /*text*/ "&Save", /*image*/ "img\save.png")
// The chord is a property of the button, shown in its tooltip
uo_bar.of_button(/*key*/ "save").is_shortcut = "Ctrl+S"
La receta: compile; una llamada de of_insert_button queda señalada (la posición pasa al final). Un of_add_button de tres argumentos sigue compilando: intercambie los dos últimos (la etiqueta y luego el icono) — un botón cuya etiqueta es una ruta de archivo le muestra los que quedan. Sustituya cada is_shortcut de una letra por un « & » en la etiqueta, y duplique todo « & » que deba mostrarse (R&&D).
12.8 crosstab: el formato de los valores mediante is_format #
La tabla dinámica escribía los números de una medida con una función de cuatro o cinco argumentos (decimales, separador de miles, símbolo, símbolo delante), que valía para todos los valores de un campo: el mismo campo dos veces en Valores — el importe, y su parte del total — no podía tener dos formatos. La 5.0 lo pone bajo el idioma de los gráficos y los indicadores: un formato de visualización de PowerBuilder en is_format, en el handle del campo (of_field) para todos sus valores, o en el handle de un valor (of_value(position), nuevo) solo para él. Vacío, un valor toma el Format de la columna del DataWindow. Ningún nombre antiguo sobrevive.
| Qué | 4.0 | 5.0 |
|---|---|---|
| El formato de todos los valores de un campo | uo.of_set_value_format("amount", 2, "locale", "$", true) | uo.of_field("amount").is_format = "$#,##0.00" |
| Un símbolo después del número | uo.of_set_value_format("amount", 0, "", " EUR") | uo.of_field("amount").is_format = '#,##0" EUR"' |
| El formato de un valor (el mismo campo dos veces) | — | uo.of_value(2).is_format = "#,##0.00" |
| Los negativos en rojo | solo el menú del chip | uo.of_value(1).ib_negative_red = true |
| Volver al formato predeterminado | uo.of_clear_value_format("amount") | uo.of_field("amount").is_format = "" (el Format de la columna del DataWindow) |
- El separador de miles de un valor sin formato sigue siendo
is_thousands, como el menú Opciones de la cuadrícula: es lo que hacía unof_set_value_formatcon separador vacío. La moneda que propone el menú del chip sigue siendois_currency_symbol. - Un valor sin formato muestra ahora el Format de su columna del DataWindow, leído por
of_from_datastore: un importe cuya columna lleva#,##0.00se muestra con dos decimales sin una línea de código.
// 4.0 : decimals, thousands, symbol and its side as arguments - for every value of the field
uo_cross.of_set_value_format(/*field*/ "amount", /*decimals*/ 2, /*thousands*/ "locale", /*suffix*/ "$", /*symbol_before*/ true)
// 5.0 : a display format, written as in a DataWindow - for the field, then for its second value alone
uo_cross.of_field(/*field*/ "amount").is_format = "$#,##0.00"
uo_cross.of_value(/*position*/ 2).is_format = "#,##0"
La receta: compile; cada of_set_value_format y of_clear_value_format queda señalado. Escriba el formato como en un DataWindow: ai_decimals da el número de 0 tras el punto, un separador de miles da la , de agrupación ("none": ninguno), el símbolo se escribe delante o detrás (entre comillas si contiene cifras o espacios). El formato de un solo valor va en of_value(<posición>).is_format.
12.9 listbar: el clic derecho lleva su punto, una disposición se anuncia #
La barra lateral se une a la biblioteca en tres puntos: el clic derecho de una entrada da su punto de pantalla como el de los árboles, las rejillas y el kanban; una orden del código que cambia la disposición la anuncia como un gesto; una entrada atenuada ya no se convierte en la selección. Gana también un evento para el clic en la entrada ya seleccionada, una búsqueda y la construcción desde un DataStore (12.6).
| Qué | 4.0 | 5.0 |
|---|---|---|
ue_item_rclicked | (string as_keys) | (string as_keys, long al_x, long al_y): el punto en píxeles de pantalla; la tecla Menú y Mayús+F10 también lo disparan |
of_set_layout que cambia la disposición | ningún evento | un ue_layout_changed (nunca ue_section_toggled) |
of_move_item / of_move_section al rango que ya ocupaba | ue_layout_changed | nada: nada se ha movido |
of_select_item de una entrada atenuada | 0, se convertía en la selección | -5, sin plantear ue_selection_changing; atenuar la entrada ya seleccionada la mantiene |
ib_auto_width leído mientras la barra está en riel | true | lo que la aplicación puso |
of_item de una dirección de un solo nivel ("nav") | alcanzaba la sección | un handle que no nombra nada; una sección se alcanza con of_section |
| La misma letra escrita dos veces | un prefijo dd, a menudo sin coincidencias | la siguiente línea que empieza por ella; un Espacio en medio de un prefijo le pertenece |
| Una entrada atenuada bajo el puntero | sin información sobre herramientas | su información sobre herramientas aparece; el clic sigue sin hacer nada |
// 4.0 : PointerX() of the userobject - the menu opened too high under a ribbon
m_entry.PopMenu(PointerX(), PointerY())
// 5.0 : the pointer of the WINDOW for a PowerBuilder menu (al_x, al_y serve a menu of the library)
m_entry.PopMenu(parent.PointerX(), parent.PointerY())
La receta: nada se niega a compilar — un script de ue_item_rclicked conserva as_keys. Abra su menú en el puntero de la ventana (parent.PointerX()), o pase al_x, al_y a of_show de un contextmenu. Ponga la selección inicial antes de activar ib_veto_selection, y compruebe que su ue_layout_changed acepta la llamada que of_set_layout dispara ahora.
12.10 scheduler: la naturaleza de un cambio y los valores anteriores #
El calendario se une al diagrama de Gantt: la pregunta hecha antes de un gesto dice si se trata de un desplazamiento o de un redimensionamiento, y los eventos que siguen dan los valores anteriores — un registro, una anulación o una confirmación ya no tienen que guardar su propia copia de cada cita. Una selección que su código quita se anuncia, y cuatro llamadas rechazan ahora lo que aceptaban en silencio.
| Qué | 4.0 | 5.0 |
|---|---|---|
ue_appointment_changing | (string as_key, string as_start, string as_end, string as_resource) | (string as_key, string as_kind, string as_start, string as_end, string as_resource): as_kind vale CHANGE_MOVE o CHANGE_RESIZE |
ue_appointment_moved | (string as_key, string as_start, string as_end, string as_resource) | (string as_key, string as_start, string as_end, string as_resource, string as_old_start, string as_old_end, string as_old_resource) |
ue_appointment_resized | (string as_key, string as_start, string as_end) | (string as_key, string as_start, string as_end, string as_old_start, string as_old_end) |
| Su código retira, vacía o recarga la cita seleccionada | ningún evento | ue_selection_changed(""); of_reset permanece mudo |
of_add_appointment cuyo fin precede al inicio | 0, el fin pasaba a ser inicio + 30 min | -5, of_get_last_error dice por qué |
of_scroll_to_time("abc") | 0, nada se desplazaba | -5 |
of_set_field sobre la columna que desempeña ROLE_KEY | 0, dos citas con la misma clave | -5: una clave cambia recargando |
of_show_appointment de una cita oculta, filtrada o en un recurso oculto | 0, la vista se iba a un día donde no se veía nada | -5, nada se mueve |
is_now puesto tras una navegación del usuario | devolvía la vista a su día | la vista se queda donde fue el usuario |
of_clear_appointments | conservaba las columnas del DataStore para of_map | olvida el DataStore: of_map acepta las columnas del siguiente |
// 5.0 : ue_appointment_changing event of uo_sched : (string as_key, string as_kind, string as_start, string as_end, string as_resource) returns boolean
// A resize keeps the day : only a move is checked
if as_kind = u_pbt_scheduler.CHANGE_RESIZE then return true
// Nothing on a Saturday or a Sunday : returning false puts the appointment back
if DayNumber(Date(Left(as_start, 10))) = 1 or DayNumber(Date(Left(as_start, 10))) = 7 then return false
return true
La receta: nada se niega a compilar — un script de ue_appointment_changing, ue_appointment_moved o ue_appointment_resized conserva sus argumentos, los nuevos se añaden. Si su ue_selection_changed activa botones, ahora recibe "" cuando la cita seleccionada desaparece; revise los códigos de retorno de of_add_appointment, of_scroll_to_time, of_set_field y of_show_appointment, que ahora pueden devolver -5. Para guardar los gestos sin código, vea ib_write_back.
12.11 shellexplorer: el error dice su motivo #
El explorador del shell da ahora, en ue_error como en ue_path_not_found, un motivo que su código puede comprobar — una constante REASON_* de u_pbt_shellexplorer, la misma en todos los idiomas de Windows. Ya no dispara ue_selected para la carpeta ya seleccionada, y anuncia con ue_collapsed una rama que cierra por sí mismo. Gana también el clic derecho en una carpeta (ue_node_rclicked) y la dirección de la raíz.
| Qué | 4.0 | 5.0 |
|---|---|---|
ue_error | (string as_message) | (string as_path, string as_reason, string as_message): la ruta ("" para el Escritorio), una constante REASON_*, el texto del shell |
as_reason de ue_path_not_found | una frase en inglés (not found, outside the root, not a branch…) | una constante REASON_* (not_found, outside_root, not_a_branch…); not_shown para una ruta que existe pero que el árbol no muestra |
| Volver a seleccionar la carpeta ya seleccionada (clic, Inicio en la primera fila) | ue_selected | nada |
| Una rama que el árbol cierra por sí mismo (vuelta vacía, rechazada por el shell) | ningún evento | ue_collapsed |
ib_show_files, ib_show_hidden, is_file_filter, is_root escritos con su valor | el árbol se relee | no se relee nada; is_file_filter puesto sin los archivos los espera |
of_collapse de una ruta dibujada dos veces | cada fila, un ue_collapsed cada una | la fila que alcanza of_select, un ue_collapsed |
of_count(""), of_keys_at("", i) | las filas mostradas, como of_count() | el primer nivel (la raíz), como of_count(is_root) |
// 5.0 : ue_error event of uo_tree : (string as_path, string as_reason, string as_message)
// Test the reason, never the text of the shell
if as_reason = u_pbt_shellexplorer.REASON_TIMEOUT then
st_status.text = "The network folder " + as_path + " does not answer"
else
st_status.text = as_message
end if
La receta: nada se niega a compilar — un script de ue_error conserva as_message, los nuevos argumentos se añaden. Una comprobación del TEXTO de as_reason en ue_path_not_found ("not found", "outside the root") se reescribe con una constante REASON_*; una aplicación que recargaba un panel en cada ue_selected lo hace ahora una vez por cambio.
12.12 tilesbox: el clic derecho lleva su punto, una orden del código se anuncia, la disposición deja los permisos a la aplicación #
El panel de mosaicos se une a la biblioteca: su clic derecho da el punto de pantalla como el de los árboles, las rejillas y el kanban; una orden del código que mueve un mosaico, pliega un grupo o cambia un tamaño lanza los mismos eventos que un gesto; la disposición ya no lleva la visibilidad, que sigue siendo asunto de la aplicación. Gana también el movimiento de un mosaico a otro grupo desde el código (12.6).
| Qué | 4.0 | 5.0 |
|---|---|---|
ue_tile_context | (string as_keys) | ue_tile_rclicked (string as_keys, long al_x, long al_y): el punto en píxeles de pantalla; la tecla Menú y Mayús+F10 también lo lanzan, en la esquina inferior izquierda del mosaico |
of_move_tile, of_insert_tile | integer ai_index | long al_position; una sobrecarga of_move_tile(as_keys, as_to_key, al_position) envía el mosaico a otro grupo |
of_move_tile a otro lugar | nada | ue_tile_moved, ue_layout_changed |
ib_collapsed de un grupo fijado por el código | ue_group_toggled | ue_group_toggled, ue_layout_changed |
is_size fijado por el código | nada | ue_layout_changed (nunca ue_tile_resized, que dice que el usuario lo eligió) |
is_size de un tamaño desconocido ("huge") | el mosaico pasaba a medium | rechazado: no se escribe nada, of_get_last_error dice por qué; of_add_tile / of_insert_tile devuelven -5 |
La disposición (of_get_layout, ue_layout_changed) | llevaba la visibilidad de los grupos y mosaicos | ya no la lleva: of_set_layout nunca vuelve a mostrar lo que su código ocultó; una disposición 4.0 se lee sin ella |
of_set_layout que cambia la disposición | ningún evento | un ue_layout_changed; -5 ante un JSON que no es una disposición ({}) |
of_tile / of_group de una dirección que no nombra nada | un handle por llamada, guardado | el handle inerte, el mismo para todas: no escribe nada y se relee vacío |
// 4.0 : the right click of a tile
// ue_tile_context event of uo_tiles : (string as_keys)
// 5.0 : the same script, under the new name, with the screen point
// ue_tile_rclicked event of uo_tiles : (string as_keys, long al_x, long al_y)
La receta: compile; su script de ue_tile_context queda en un evento que ya no existe — muévalo a ue_tile_rclicked, que conserva as_keys. Si su ue_layout_changed guarda la disposición, ahora ve también lo que su código cambia; un ue_tile_moved que solo debe reaccionar al usuario ignora los movimientos que su código acaba de hacer. Si guardaba la visibilidad en la disposición, fíjela desde el código en la apertura (ib_visible), según los permisos.
12.13 tab: el clic derecho lleva su punto, una disposición aplicada se anuncia #
La pestaña se une a la biblioteca: el clic derecho de una pestaña, con el menú integrado desactivado, da su punto de pantalla como el de los árboles, las rejillas y el kanban, y of_set_layout que cambia la disposición la anuncia como un gesto. Un arrastre devuelto a su sitio ya no anuncia nada. Gana también páginas creadas bajo demanda (ue_page_needed, of_supply_page), el doble clic (ue_tab_double_clicked), ib_cycle_keys, is_close_mode, ii_strip_width y, en una página, ib_modified e is_badge — vea la página de la pestaña.
| Qué | 4.0 | 5.0 |
|---|---|---|
ue_tab_rclicked | (string as_key) | (string as_key, long al_x, long al_y): el punto en píxeles de pantalla; la tecla Menú y Mayús+F10 también lo disparan, en la esquina inferior izquierda de la pestaña |
of_set_layout que cambia la disposición | ningún evento | ue_layout_changed, una vez |
un arrastre devuelto a su sitio, of_move_page a su propio sitio | ue_tab_reordered y ue_layout_changed | nada: el orden no ha cambiado |
varios desplazamientos bajo of_set_redraw(false) | un ue_layout_changed por desplazamiento | uno solo, al reanudar |
| Mayús+F10 en una pestaña, menú integrado | el menú se abría bajo el ratón | bajo la pestaña |
| banda vertical y título largo | la banda tomaba el ancho del título | como mucho el 40 % del componente, puntos suspensivos; ii_strip_width la fija |
il_accent de una página | solo el anillo de foco | subraya también la pestaña activa |
is_shortcut en el handle de una clave sin página | registrado: la tecla se tomaba para nada | no se registra nada, of_get_last_error dice por qué |
of_insert_page cuyo desplazamiento falla | código negativo, la página se quedaba | código negativo, la página se retira |
// 4.0 : the right click of a tab, built-in menu off
// ue_tab_rclicked event of uo_tabs : (string as_key)
// 5.0 : the same script, with the screen point
// ue_tab_rclicked event of uo_tabs : (string as_key, long al_x, long al_y)
La receta: nada se niega a compilar — un script de ue_tab_rclicked conserva as_key. Abra su menú en el puntero de la ventana (parent.PointerX()), o pase al_x, al_y a of_show de un contextmenu. Compruebe que su ue_layout_changed acepta la llamada que of_set_layout le hace ahora.
12.14 soundplayer: el número de un sonido, un rechazo devuelto al instante #
El reproductor de sonidos cambia tres cosas que su código puede ver. Sus eventos llevan el número del sonido: ue_started, ue_ended y ue_failed reciben un último argumento, al_sound — el número que ahora devuelven of_play_over y of_enqueue (devolvían 0), y que toma el nuevo of_stop_sound. Una fuente rechazada de entrada es un código: of_play, of_play_over, of_crossfade y of_preload devuelven -5, la razón en of_get_last_error(), para una fuente vacía, una dirección http://, una dirección file:// mal formada o un formato rechazado por su nombre — y ya no lanzan ue_failed; el sonido en curso continúa. En la cola (of_enqueue), el rechazo llega siempre por ue_failed, en su turno. Otros -5: of_pause y of_resume sin nada que suspender o reanudar, of_beep y of_beep_sync a 0 Hz o 0 ms, of_meter fuera de 1 a 64 barras.
// Local variables
string ls_url
long ll_rc
// The address of the sound, typed by the user
ls_url = sle_url.text
// 4.0 : of_play returned 0, and an http:// address came back later through ue_failed
// 5.0 : the refusal is a code, at once ; of_get_last_error() gives the reason
ll_rc = inv_sound.of_play(/*source*/ ls_url)
if ll_rc = -5 then
MessageBox("Sound", inv_sound.of_get_last_error())
end if
Lo que cambia sin pedir nada a su código: of_stop ahora se apaga sobre il_fade_ms, como prometía la documentación (ue_stopped sigue llegando al instante); al vencer il_timeout_ms, solo se corta el sonido de la llamada síncrona — el fondo, las superposiciones y la cola continúan; of_crossfade hacia una fuente rechazada conserva la pista en curso; of_level vale 0 y of_spectrum no devuelve ninguna barra, con el medidor apagado; of_equalizer(ab_on, ai_gains[]) devuelve a 0 una banda que el array no alcanza; of_clear_queue olvida también los sonidos que la cola ya ha sonado; los mensajes de ue_failed siguen el idioma de visualización (as_reason sigue siendo la palabra que comprobar). El reproductor gana también la cola navegable (of_next, of_previous, of_queue_index, ue_source_changed, ib_queue_repeat), el bucle sin cortes (ib_gapless_loop, REASON_TOO_LONG), el segmento (of_play_range), el silencio (ib_muted) y el almacenamiento en búfer (ue_buffering, of_is_buffering) — vea la página del reproductor de sonidos.
La receta: nada se niega a compilar — un script de ue_started, ue_ended o ue_failed conserva sus argumentos, al_sound se añade. Revise las comprobaciones del código de retorno de of_play_over y of_enqueue (un = 0 pasa a > 0), y el código que esperaba ue_failed para una dirección http:// o una fuente vacía: ahora comprueba el -5 de la llamada.
12.15 toaster: el motivo de un cierre, un toast cerrado por el código siempre lo anuncia #
El toaster dice por qué se cerró un toast: ue_toast_dismissed recibe un último argumento, as_reason — REASON_TIMEOUT, REASON_USER (su aspa), REASON_CODE (of_close, of_close_all) o REASON_OWNER_CLOSED (su ventana se cerró). Y todo toast cerrado por el código lo anuncia, incluso cerrado justo después de of_show, antes de dibujarse, o mientras esperaba su sitio: una aplicación que esperaba ue_toast_dismissed para liberar su estado ya no depende de una carrera.
| Qué | 4.0 | 5.0 |
|---|---|---|
ue_toast_dismissed | (long al_id, string as_key) | (long al_id, string as_key, string as_reason), constants REASON_* |
of_close de un toast aún no dibujado, o en espera de sitio | no se activaba nada | ue_toast_dismissed, REASON_CODE |
of_close de un toast de otro toaster | lo cerraba, el aviso iba al otro | -5, no se cierra nada, of_get_last_error dice por qué |
la ventana de ipo_owner se cierra | sus toasts desaparecían sin decir nada | ue_toast_dismissed, REASON_OWNER_CLOSED |
| un toaster destruido, toasts en pantalla | se quedaban, mudos | los persistentes y los que llevan botones se cierran con él; los demás terminan solos |
of_show antes de que el motor de visualización esté listo | -6: «falta el runtime» | -4: vuelva a intentarlo; of_get_last_error dice por qué |
| esquina de un toast anclado a la ventana | la ventana entera: el toast tapaba la barra de título y sus botones | el área cliente (la del marco en MDI) |
| un título muy largo | empujaba el aspa y los botones fuera de la ventana | limitado, se desplaza |
// 4.0
// event ue_toast_dismissed de inv_toaster : (long al_id, string as_key)
// 5.0 : el mismo script, con el motivo
// event ue_toast_dismissed de inv_toaster : (long al_id, string as_key, string as_reason)
La receta: nada se niega a compilar — un script de ue_toast_dismissed conserva al_id y as_key, as_reason se añade. Revise el código que suponía que un toast cerrado enseguida por of_close no diría nada: ahora lo anuncia. Los toasts siguen ligados al toaster que los mostró: un of_close sobre el identificador de otro toaster devuelve -5. El toaster gana también of_close_all (cerrar todos sus toasts) y of_get_last_error — véase la página del toaster.
12.16 video: un rechazo devuelto al instante, una película y sus subtítulos en una llamada, la misma película reanudada #
El reproductor de vídeo cambia cinco cosas que su código puede ver. Un rechazo se devuelve al instante, como en el reproductor de sonidos (12.14): of_play(), of_play(source) y of_play_range devuelven -5, el motivo en of_get_last_error(), para una fuente vacía, una dirección http:// o un formato rechazado por su nombre (avi, wmv, flv) — y ya no lanzan ue_failed; la película en curso sigue. La propiedad is_source conserva su ue_failed: una propiedad no tiene código de retorno. La misma película no se recarga: of_play(source) o is_source sobre la película ya cargada la reanuda donde está (ue_resumed) en lugar de volver a empezarla; of_seek(0) la reinicia. Una búsqueda queda en el segmento de of_play_range, la del usuario como of_seek: Inicio lleva al comienzo del segmento, un clic más allá de su fin a su fin — antes, Inicio salía del extracto y un clic más allá detenía la película. Una entrada de la lista que no puede reproducirse lanza primero ue_source_changed, luego un solo ue_failed — llegaba antes, y dos veces. of_stop pasa a ser una función: no devolvía nada (subrutina), devuelve 0, o -2 cuando el componente no está creado — como of_stop del navegador web.
// Local variables
string ls_path
long ll_rc
// The film chosen by the user
ls_path = sle_film.text
// 4.0 : of_play returned 0, and an http:// address or an .avi came back later through ue_failed
// 5.0 : the refusal is a code, at once ; the reason is in of_get_last_error
ll_rc = uo_video.of_play(/*source*/ ls_path)
if ll_rc = -5 then
MessageBox("Video", uo_video.of_get_last_error())
end if
Lo que cambia sin pedir nada a su código: un marcador alcanzado por una búsqueda EN PAUSA ya no lanza ue_marker_reached (solo ue_seeked); Espacio y el botón Reproducir de un reproductor sin película ya no hacen nada (lanzaban ue_failed(REASON_NO_SOURCE)); el idioma de subtítulos elegido por el usuario pasa a la película siguiente de la lista; un cartel http:// se rechaza y is_poster se relee vacío; un is_subtitles rechazado se relee vacío; un archivo de subtítulos del equipo que no se encuentra lanza ue_subtitles_failed(REASON_NOT_FOUND); el menú de velocidad se maneja con el teclado y sus flechas ya no cambian el volumen; en pantalla completa la barra se muestra con el teclado; la posición recordada (ib_remember_position) ya no depende de cómo se escribe la ruta, y solo se guardan las 200 últimas películas (una posición de la 4.0 se relee una vez). El reproductor gana of_play(source, subtitles) (la película y SUS subtítulos: fijados antes de una segunda película, se iban con la primera), ib_forward_seek, of_watched_ms, of_watched_percent, ue_watched_completely e ib_skip_failed — vea la página del reproductor de vídeo.
La receta: nada se niega a compilar. Relea el código que esperaba ue_failed después de of_play para una dirección http://, una fuente vacía o un .avi: ahora comprueba el -5 de la llamada. Relea también un botón « Reproducir » que contaba con of_play(source) para volver a empezar: añada of_seek(0).
12.17 webbrowser: se pregunta por un gesto del usuario, una página de of_show_html no tiene dirección #
Con ib_veto_navigation = true, ue_navigating se pregunta ahora también para un gesto del usuario: una dirección escrita en la barra, Abrir vínculo del menú contextual, una ventana nueva abierta por un clic. En la 4.0 estos tres caminos no preguntaban. Solo una dirección asignada por su código no se pregunta nunca, y tampoco una redirección del servidor: para una lista de servidores que valga también para las redirecciones, asigne la nueva propiedad is_allowed_hosts.
| Qué | 4.0 | 5.0 |
|---|---|---|
ue_navigating con el veto: dirección escrita, Abrir vínculo, ventana nueva | la página se abría sin pregunta | se hace la pregunta; false mantiene la página |
is_address, la barra, ue_load_completed tras of_show_html | toda la página codificada (data:text/html;charset=utf-8,…, hasta 2 MB) | "" |
is_title de una página sin <title> | su dirección | "" |
of_go_back, of_go_forward, of_stop | sin valor de retorno | long: 0 una vez pedido, -2 componente no creado |
ib_private cambiado tras una página | is_address, is_title, la barra y las flechas conservaban la página anterior | todo se relee vacío: la vista es nueva |
| Intro en una barra de direcciones vacía | la página quedaba en blanco | nada |
| Una página del sitio se carga, barra de direcciones visible | Recargar sigue siendo Recargar | Recargar pasa a Detener, y vuelve una vez cargada la página |
La receta: nada se niega a compilar, un long ignorado compila. Un script de ue_navigating escrito para los vínculos del sitio ve ahora también las direcciones escritas por el usuario: si decide según la dirección, que compare su host, como el ejemplo de la página del componente — o confíe la lista a is_allowed_hosts. El código que leía as_url de ue_load_completed, o is_address, tras of_show_html recibe una cadena vacía.
12.18 toolbar: el clic derecho lleva su punto, una orden del código se anuncia #
La barra de herramientas se une a la biblioteca: el clic derecho de una herramienta da su punto de pantalla, como el de los árboles, las cuadrículas y la pestaña, y mover una barra con ii_band / ii_index dispara ue_bar_reordered como el gesto. Dos adiciones rechazan lo que aceptaban en silencio, y un atajo puesto donde nada vive ya no se registra. Gana además is_text en una barra, un nombre para cada herramienta y cada campo leído por un lector de pantalla, y un teclado que atraviesa los campos — ver la página de la barra de herramientas.
| Qué | 4.0 | 5.0 |
|---|---|---|
ue_item_rclicked | (string as_keys) | (string as_keys, long al_x, long al_y): el punto en píxeles de pantalla; la tecla Menú y Mayús+F10 también lo disparan, en la esquina inferior izquierda de la herramienta, y también el clic derecho de un campo |
ii_band / ii_index que mueven una barra | ue_layout_changed | ue_bar_reordered, ue_layout_changed |
of_add_datepicker con una fecha que no es aaaa-mm-dd ("31/12/2026") | 0, la fecha mostrada tal cual | -5, no se añade nada |
of_add_menu_separator en una entrada sin subentradas | 0: la entrada se volvía gris y ya no se elegía | -5 |
is_shortcut u of_register_shortcut en una dirección donde nada vive, una entrada con cascada o la opción de una lista | registrado: la tecla se capturaba en toda la ventana | nada registrado; of_register_shortcut devuelve -5, of_get_last_error dice por qué |
| Ctrl+A, Ctrl+C, Ctrl+V, Ctrl+X, Ctrl+Z, Ctrl+Y en un campo de la barra | se disparaba la herramienta que llevaba el atajo | el campo edita su texto |
is_text de un selector de fecha | guardado y releído, nunca mostrado | ignorado, relee "" |
// 4.0 : the right click of a tool
// ue_item_rclicked event of uo_toolbar : (string as_keys)
// 5.0 : the same script, with the screen point
// ue_item_rclicked event of uo_toolbar : (string as_keys, long al_x, long al_y)
La receta: nada se niega a compilar — un script de ue_item_rclicked conserva as_keys. Abra su menú en el punto al_x, al_y (páselo a of_show de un contextmenu). Compruebe que un script de ue_bar_reordered acepta también los movimientos que hace su código, pruebe el código de retorno de of_add_datepicker si la fecha viene de un campo regional, y ponga is_shortcut después de añadir la herramienta o la entrada.
12.19 El clic derecho de un elemento lleva su punto: buttonbar, breadcrumb, chartcartesian, statusbar #
Una sola regla para todo clic derecho sobre un elemento de la biblioteca: el evento recibe la clave (o la dirección) del elemento, luego al_x, al_y, el punto donde abrir un menú, en píxeles de pantalla — el puntero, o, con el teclado (tecla Menú, Mayús+F10), la esquina inferior izquierda del elemento (inferior derecha en una lectura de derecha a izquierda; el centro de una forma que no es un rectángulo: un punto de un gráfico). Un contextmenu de la biblioteca se abre allí tal cual: uo_menu.of_show(al_x, al_y). Tres eventos que no lo llevaban lo reciben; la barra de estado multiplicaba el suyo por la escala de la pantalla, y un menú abierto en ese punto caía lejos del puntero en una pantalla al 125 % o al 150 %.
| Qué | 4.0 | 5.0 |
|---|---|---|
buttonbar · ue_button_rclicked | (string as_key) | (string as_key, long al_x, long al_y) |
breadcrumb · ue_item_rclicked | (string as_keys) | (string as_keys, long al_x, long al_y) |
chartcartesian · ue_point_rclicked | (string as_key, long al_index, double ad_value) | (string as_key, long al_index, double ad_value, long al_x, long al_y) |
statusbar · al_x, al_y de ue_panel_rclicked | multiplicados por la escala de la pantalla | el punto tal como lo lee la página, como todos los clics derechos |
// 5.0 : the menu of a button, opened where the user right-clicked it
// ue_button_rclicked event of uo_buttons : (string as_key, long al_x, long al_y)
is_menu_button = as_key
uo_menu.of_show(/*x*/ al_x, /*y*/ al_y)
La receta: nada se niega a compilar — un script de estos eventos conserva sus argumentos. Abra su menú en el punto al_x, al_y (páselo a of_show de un contextmenu); un menú PowerBuilder conserva PopMenu(PointerX(), PointerY()) de su ventana. Un script que corregía él mismo la escala de las coordenadas de ue_panel_rclicked ya no debe hacerlo.
12.20 La base: el error de un componente es el suyo, cada verbo devuelve un código #
Cinco cambios afectan a toda la biblioteca, o a toda una familia de componentes. Solo uno se niega a compilar: is_last_error de un componente no visual, ahora of_get_last_error().
| Qué | 4.0 | 5.0 |
|---|---|---|
of_get_last_error() de un componente visual | el último mensaje de la DLL, uno solo para todo el proceso — a menudo el de otro componente | lo que le ocurrió a este componente: un nombre rechazado, o una llamada de este componente a la DLL, cuyo motivo se lee en el momento del fallo; si no, vacío |
El motivo del fallo de un componente no visual (crypto, restclient, soundplayer, speechout, xml, u_pbt_regex, u_pbt_zip) | inv.is_last_error | inv.of_get_last_error() |
of_stop, of_close, of_reset de los componentes no visuales (commandpalette, crypto, messagebox, restclient, soundplayer, speechout, toaster, xml) | sin valor devuelto | un long, 0 una vez hecho — como los componentes visuales |
of_set_property("tooltip", …) y super_tooltip_* en un componente sin información emergente (webbrowser, pdfviewer, radialmenu, progressbar) | ponía una información emergente que la documentación dice inexistente | -5, y of_get_last_error() dice por qué |
El atajo de un menú PowerBuilder retomado (of_load_menu de menubar y commandpalette) | Ctrl++, PageUp, Insert (menubar); nada más allá de F12 (paleta) | una sola escritura, la del contextmenu: Ctrl+Plus, PgUp, Ins, de F13 a F24, de Num 0 a Num 9, Num + |
// Local variables
string ls_why
// 4.0 : ls_why = inv_crypto.is_last_error
// 5.0 : the reason of a failure, by the same method as every component
ls_why = inv_crypto.of_get_last_error()
La receta: el compilador muestra cada .is_last_error que hay que sustituir por .of_get_last_error(). Una llamada a of_stop, of_close u of_reset escrita como instrucción sigue compilando. Un script que leía of_get_last_error() de un componente para conocer el fallo de otra llamada (un export de la DLL llamado directamente, otro componente) lee ahora el motivo de ese componente, o nada: pregúnteselo al que falló.
Añadido, nada que rehacer: is_accessible_name e is_accessible_description en todos los componentes visuales — el nombre y la descripción que dice un lector de pantalla (3.4); of_from_datastore de un DataWindow o de un DataWindowChild en crosstab y datagrid, como en los demás componentes ligados a datos; la forma completa de of_insert_command (commandpalette), que toma la explicación, el atajo y las palabras clave como of_add_command, con una posición en long.
← Migrar de la 3.0 a la 4.0 · Índice · Notas de la versión →