PBToolboxAI v5 ← Site

propertygrid — u_pbt_propertygrid #

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

propertygrid es la ventana de propiedades de un IDE, para sus propios datos: valores con nombre, ordenados en categorías que se pliegan, cada uno con el editor de su tipo — texto, número, casilla, lista de opciones, color, fecha, contraseña. Dos vistas (por categoría, alfabética), un cuadro de búsqueda, un panel de ayuda que describe la propiedad seleccionada y un botón … que abre un cuadro de diálogo propio. El usuario modifica, ue_value_changed se lo dice.

▶ Verlo en vivo — Aplicación de demostración, mosaico Property grid: la vista previa, el código que lo genera y esta página, uno al lado del otro.


De un vistazo #

Userobjectu_pbt_propertygrid
Clases de itemsn_pbt_propertygrid_category (categoría) → n_pbt_propertygrid_property (propiedad)
Sirve paraSustituir una pantalla de ajustes hecha a base de campos y casillas por un inspector con tema, tipado y con búsqueda: los ajustes de un documento, de un informe, de una ficha, de un objeto de la aplicación
ValoresSiempre texto, uno a uno (of_property(dirección).is_value); todos a la vez y tipados con of_values
Opciones opt-inib_veto_changes

Inicio rápido #

// The settings of a report : one value at the top, then a category
uo_grid.of_add_property(/*keys*/ "title", /*label*/ "Title", /*type*/ u_pbt_propertygrid.TYPE_STRING, /*value*/ "Monthly sales")
uo_grid.of_add_category(/*key*/ "page", /*title*/ "Page")
uo_grid.of_add_property(/*keys*/ "page/landscape", /*label*/ "Landscape", /*type*/ u_pbt_propertygrid.TYPE_BOOLEAN, /*value*/ "true")
uo_grid.of_add_property(/*keys*/ "page/margin", /*label*/ "Margin (mm)", /*type*/ u_pbt_propertygrid.TYPE_NUMBER, /*value*/ "12.5")

// The help pane describes the selected property
uo_grid.of_property(/*keys*/ "page/margin").is_description = "Around the printed area, in [b]millimetres[/b]."
// event ue_value_changed of uo_grid : (string as_keys, string as_value)
// The value is already written ; the address says which one
choose case as_keys
    case "title"
        of_set_report_title(as_value)
    case "page/landscape"
        of_set_landscape(as_value = "true")
end choose

Una dirección por propiedad #

Una propiedad se designa por su dirección: su clave sola en el primer nivel ("title"), la categoría y luego la propiedad unidas por / bajo una categoría ("page/margin"). Una propiedad desplegable (TYPE_GROUP) contiene a su vez propiedades, añadidas en su dirección: "appearance/font/size" en el grupo font de la categoría appearance, "margin/left" en un grupo de arriba — y un grupo puede contener otro. Lo que contiene una propiedad es, pues, una categoría (un solo nivel) o un grupo. Una categoría se designa por su clave sola. En el primer nivel, una clave nombra una sola cosa: una categoría y una propiedad de arriba no pueden compartirla. Los eventos llevan la misma dirección, la que usted escribió.

// A category by its key, a property by its address
uo_grid.of_category(/*key*/ "page").ib_collapsed = true
uo_grid.of_property(/*keys*/ "page/margin").is_value = "15"

// A property held by a group : the address goes through the group
uo_grid.of_property(/*keys*/ "appearance/font/size").is_value = "11"

Los tipos de valor #

El tipo se elige una vez, en of_add_property, y da el editor de la fila. El valor, en cambio, es siempre texto — dado, leído, entregado por los eventos — escrito igual sea cual sea el idioma del equipo.

ConstanteEditorEl valor, como texto
TYPE_STRINGCuadro de textoEl texto tal cual
TYPE_NUMBERCuadro de texto que solo acepta un número, leído en el idioma de visualización: su separador decimal o un punto, su agrupación de miles cuando está bien formada (1,000 vale mil en inglés, 1.500 mil quinientos en alemán, 1 234,5 en francés); una entrada ambigua (1,5 en inglés, 1 2) o que no es un número se rechaza: el texto tecleado se queda, enmarcado en rojo, y el panel de ayuda dice por qué (Esc renuncia a él). is_min, is_max e id_step limitan la entrada y rigen Arriba / AbajoCon punto: "12.5"; "" = vacío. Conservado cifra a cifra ("1.50" sigue siendo "1.50"); un texto que no es un número se rechaza
TYPE_BOOLEANCasilla"true" · "false"
TYPE_ENUMLista de opciones con los colores del tema; sus opciones se añaden una a una (of_add_option), su texto plano, sin etiquetasEl valor de la opción elegida, nunca su texto
TYPE_COLORMuestra del color y selector de color; la celda muestra r, g, b. Por encima de 16777215, un color del sistema de PowerBuilder (67108864 Button Face, 553648127 Transparent, 1073741824 Window Background…) se muestra por su nombre, con una muestra neutra, y el selector se abre sin color actualEl long RGB escrito como texto: String(RGB(255, 0, 0)) = "255"
TYPE_DATECalendario; la celda muestra la fecha en el formato del idioma de visualización"yyyy-mm-dd" : String(Today(), "yyyy-mm-dd")
TYPE_PASSWORDCuadro de texto ocultoEl texto en claro, nunca mostrado ni encontrado por la búsqueda (incluso {x:raw} de un resumen queda oculto)
TYPE_GROUPNinguno: una propiedad desplegable (una fuente, un margen), con un chevrón al principio de su etiqueta; contiene las propiedades añadidas en su dirección y se despliega con ib_expanded, su chevrón, un doble clic en su etiqueta o el teclado. Cerrada cuando se añadeNinguno que dar ("", cualquier otro se rechaza); leído, su resumen: el que escribe is_summary, si no los valores mostrados de lo que contiene, ocultos omitidos, unidos por ; ("Segoe UI; 9; True"); escrito, ignorado

Un valor que su tipo no puede contener se rechaza — en of_add_property (-5) como por is_value o is_default (el anterior se queda) — y of_get_last_error dice por qué: un número que no lo es, un booleano distinto de true / false / 1 / 0, una fecha que no es un yyyy-mm-dd real, un color que no es un entero a partir de -1, un TYPE_STRING o un TYPE_PASSWORD en varias líneas (el campo de la cuadrícula admite una línea). "" (sin valor) se acepta siempre. Un valor de lista que ninguna opción ofrece se acepta, y se muestra tal cual: una lista puede cargarse después de su valor. El color -1 — el que da el tema, la convención de toda la biblioteca — se muestra «(predeterminado)»; un color del sistema y los true / false de un resumen se escriben en el idioma de visualización.


Propiedades #

PropiedadTipoPredeterminadoFunción
is_sortstring"categorized"La vista: SORT_CATEGORIZED (las propiedades de arriba, luego cada categoría bajo un encabezado que se pliega) o SORT_ALPHABETICAL (una sola lista ordenada por etiqueta tal como se muestra, sin sus etiquetas de formato, y sin encabezados; un grupo conserva bajo él lo que contiene). Los dos botones de la barra de herramientas también la cambian: leída en directo. Pasar a alfabética con un encabezado seleccionado vacía la selección
ib_toolbarbooleantrueLa barra de herramientas: las dos vistas y el cuadro de búsqueda. false la oculta; is_sort e is_filter siguen pudiéndose pilotar por código
ib_helpbooleantrueEl panel de ayuda, abajo: la etiqueta y la descripción (is_description) de la propiedad seleccionada, el título de una categoría seleccionada
ii_label_widthinteger40Parte del ancho dada a las etiquetas, en porcentaje, de 15 a 85. El usuario arrastra la línea entre etiquetas y valores: leída en directo
is_filterstring""La búsqueda: solo quedan las propiedades cuya etiqueta, clave o valor mostrado contiene este texto, sin distinguir mayúsculas; durante una búsqueda, cada categoría y cada grupo con alguna coincidencia aparecen abiertos, sin perder su pliegue. La etiqueta se lee tal como se muestra, sin sus etiquetas de formato; ni el título de una categoría ni la dirección completa se buscan. Durante una búsqueda, plegar o desplegar por el usuario no hace nada; por su código (ib_collapsed, ib_expanded, of_expand_all, of_collapse_all) se registra, lanza su evento y se ve en cuanto la búsqueda se vacía; una fila seleccionada que la búsqueda oculta deja la selección (ue_selection_changed con una dirección vacía). El cuadro de búsqueda también la escribe (Esc la borra): leída en directo. "" lo muestra todo
ib_veto_changesbooleanfalseOpt-in: preguntar antes de escribir un valor del usuario (lanza ue_value_changing, que puede rechazarlo: la celda vuelve a mostrar el valor anterior). Un valor escrito por su código nunca pregunta
is_theme_stylestring""Estilo visual del componente (constantes THEME_STYLE_*); vacío = el de la aplicación, seguido en cada cambio
is_theme_modestring""Variante clara u oscura (constantes THEME_MODE_*); vacío = la de la aplicación, seguida en cada cambio
il_theme_accentlong-1Color de acento de este componente (-1 = acento de la aplicación, o el del tema)
is_tooltipstring""Tooltip simple mostrado al pasar el ratón por el componente
is_super_tooltip_titlestring""Título del tooltip enriquecido (prevalece sobre is_tooltip)
is_super_tooltip_textstring""Texto del tooltip enriquecido (se acepta el marcado enriquecido)
is_super_tooltip_imagestring""Imagen del tooltip enriquecido

Propiedades de una categoría — n_pbt_propertygrid_category #

PropiedadTipoPredeterminadoFunción
is_titlestring""Título del encabezado. Acepta el texto enriquecido con etiquetas. Vacío, el encabezado muestra la clave
ib_collapsedbooleanfalsetrue pliega la categoría: su encabezado se queda, sus propiedades se ocultan (una selección que estaba dentro sube al encabezado). Sigue ue_category_toggled, como con un clic en el encabezado. Durante una búsqueda, cada categoría aparece abierta: un clic en el encabezado no hace nada, y true fijado por el código se registra (sigue el evento, la lectura lo devuelve) y se ve en cuanto la búsqueda se vacía. Leída en directo
ib_visiblebooleantruefalse quita la categoría, y todo lo que contiene, de la cuadrícula; conserva su clave y sus valores, que of_values sigue devolviendo
is_tooltipstring""Tooltip simple mostrado al pasar el ratón por el item
is_super_tooltip_titlestring""Título del tooltip enriquecido del item (prevalece sobre is_tooltip)
is_super_tooltip_textstring""Texto del tooltip enriquecido del item (se acepta el marcado enriquecido)
is_super_tooltip_imagestring""Imagen del tooltip enriquecido del item
il_accentlong-1Acento del encabezado de la categoría: su selección lo toma (-1 = el del componente). Para colorearla entera, il_back_color / il_text_color
il_back_colorlong-1Fondo del encabezado de la categoría, en RGB(r,g,b) (-1 = lo que da el tema)
il_text_colorlong-1Color del texto del encabezado de la categoría (-1 = lo que da el tema)
il_back_color_hoverlong-1Fondo del encabezado de la categoría bajo el puntero (-1 = lo que da el tema)
il_text_color_hoverlong-1Color del texto del encabezado de la categoría bajo el puntero (-1 = lo que da el tema)

Propiedades de una propiedad — n_pbt_propertygrid_property #

PropiedadTipoPredeterminadoFunción
is_valuestringel de of_add_propertyEl valor, como texto (ver Los tipos de valor); para una lista, el valor de la opción. Escribirlo no lanza nada, como SetItem; leerlo da el valor actual, sea quien sea quien lo escribió. Un valor que su tipo no puede contener (un TYPE_NUMBER que recibe un texto que no es un número) se rechaza: el valor anterior se queda, y of_get_last_error de la cuadrícula dice por qué. En un grupo (TYPE_GROUP), la lectura da su resumen (ver is_summary), y la escritura se ignora
is_labelstringel de of_add_propertyEl nombre mostrado en la columna de la izquierda; acepta el texto enriquecido con etiquetas. Vacío, la fila muestra la clave, tal cual (nunca leída como etiquetas). La vista alfabética lo ordena, y la búsqueda lo lee, tal como se muestra: sin sus etiquetas de formato
is_descriptionstring""El texto del panel de ayuda mientras la propiedad está seleccionada; acepta el texto enriquecido con etiquetas
ib_readonlybooleanfalseMostrada, no modificable: el valor aparece en gris y no se abre ningún editor, ni con un clic, ni con el teclado, ni con un doble clic. Un grupo de solo lectura vuelve de solo lectura todo lo que contiene. El botón … (ib_ellipsis) sigue activo: lea ib_readonly en ue_ellipsis_clicked para abrir su cuadro de diálogo en solo lectura
ib_visiblebooleantruefalse quita la fila de la cuadrícula; la propiedad conserva su dirección y su valor (of_values lo sigue devolviendo). Ocultar un grupo oculta lo que contiene; ocultar la propiedad seleccionada vacía la selección
ib_ellipsisbooleanfalseUn botón … al final de la fila: un clic — o Ctrl+Intro en la fila seleccionada — selecciona la fila y lanza ue_ellipsis_clicked, incluso en una propiedad de solo lectura, para un cuadro de diálogo propio (un archivo, una fuente, una lista sacada de la base)
ib_expandedbooleanfalsePara una propiedad desplegable (TYPE_GROUP): true muestra lo que contiene, con sangría bajo ella; false lo oculta (una selección que estaba dentro sube al grupo). Sigue ue_property_toggled, como con un clic en su chevrón. Durante una búsqueda, un grupo con alguna coincidencia aparece abierto: su chevrón no hace nada, y un valor fijado por el código se registra (sigue el evento) y se ve en cuanto la búsqueda se vacía. Leída en directo; sin efecto en los demás tipos
is_summarystring""Para una propiedad desplegable (TYPE_GROUP): cómo se escribe su resumen, una plantilla. {size} es el valor mostrado de su subpropiedad size, {size:raw} su valor tal como se guarda (una contraseña queda oculta), {?bold}…{/bold} un trozo que solo se conserva cuando bold está activo (un booleano verdadero, un valor que no es vacío, ni false, ni 0), {!bold}…{/bold} solo cuando no lo está, {{ }} llaves literales; una clave desconocida no da nada. "{name}, {size} pt{?bold}, bold{/bold}" muestra Segoe UI, 10 pt, bold. Vacío (por defecto): los valores mostrados, ocultos omitidos, unidos por ; . El resumen es texto plano; sigue cada cambio de lo que contiene el grupo; is_value del grupo lo devuelve
is_maskstring""Para un TYPE_NUMBER: su máscara de entrada, una máscara numérica en la sintaxis de PowerBuilder (EditMask, formato DataWindow): # un dígito opcional, 0 un dígito obligatorio, , la agrupación, . el separador decimal, % el número mostrado por 100, literales ($, un texto entre comillas, \x) y secciones positivo;negativo ("$#,##0;($#,##0)"). La coma y el punto designan los separadores del idioma de visualización. Al teclear, la agrupación aparece a medida que llegan los dígitos, los decimales se limitan a la máscara, las letras se rechazan, el cursor conserva su lugar entre los dígitos y un número pegado se lee en el idioma de visualización; al salir del campo la máscara completa (12 pasa a 12,00). El valor conserva el número tal como lo escribe el código ("1234.5"), sin agrupación ni símbolo. Vacío (por defecto): el campo se teclea según su is_format sin sus literales ($#,##0.00 se teclea #,##0.00, #,##0 "px" se teclea #,##0; un % se queda, es una escala), si no el número tal cual; sin efecto en los demás tipos
is_formatstring""Para un TYPE_NUMBER: su formato de visualización, cómo la celda muestra el número mientras su campo no tiene el teclado — la misma sintaxis que is_mask, con sus literales: #,##0 "px" muestra 575 px, $#,##0.00 un precio, 0.0% una tasa (0,125 muestra 12,5%). El resumen de un grupo y la búsqueda también lo leen. Cuando el campo toma el teclado su texto pasa a ser el de is_mask (575), el cursor conserva su lugar entre los dígitos; al salir vuelve el texto de visualización. El cambio nunca modifica el valor y no lanza nada: ue_value_changed solo informa de lo que el usuario tecleó, el número desnudo. Vacío (por defecto): la celda muestra su is_mask; sin efecto en los demás tipos
is_defaultstring""El valor predeterminado, como texto igual que is_value. Mientras el valor difiera de él, se escribe en negrita y el panel de ayuda muestra el predeterminado; el usuario lo restablece con Supr en la fila seleccionada o con el botón Restablecer (↺) de la barra de herramientas, visible solo si al menos una propiedad tiene un predeterminado — un gesto del usuario: ue_value_changing si el veto está activo, luego ue_value_changed. Un valor que su tipo no puede contener se rechaza. Escribir "" quita el predeterminado: ya no hay negrita ni predeterminado en el panel de ayuda, se relee "". Sin predeterminado, Supr vacía el valor (un booleano queda como está)
is_errorstring""Un error de su aplicación ("Este nombre ya existe"): el valor se enmarca en rojo, el panel de ayuda lo dice con palabras, también una información sobre herramientas, y un lector de pantalla lo anuncia. Desaparece cuando el usuario modifica la propiedad, o cuando usted escribe "". Puesto en ue_value_changing antes de rechazar, explica el rechazo. Leído, el error que la propiedad muestra: el suyo, si no el de la cuadrícula cuando un número tecleado se rechaza (no es un número, fuera de is_min / is_max) — el texto tecleado se queda entonces en pantalla para corregirlo, Esc renuncia a él
is_minstring""Para un TYPE_NUMBER: el valor más pequeño que el usuario puede dar, como número escrito por el código ("0", "12.5"); "" = sin límite. Un número tecleado por debajo se rechaza, se queda en pantalla y el panel de ayuda dice por qué; Abajo se detiene ahí. Su código puede seguir escribiendo cualquier valor. Un texto que no es un número se rechaza (of_get_last_error), como un límite que cruza el otro (is_min por encima de is_max). Ignorada por los demás tipos
is_maxstring""Para un TYPE_NUMBER: el valor más grande que el usuario puede dar; "" = sin límite. Las mismas reglas que is_min; Arriba se detiene ahí
id_stepdouble1Para un TYPE_NUMBER: lo que Arriba y Abajo suman o restan mientras su campo tiene el teclado, dentro de is_min / is_max. Cada paso es un valor del usuario (ue_value_changed, preguntado antes si el veto está activo). 0 o menos vale 1. Ignorado por los demás tipos
of_is_dirty ( ) → boolean——TRUE cuando el valor difiere de su referencia (ver of_is_dirty de la cuadrícula)
of_type ( ) → string——El tipo dado a of_add_property (una constante TYPE_*). Solo lectura: un tipo se elige una vez
is_tooltipstring""Tooltip simple mostrado al pasar el ratón por el item
is_super_tooltip_titlestring""Título del tooltip enriquecido del item (prevalece sobre is_tooltip)
is_super_tooltip_textstring""Texto del tooltip enriquecido del item (se acepta el marcado enriquecido)
is_super_tooltip_imagestring""Imagen del tooltip enriquecido del item
il_accentlong-1Acento de la fila de la propiedad: su selección y el marco de su editor lo toman (-1 = el del componente). Para colorearla entera, il_back_color / il_text_color
il_back_colorlong-1Fondo de la fila de la propiedad, en RGB(r,g,b) (-1 = lo que da el tema)
il_text_colorlong-1Color del texto de la fila de la propiedad (-1 = lo que da el tema)
il_back_color_hoverlong-1Fondo de la etiqueta de la propiedad cuando el puntero está sobre su fila (-1 = lo que da el tema)
il_text_color_hoverlong-1Color de la etiqueta de la propiedad cuando el puntero está sobre su fila (-1 = lo que da el tema)

Métodos #

En el componente #

MétodoFunción
of_add_category (string as_key, string as_title) → longAñade una categoría al final: un encabezado que se pliega, bajo el cual se añaden luego las propiedades "clave/nombre". Un título vacío muestra la clave. Devuelve 0 una vez añadida, -5 para una clave vacía, que contiene / o `, o ya tomada por una categoría o una propiedad de arriba, -2` si el componente no está creado
of_add_property (string as_keys, string as_label, string as_type, string as_value) → longAñade una propiedad en su dirección, al final de lo que la contiene: su categoría, su grupo ("appearance/font/size", "margin/left") o las propiedades de arriba. as_type es una constante TYPE_*, as_value su valor como texto ("" para un TYPE_GROUP, que no tiene). Devuelve 0 una vez añadida, -5 para una dirección ya tomada, un padre que no es ni una categoría ni un grupo (o aún no añadido), un nivel vacío ("layout/", "a//b"), una clave que contiene `, un tipo desconocido, un valor TYPE_NUMBER que no es un número tal como lo escribe el código (un punto para los decimales, signo y exponente opcionales, "" admitido), un booleano, una fecha o un color que no lo son, un texto o una contraseña en varias líneas (of_get_last_error dice por qué) o un valor dado a un TYPE_GROUP, -2` si el componente no está creado
of_add_option (string as_keys, string as_value, string as_text) → longAñade una opción, al final, a la lista de una propiedad TYPE_ENUM: as_value es lo que contiene la propiedad (y lo que da ue_value_changed), as_text lo que muestra la lista, como texto plano sin etiquetas ("" muestra el valor). Devuelve 0 una vez añadida, -5 para una dirección que no es una propiedad lista, un valor que esta propiedad ya ofrece, o un valor que contiene ` o / (of_keys_at designa una opción por la dirección de la propiedad seguida de su valor: un nivel), -2` si el componente no está creado
of_remove_option (string as_keys, string as_value) → longQuita una opción de la lista de una propiedad TYPE_ENUM, por su valor. El valor que contiene la propiedad se queda como está, aunque fuera esa opción. Devuelve 0 una vez quitada, -5 para una dirección que no es una propiedad lista, o un valor que su lista no ofrece, -2 si el componente no está creado
of_clear_options (string as_keys) → longQuita todas las opciones de una propiedad TYPE_ENUM, para cargar otra lista sin perder la propiedad, su handle, su selección ni sus indicadores. El valor que contiene se queda como está: escriba el nuevo en is_value. Devuelve 0 una vez vaciada, -5 para una dirección que no es una propiedad lista, -2 si el componente no está creado
of_category (string as_key) → n_pbt_propertygrid_categoryHandle de una categoría, por su clave (creado en el primer acceso): su título, su pliegue, su visibilidad y sus colores se fijan con él
of_property (string as_keys) → n_pbt_propertygrid_propertyHandle de una propiedad, por su dirección (creado en el primer acceso): su valor, su etiqueta, su descripción, sus indicadores y sus colores se fijan y se leen con él. Una dirección que esta cuadrícula no añadió (un error de tecleo) da un handle que no se conserva: escribir por él no hace nada, y of_get_last_error dice por qué
of_remove_property (string as_keys) → longQuita una propiedad, y su handle con ella; un grupo se va con todo lo que contiene. Si estaba seleccionada, ue_selection_changed anuncia que ya no hay selección. Devuelve 0 una vez quitada, -5 para una dirección que esta cuadrícula nunca añadió, -2 si el componente no está creado
of_remove_category (string as_key) → longQuita una categoría y todas sus propiedades, con sus handles. Si la selección estaba dentro, ue_selection_changed anuncia que ya no hay ninguna. Devuelve 0 una vez quitada, -5 para una clave que esta cuadrícula nunca añadió como categoría, -2 si el componente no está creado
of_clear ( ) → longVacía la cuadrícula: categorías, propiedades, opciones y handles. La vista, la barra de herramientas, el panel de ayuda y la búsqueda se quedan como están (es of_reset quien devuelve cada propiedad del componente). Si una fila estaba seleccionada, sigue ue_selection_changed con una dirección vacía. Devuelve 0 una vez vaciada, -2 si el componente no está creado
of_select_property (string as_keys) → longSelecciona una fila, como un clic: una propiedad ("page/margin") o el encabezado de una categoría ("page"). Lo que contiene la propiedad se abre primero: su categoría plegada, sus grupos cerrados (ue_category_toggled, ue_property_toggled) — solo si la fila se mostrará entonces: una llamada rechazada no abre nada. Sigue ue_selection_changed, como con un clic. Devuelve 0 una vez seleccionada (o si ya lo estaba), -5 para una dirección que esta cuadrícula nunca añadió o una fila que no se muestra (oculta, fuera de la búsqueda, más allá del límite de la demo, un encabezado en la vista alfabética), -2 si el componente no está creado
of_clear_selection ( ) → longNo deja ninguna fila seleccionada; sigue ue_selection_changed con una dirección vacía. Si ya no había nada seleccionado, no se lanza nada. Devuelve 0 una vez aplicado, -2 si el componente no está creado
of_selected_key ( ) → stringDirección de la fila seleccionada, leída en directo, sea quien sea quien la fijó: "page/margin", "page" para un encabezado, "" si ninguna. Exactamente lo que ue_selection_changed le entrega
of_expand_all ( ) → longDespliega todas las categorías y abre todos los grupos; sigue ue_category_toggled para cada categoría que estaba plegada, ue_property_toggled para cada grupo que estaba cerrado. Devuelve 0 una vez aplicado, -2 si el componente no está creado
of_collapse_all ( ) → longPliega todas las categorías y cierra todos los grupos; siguen ue_category_toggled y ue_property_toggled para cada uno que cambia. Devuelve 0 una vez aplicado, -2 si el componente no está creado
of_dirty_keys (ref string as_keys[]) → longLlena as_keys[] con las direcciones de las propiedades que difieren de su referencia, en el orden de la vista por categoría, y devuelve su número (0 = nada que guardar); lo que el usuario aún teclea se valida primero
of_is_dirty ( ) → booleanTRUE cuando al menos una propiedad difiere de su referencia: el valor con el que se añadió, o lo que of_load u of_reset_update hicieron de él — tanto si lo cambió el usuario como su código. El mismo nombre que en el form. No confundir con is_default, el valor mostrado en negrita: este dice lo que hay que guardar. Lo que el usuario aún teclea se valida primero, como para of_values
of_load (string as_json) → longCarga valores de una vez: un objeto JSON por dirección, la forma que devuelve of_values — las propiedades de arriba, un objeto por categoría y por grupo ({"name":"Orders","layout":{"width":800}}) — o claves "layout/width". Los valores se escriben en silencio (ningún ue_value_changed) y pasan a ser la referencia de of_is_dirty; los errores mostrados desaparecen. Una propiedad que el objeto no nombra conserva su valor, un número se lee cifra a cifra. Un valor que la cuadrícula no puede tomar (ninguna propiedad en esa dirección, un valor que su tipo no puede contener) se omite: el resto se escribe, y of_get_last_error nombra las direcciones omitidas. Lo que el usuario tecleaba se abandona. Devuelve 0 una vez aplicado (también con valores omitidos), -5 para un texto que no es un objeto JSON, -2 si el componente no está creado
of_reset_update ( ) → longLos valores presentes pasan a ser la referencia: of_is_dirty vuelve a responder FALSE. Llámelo una vez guardados sus ajustes, como ResetUpdate de un DataWindow. Devuelve 0 una vez aplicado, -2 si el componente no está creado
of_revert ( ) → longDevuelve cada propiedad a su valor de referencia, en silencio (ningún evento, como un valor escrito por el código), y quita los errores mostrados; lo que el usuario tecleaba se abandona (después no se lanza nada): el botón Cancelar de su ventana de ajustes. Devuelve 0 una vez aplicado, -2 si el componente no está creado
of_clear_errors ( ) → longQuita todos los errores de su aplicación (is_error de cada propiedad). Un número tecleado que la cuadrícula rechazó se queda: el usuario debe corregirlo. Devuelve 0 una vez aplicado, -2 si el componente no está creado
of_focus_property (string as_keys) → longPone el teclado en una propiedad, como un clic en su valor: lo que la contiene se abre primero (ue_category_toggled, ue_property_toggled), queda seleccionada (ue_selection_changed) y su editor toma el teclado; un grupo o una propiedad de solo lectura: la cuadrícula. Devuelve 0, -5 para una dirección que esta cuadrícula nunca añadió o una fila que no se puede mostrar (oculta, fuera de la búsqueda, más allá del límite de la demo), -2 si el componente no está creado
of_invalid_keys (ref string as_keys[]) → longLlena as_keys[] con las direcciones de las propiedades con error, en el orden de la vista por categoría, y devuelve su número (0 = la cuadrícula es válida); lo que el usuario aún teclea se valida primero
of_is_valid ( ) → booleanTRUE cuando ninguna propiedad mostrada lleva un error: ni el suyo (is_error), ni el de la cuadrícula (un número tecleado rechazado: no es un número, fuera de is_min / is_max). Lo que el usuario aún teclea se valida primero: un texto rechazado cuenta. El mismo nombre que en el form
of_validate ( ) → longPone el teclado en la primera propiedad con error — su categoría y sus grupos se abren, queda seleccionada y su editor toma el teclado: lo que llama su botón Aceptar antes de guardar. Lo que el usuario aún teclea se valida primero. Devuelve el número de propiedades con error (0 = la cuadrícula es válida, nada se mueve), -2 si el componente no está creado
of_values ( ) → stringTodos los valores a la vez, leídos en directo — lo que el usuario aún teclea se valida primero, como con AcceptText (ue_value_changing si el veto está activo, luego ue_value_changed) —, en un objeto JSON: las propiedades de arriba, luego cada categoría como un objeto propio, cada grupo como un objeto dentro de lo que lo contiene — ocultas incluidas. Tipados: un número es un número, escrito cifra a cifra (un decimal de 21 cifras sigue exacto), un booleano un booleano, un color su long RGB, el resto texto. Se lee con n_pbt_json, por la misma dirección: lnv_json.of_get_number("page/margin"), lnv_json.of_get_number("appearance/font/size")
of_reset ( ) → longVacía la cuadrícula (of_clear) y luego devuelve cada propiedad del componente a su valor por defecto: vista por categoría, barra de herramientas y panel de ayuda visibles, etiquetas al 40 %, búsqueda vacía, pregunta desactivada. Devuelve 0 una vez aplicado, -2 si el componente no está creado

En una categoría y en una propiedad #

Una categoría contiene propiedades; un grupo (TYPE_GROUP) contiene sus subpropiedades; una propiedad lista (TYPE_ENUM) contiene sus opciones, designadas por su valor. Los tres métodos las recorren.

MétodoFunción
of_count ( ) → longNúmero de propiedades de la categoría, ocultas incluidas; número de subpropiedades de un grupo; número de opciones de una propiedad lista (0 para los demás tipos)
of_keys_at (long al_index) → stringDirección de la propiedad de rango al_index (desde 1) — "page/margin", "appearance/font/size" en un grupo, reutilizable tal cual en of_property; en una propiedad lista, la dirección seguida del valor de la opción. "" fuera de rango
of_has (string as_key) → boolean¿Contiene la categoría o el grupo esta propiedad? ¿Ofrece la propiedad lista este valor?

Eventos #

EventoSe activa cuando
ue_value_changed (string as_keys, string as_value)El usuario ha cambiado un valor (una entrada validada con Intro o al salir de la celda, una casilla marcada con un clic, Espacio o Intro / F2, una opción en una lista, un color, una fecha, un doble clic en una etiqueta). as_keys es la dirección de la propiedad, as_value su nuevo valor como texto; ya está escrito. Un valor escrito por su código (is_value) no lanza nada, como SetItem: su código sabe lo que escribió. Supr o el botón Restablecer (vuelta al predeterminado) y Arriba / Abajo en un número son gestos del usuario: también lo lanzan
ue_value_changing (string as_keys, string as_value) → booleanCancelable, planteado antes de escribir un valor del usuario, y solo cuando ib_veto_changes = true (desactivado por defecto). Devolver FALSE lo rechaza: la celda vuelve a mostrar el valor anterior, que of_property(as_keys).is_value sigue devolviendo durante el evento. Devuelva TRUE para aceptar. Ponga of_property(as_keys).is_error antes de rechazar: el usuario lee por qué
ue_selection_changed (string as_from_keys, string as_keys)La selección se ha movido: un clic, el teclado, o su código (of_select_property, of_clear_selection — una orden también lo lanza, como SelectItem), o la fila seleccionada se ha ido: plegada en su categoría o su grupo (as_keys es entonces ese encabezado o ese grupo), quitada, o ya no dibujada — ocultada, ocultada por la búsqueda (incluso por un pliegue hecho durante ella), más allá del límite de la demo (as_keys vale entonces ""). Una fila es una propiedad ("page/margin") o el encabezado de una categoría ("page"); as_from_keys es la que se dejó
ue_category_toggled (string as_key, boolean ab_collapsed)Una categoría se ha plegado (ab_collapsed = TRUE) o desplegado: un clic en su encabezado, el teclado, su ib_collapsed fijado por su código, of_expand_all, of_collapse_all, o of_select_property sobre una propiedad que contiene
ue_property_toggled (string as_keys, boolean ab_expanded)Una propiedad desplegable (TYPE_GROUP) se ha abierto (ab_expanded = TRUE) o cerrado: un clic en su chevrón, un doble clic en su etiqueta, el teclado, su ib_expanded fijado por su código, of_expand_all, of_collapse_all, o of_select_property sobre lo que contiene. as_keys es la dirección del grupo
ue_ellipsis_clicked (string as_keys)Se ha pulsado el botón … de una propiedad (ib_ellipsis), o Ctrl+Intro en su fila: abra su cuadro de diálogo y luego escriba el resultado en of_property(as_keys).is_value. El botón sigue activo en una propiedad de solo lectura: of_property(as_keys).ib_readonly dice si abrir su cuadro de diálogo en solo lectura
ue_ready ( )El componente ha terminado de cargarse; todo lo enviado antes se ha reproducido
ue_runtime_missing ( )El runtime WebView2 está ausente: el componente permanece vacío
ue_bg_color (long al_color)El componente ha calculado el color de fondo de su tema; el userobject ya lo ha adoptado (backcolor)

Teclado y ratón #

GestoEfecto
Flechas arriba / abajo, Inicio / Fin, Re Pág / Av PágMueven la selección de una fila a otra; Re Pág / Av Pág avanzan la altura de la lista
Flechas izquierda / derechaEn un encabezado, pliegan o despliegan la categoría; en un grupo, Derecha lo abre e Izquierda lo cierra; Derecha en un encabezado o un grupo ya abiertos baja a su primera fila; en una propiedad, Izquierda sube a lo que la contiene, su grupo o su encabezado (invertidas de derecha a izquierda). Durante una búsqueda, plegar o desplegar no hace nada, ni con el teclado ni con el ratón
Intro, F2Entran en el editor de la propiedad (abren la lista, el selector de color o el calendario); un booleano cambia; en un encabezado o un grupo, pliegan o despliegan. Sin nada que hacer (ninguna fila, una propiedad de solo lectura), la tecla se deja a la ventana: su botón por defecto
EspacioMarca o desmarca un booleano; en un encabezado o un grupo, pliega o despliega
Intro / Esc en un editorValida la entrada / devuelve el valor anterior; el teclado vuelve a la lista. Esc en un campo sin modificar se deja a la ventana: su botón Cancelar
Ctrl+IntroEl botón … de la fila seleccionada (ue_ellipsis_clicked)
TabLa lista de propiedades es una sola parada de tabulación, sea cual sea su tamaño: de los editores, solo los de la fila seleccionada toman Tab; la lista que tiene el teclado sin fila seleccionada muestra un contorno
Doble clic en una etiquetaUn booleano cambia, una lista pasa a la opción siguiente, un grupo se abre o se cierra
SuprEn la fila seleccionada: restablece el valor predeterminado (is_default) o, sin predeterminado, vacía el valor — un texto, un número, una fecha, un color, una lista; un booleano sin predeterminado se queda. El botón Restablecer (↺) de la barra de herramientas también restablece el predeterminado. Un gesto del usuario: ue_value_changed
Retroceso, una tecla de carácterEn la fila seleccionada de un texto, un número o una contraseña: empiezan la entrada — Retroceso abre el editor, el texto conservado y el cursor al final (ya no vacía el valor); una tecla de carácter abre el editor con ese carácter, como en la ventana de propiedades de Visual Studio. En una lista, un color, una fecha o una casilla: nada
F4, Alt+AbajoAbren la lista, el selector de color o el calendario de la fila seleccionada, desde la lista o desde su botón, como una lista desplegable de Windows
Arriba / Abajo en un númeroSuman / restan id_step, dentro de is_min / is_max; cada paso lanza ue_value_changed
Separador: Izquierda / Derecha, Inicio / FinLa línea entre etiquetas y valores toma el teclado (Tab): Izquierda / Derecha la mueven un 5 % (invertidas de derecha a izquierda), Inicio / Fin la llevan a los extremos (ii_label_width)
Arrastrar la línea entre etiquetas y valoresCambia ii_label_width
Cuadro de búsqueda: Esc / Flecha abajo o IntroBorra la búsqueda / pasa a la lista, a la primera fila si no hay ninguna seleccionada

Ejemplos #

Los ajustes de una ventana #

// The whole grid in one paint
uo_grid.of_set_redraw(/*on*/ false)

// At the top, without a category : the name of the window
uo_grid.of_add_property(/*keys*/ "name", /*label*/ "Name", /*type*/ u_pbt_propertygrid.TYPE_STRING, /*value*/ "Customers")

// A value given by the application : shown, not editable
uo_grid.of_add_category(/*key*/ "identity", /*title*/ "Identity")
uo_grid.of_add_property(/*keys*/ "identity/id", /*label*/ "Id", /*type*/ u_pbt_propertygrid.TYPE_STRING, /*value*/ "W-0042")
uo_grid.of_property(/*keys*/ "identity/id").ib_readonly = true
uo_grid.of_add_property(/*keys*/ "identity/created", /*label*/ "Created on", /*type*/ u_pbt_propertygrid.TYPE_DATE, /*value*/ String(Today(), "yyyy-mm-dd"))

// A number, a check box and a list of choices
uo_grid.of_add_category(/*key*/ "layout", /*title*/ "Layout")
uo_grid.of_add_property(/*keys*/ "layout/width", /*label*/ "Width", /*type*/ u_pbt_propertygrid.TYPE_NUMBER, /*value*/ "1200")
uo_grid.of_add_property(/*keys*/ "layout/resizable", /*label*/ "Resizable", /*type*/ u_pbt_propertygrid.TYPE_BOOLEAN, /*value*/ "true")
uo_grid.of_add_property(/*keys*/ "layout/state", /*label*/ "Window state", /*type*/ u_pbt_propertygrid.TYPE_ENUM, /*value*/ "normal")
uo_grid.of_add_option(/*keys*/ "layout/state", /*value*/ "normal", /*text*/ "Normal")
uo_grid.of_add_option(/*keys*/ "layout/state", /*value*/ "maximized", /*text*/ "Maximized")

// A colour, as its RGB long written out
uo_grid.of_add_category(/*key*/ "appearance", /*title*/ "Appearance")
uo_grid.of_add_property(/*keys*/ "appearance/back_color", /*label*/ "Back colour", /*type*/ u_pbt_propertygrid.TYPE_COLOR, /*value*/ String(RGB(/*red*/ 240, /*green*/ 244, /*blue*/ 250)))

// One single paint, then the first value to edit
uo_grid.of_set_redraw(/*on*/ true)
uo_grid.of_select_property(/*keys*/ "layout/width")

Un inspector que aplica cada cambio #

// event ue_value_changed of uo_grid : (string as_keys, string as_value)
// The address says which setting of the window the user changed
choose case as_keys
    case "name"
        w_customers.title = as_value
    case "layout/width"
        w_customers.width = Long(as_value)
    case "layout/resizable"
        w_customers.resizable = (as_value = "true")
    case "appearance/back_color"
        w_customers.backcolor = Long(as_value)
end choose

El botón …: un cuadro de diálogo propio #

// The icon : typed by hand, or chosen through the "..." button
uo_grid.of_add_property(/*keys*/ "appearance/icon", /*label*/ "Icon", /*type*/ u_pbt_propertygrid.TYPE_STRING, /*value*/ "img\customers.png")
uo_grid.of_property(/*keys*/ "appearance/icon").ib_ellipsis = true
// event ue_ellipsis_clicked of uo_grid : (string as_keys)
// Local variables
string ls_path, ls_file
constant unsignedlong OFN_EXPLORER = 2
constant unsignedlong OFN_NOCHANGEDIR = 64

// The application opens its own dialog - in the Explorer style, without moving the current folder of the application - then writes the result (this raises nothing)
if GetFileOpenName("Icon", ls_path, ls_file, "png", "Pictures (*.png),*.png", /*initdir*/ "", OFN_EXPLORER + OFN_NOCHANGEDIR) = 1 then
    uo_grid.of_property(/*keys*/ as_keys).is_value = ls_path
end if

Validar antes de escribir #

// The question is OFF by default : turn it on to be able to refuse a value
uo_grid.ib_veto_changes = true
// event ue_value_changing of uo_grid : (string as_keys, string as_value)
// FALSE refuses : the cell shows the old value again. is_error, set before, tells
// the user why : the help pane shows it until the value is edited again
choose case as_keys
    case "layout/width"
        if Long(as_value) < 200 or Long(as_value) > 4000 then
            uo_grid.of_property(/*keys*/ as_keys).is_error = "Between 200 and 4000 pixels."
            return false
        end if
    case "name"
        if Trim(as_value) = "" then
            uo_grid.of_property(/*keys*/ as_keys).is_error = "A window needs a name."
            return false
        end if
end choose

// Any other value is accepted
return true

Valores predeterminados, cambios y Cancelar #

Dos nociones distintas, como en la ventana de propiedades de Visual Studio y en un DataWindow: el valor predeterminado (is_default) dice qué se escribe en negrita y qué restablece Supr; la referencia (of_load, of_reset_update) dice qué hay que guardar (of_is_dirty, of_dirty_keys) y qué devuelve Cancelar (of_revert).

// The defaults of the window : a value that differs is written in bold
uo_grid.of_property(/*keys*/ "layout/width").is_default = "800"
uo_grid.of_property(/*keys*/ "layout/state").is_default = "normal"

// The width the user may type, and what Up / Down add or take
uo_grid.of_property(/*keys*/ "layout/width").is_min = "200"
uo_grid.of_property(/*keys*/ "layout/width").is_max = "4000"
uo_grid.of_property(/*keys*/ "layout/width").id_step = 50

// The saved settings, read back : they become the reference
uo_grid.of_load(/*json*/ is_saved_settings)
// OK : every value right first - otherwise the keyboard goes to the first error
if uo_grid.of_validate() > 0 then return

// Save only what changed (what the user is still typing counts too), then the screen becomes the reference
if uo_grid.of_is_dirty() then
    is_saved_settings = uo_grid.of_values()
    uo_grid.of_reset_update()
end if
// Cancel : every value back to the settings loaded
uo_grid.of_revert()

Una propiedad desplegable #

Una fuente cabe en una fila cerrada, que resume sus valores, y se abre sobre sus tres propiedades. Sin plantilla el resumen es Segoe UI; 9; False; is_summary lo escribe a su manera: Segoe UI, 9 pt, y luego , bold mientras Bold esté marcado.

// A group in the category appearance : the font, closed when it is added
uo_grid.of_add_category(/*key*/ "appearance", /*title*/ "Appearance")
uo_grid.of_add_property(/*keys*/ "appearance/font", /*label*/ "Font", /*type*/ u_pbt_propertygrid.TYPE_GROUP, /*value*/ "")

// What it holds is added at its address
uo_grid.of_add_property(/*keys*/ "appearance/font/name", /*label*/ "Name", /*type*/ u_pbt_propertygrid.TYPE_STRING, /*value*/ "Segoe UI")
uo_grid.of_add_property(/*keys*/ "appearance/font/size", /*label*/ "Size", /*type*/ u_pbt_propertygrid.TYPE_NUMBER, /*value*/ "9")
uo_grid.of_add_property(/*keys*/ "appearance/font/bold", /*label*/ "Bold", /*type*/ u_pbt_propertygrid.TYPE_BOOLEAN, /*value*/ "false")

// Its summary, written your way : "Segoe UI, 9 pt", then ", bold" while Bold is checked
uo_grid.of_property(/*keys*/ "appearance/font").is_summary = "{name}, {size} pt{?bold}, bold{/bold}"

// Open it : its three values show under it
uo_grid.of_property(/*keys*/ "appearance/font").ib_expanded = true
// Local variables
n_pbt_json lnv_json
double ld_size

// The group is an object in the values : the same address reads its size
lnv_json.of_load(/*json*/ uo_grid.of_values())
ld_size = lnv_json.of_get_number(/*path*/ "appearance/font/size")
// event ue_property_toggled of uo_grid : (string as_keys, boolean ab_expanded)
// The group that opened or closed, by its address
if ab_expanded then
    lb_log.AddItem(as_keys + " opened")
else
    lb_log.AddItem(as_keys + " closed")
end if

Leer todos los valores a la vez #

// Local variables
n_pbt_json lnv_json
string ls_state

// Every value, typed, read along the same addresses as the grid
lnv_json.of_load(/*json*/ uo_grid.of_values())
w_customers.title = lnv_json.of_get_string(/*path*/ "name")
w_customers.width = lnv_json.of_get_number(/*path*/ "layout/width")
w_customers.resizable = lnv_json.of_get_boolean(/*path*/ "layout/resizable")

// One value alone : always text
ls_state = uo_grid.of_property(/*keys*/ "layout/state").is_value

Vistas, búsqueda y ancho de las etiquetas #

// One flat list sorted by label, instead of the categories
uo_grid.is_sort = u_pbt_propertygrid.SORT_ALPHABETICAL

// Keep only what speaks of a colour
uo_grid.is_filter = "colour"

// The labels take half of the width, and the help pane goes away
uo_grid.ii_label_width = 50
uo_grid.ib_help = false

Recorrer una categoría #

// Local variables
n_pbt_propertygrid_category lnv_layout
string ls_keys
long ll_i

// Each property of the category, by its full address
lnv_layout = uo_grid.of_category(/*key*/ "layout")
for ll_i = 1 to lnv_layout.of_count()
    ls_keys = lnv_layout.of_keys_at(/*index*/ ll_i)
    lb_values.AddItem(ls_keys + " = " + uo_grid.of_property(/*keys*/ ls_keys).is_value)
next

Recargar una lista de opciones #

// The states offered depend on the kind of window : the old choices go,
// the property keeps its handle, its flags and its place
uo_grid.of_clear_options(/*keys*/ "layout/state")

// The new choices, then the value to show among them
uo_grid.of_add_option(/*keys*/ "layout/state", /*value*/ "docked", /*text*/ "Docked")
uo_grid.of_add_option(/*keys*/ "layout/state", /*value*/ "floating", /*text*/ "Floating")
uo_grid.of_property(/*keys*/ "layout/state").is_value = "docked"

Buenas prácticas #

Heredado de la base común #

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

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

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

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