contextmenu — u_pbt_contextmenu #
← Referencia de componentes · Índice de la guía
El menú contextual de Windows, con el tema de la aplicación: una lista en cascada que se abre en el cursor, bajo un control o en un punto de la pantalla — iconos, atajos mostrados, marcas de verificación, entradas de opción, encabezados de sección, listas largas que se desplazan y responden al tecleo.
▶ Verlo en vivo — Aplicación de demostración, mosaico Context menu: la vista previa, el código que lo produce y esta página, lado a lado.
En resumen #
| Userobject | u_pbt_contextmenu |
| Clase de elementos | n_pbt_contextmenu_item (of_item(keys)) |
| Sirve para | Ofrecer, con el clic derecho o bajo un botón, los comandos que valen para lo que se tiene a mano |
| Principio | Usted describe las entradas por su dirección; la ventana, el teclado y las cascadas son cosa nuestra |
| Opción opt-in | ib_track_hover |
Inicio rápido #
// The menu of a grid : three commands, a separator, a cascade
uo_menu.of_add_item(/*keys*/ "copy", /*text*/ "&Copy")
uo_menu.of_add_item(/*keys*/ "paste", /*text*/ "&Paste")
uo_menu.of_add_item(/*keys*/ "delete", /*text*/ "&Delete")
uo_menu.of_add_separator(/*keys*/ "")
uo_menu.of_add_item(/*keys*/ "export", /*text*/ "&Export")
uo_menu.of_add_item(/*keys*/ "export/pdf", /*text*/ "PDF")
uo_menu.of_add_item(/*keys*/ "export/csv", /*text*/ "CSV")
// It opens from the right-click event of the grid : see Where to call of_show
// event ue_item_selected of uo_menu : (string as_keys)
// as_keys is the ADDRESS of the chosen entry
choose case as_keys
case "copy"
of_copy_selection()
case "export/pdf"
of_export("pdf")
end choose
Abrir el menú #
El componente en sí es invisible: no ocupa espacio en la ventana. Colóquelo en cualquier sitio, con anchura y altura nulas — solo existe mientras el menú está abierto. Cuatro maneras de abrirlo:
of_show()— en el cursor, desde el clic derecho del control que recibe el gesto — vea la tabla más abajo.of_show_under(control)— bajo un control: el menú cuelga de su borde inferior, alineado con su borde de inicio (su borde derecho en una disposición de derecha a izquierda), y se abre por encima cuando la pantalla se acaba debajo. Lo que necesita un botón Más o … — y el teclado:of_show_under(control, true)resalta la primera entrada activa.of_show(x, y)— en un punto de la pantalla, en píxeles. Unas coordenadas negativas son un punto real: una pantalla situada a la izquierda o por encima de la principal.of_show_at(control, x, y)— en un punto dentro de un control, en unidades PowerBuilder desde su esquina superior izquierda: el punto que tomabaPopMenu, nada que convertir.of_source()nombra luego ese control enue_item_selected— un solo menú para varios controles.
// event rbuttondown of a DataWindow : the row under the cursor first
if row > 0 then dw_list.SetRow(/*row*/ row)
uo_menu.of_show()
// event ue_clicked of a "More" button : the menu hangs from it
uo_menu.of_show_under(/*control*/ uo_more)
// event rbuttondown of a DataWindow, another way : the point in the control, in
// PowerBuilder units, as PopMenu took it
uo_menu.of_show_at(/*control*/ dw_list, /*x*/ dw_list.PointerX(), /*y*/ dw_list.PointerY())
Dónde llamar a of_show #
| Control | Evento | Conviene saber |
|---|---|---|
| DataWindow | rbuttondown | Haga primero actual la fila pulsada (SetRow(row)). La pulsación sirve: solo una pulsación elige una entrada, nunca la liberación que la sigue |
| ListView, TreeView | rightclicked | El evento da el elemento pulsado |
| Componente PBToolboxAI | ue_rclicked | Un componente con elementos tiene también un evento de clic derecho de elemento, que lo nombra por su dirección |
| Campo de entrada | un evento de usuario en pbm_contextmenu | Llega con el clic derecho; return 1 evita que el campo abra también su propio menú de Windows (Cortar, Copiar, Pegar). El teclado no llega ahí con PowerBuilder 10: vea la receta más abajo |
of_show() se abre donde está el cursor, es decir, donde el usuario pulsó: ninguna unidad que convertir. of_show(x, y) espera píxeles de pantalla, nunca las unidades PowerBuilder de un xpos/ypos relativo al control. Para un punto dentro de un control, en unidades PowerBuilder, está of_show_at(control, x, y).
Con el teclado — Mayús+F10 o la tecla Menú — el ratón está en cualquier parte: abra el menú bajo el control que tiene el foco, con of_show_under(control, true). Como en Windows, su primera entrada activa queda resaltada: Intro la elige, las flechas parten de ahí. Con PowerBuilder 10, pbm_contextmenu solo recibe el clic derecho, y Mayús+F10 no llega a un campo de entrada (medido: ni pbm_contextmenu, ni pbm_keydown, ni pbm_syskeydown). La tecla que abre el menú en un control PowerBuilder es pues la tecla Menú (KeyApps!), tomada en un evento de usuario en pbm_keydown — pbm_dwnkey para un DataWindow, cuyo clic derecho pasa por su evento rbuttondown: pbm_contextmenu no llega ahí con un clic en una celda (medido). Mayús+F10 lo siguen recibiendo los propios componentes PBToolboxAI (su ue_rclicked).
// User event ue_contextmenu of an edit field, mapped on pbm_contextmenu :
// the right-click opens the menu at the cursor
uo_menu.of_show()
// The field does not open its own Windows menu as well
return 1
// User event ue_key of the same field, mapped on pbm_keydown : the Menu key
// opens the menu under the field, its first entry highlighted
if key = KeyApps! then
uo_menu.of_show_under(/*control*/ this, /*keyboard*/ true)
return 1
end if
// User event ue_key of a DataWindow, mapped on pbm_dwnkey : the Menu key
if key = KeyApps! then
uo_menu.of_show_under(/*control*/ this, /*keyboard*/ true)
return 1
end if
Una sola respuesta por apertura: un menú abierto termina con una elección (ue_item_selected) o sin ella (ue_dismissed — un clic fuera, Esc, of_close). Un menú que no tiene nada que mostrar no se abre: ue_dismissed llega enseguida. Mientras el menú está en pantalla la aplicación sigue funcionando: una entrada atenuada, oculta o eliminada entretanto ya no puede elegirse (ue_dismissed en su lugar), y of_remove_item, of_clear u of_reset cierran el menú abierto. ue_dismissed(as_reason) dice por qué: REASON_ESCAPE (Esc), REASON_OUTSIDE (un clic fuera), REASON_FOCUS (otra ventana tomó el foco), REASON_USER (de otra manera, otro menú que toma su lugar), REASON_CODE (of_close, una entrada eliminada o el menú vaciado), REASON_REPLACED (un segundo of_show), REASON_EMPTY (nada que mostrar), REASON_UNAVAILABLE (la entrada elegida ya no estaba disponible).
Un menú cada vez: un segundo of_show sustituye al menú abierto, que responde primero ue_dismissed. Y of_close llamado justo después de of_show cierra el menú antes incluso de que se dibuje — también sigue ue_dismissed.
Con el teclado, las flechas recorren las entradas saltando las atenuadas, → abre una cascada y ← la cierra, Intro elige, Esc sube un nivel y luego cierra. La letra subrayada — la que sigue a & en la etiqueta, && para un ampersand — elige la entrada directamente; si no, teclear las primeras letras de una etiqueta lleva a esa entrada, espacios incluidos («report 2»). Una lista larga (quinientas entradas y más) se desplaza y sigue fluida. Leído de derecha a izquierda, el menú se alinea a la derecha y las cascadas se abren hacia la izquierda.
Cascadas, secciones y marcas #
Una entrada se designa por su dirección: su clave sola en el primer nivel (copy), las claves de sus padres y luego la suya, unidas por /, en una cascada (export/pdf). El padre debe existir; una clave no contiene ni / ni | y no empieza por __. ue_item_selected devuelve esa misma dirección: dos cascadas pueden nombrar igual sus entradas.
Un separador (of_add_separator) y un encabezado de sección (of_add_header) se colocan al final del menú (dirección vacía) o de la cascada de una entrada. Ninguno de los dos es una entrada: nunca elegidos, nunca contados. Un separador nunca se muestra al principio, al final ni duplicado; un encabezado cuyas entradas están todas ocultas desaparece con ellas.
Una marca de verificación (ib_checked) dice que una opción está activa; una entrada de opción (is_group) es una elección entre varias: las entradas de un mismo grupo bajo el mismo padre se excluyen — marcar una, por código o por la elección del usuario, desmarca las demás, y una viñeta redonda sustituye a la marca. El atajo (is_shortcut) se muestra a la derecha de la entrada; solo se muestra: la tecla pertenece al control del que habla el menú (un campo de entrada ya copia con Ctrl+C), y un menú contextual que la armara se la quitaría a todos los controles de la ventana.
Una entrada marcada fuera de un grupo no cambia sola cuando el usuario la elige — como en todo menú de Windows: cámbiela en ue_item_selected. Un comando que destruye se distingue por su tono: is_tone = TONE_DANGER escribe su texto en el rojo del tema, legible en claro como en oscuro. Para que una opción cambie sola al elegirla, ponga ib_auto_check = true: la marca cambia antes de ue_item_selected. Una opción es una casilla de verificación — anunciada «no activada» por un lector de pantalla — en cuanto se ha marcado una vez, o en cuanto ib_checkable = true.
// A section of three exclusive entries in the View cascade
uo_menu.of_add_header(/*keys*/ "view", /*text*/ "Layout")
uo_menu.of_add_item(/*keys*/ "view/list", /*text*/ "&List")
uo_menu.of_add_item(/*keys*/ "view/details", /*text*/ "&Details")
uo_menu.of_item(/*keys*/ "view/list").is_group = "layout"
uo_menu.of_item(/*keys*/ "view/details").is_group = "layout"
// Checking one unchecks the other
uo_menu.of_item(/*keys*/ "view/details").ib_checked = true
// The shortcut SHOWN at the right of an entry
uo_menu.of_item(/*keys*/ "copy").is_shortcut = "Ctrl+C"
// A command that destroys : the red of the theme
uo_menu.of_item(/*keys*/ "delete").is_tone = uo_menu.TONE_DANGER
// event ue_item_selected : a check mark outside a group is switched by you
if as_keys = "wrap" then uo_menu.of_item(/*keys*/ as_keys).ib_checked = not uo_menu.of_item(/*keys*/ as_keys).ib_checked
// ... or by the entry itself, before ue_item_selected
uo_menu.of_item(/*keys*/ "grid").ib_auto_check = true
Reutilizar un menú PowerBuilder #
¿Sus menús emergentes ya están escritos? of_load_menu los convierte en el menú del componente: pase el elemento sobre el que llamaba a PopMenu. Cada elemento se convierte en una entrada, cascadas incluidas, con su texto (& incluido), su estado (Enabled, Checked, Visible), su Shortcut mostrado a la derecha — como el texto tras una tabulación — y su imagen de barra de herramientas cuando es un archivo presente. Su clave es el ClassName del elemento, en cada nivel. Al elegir, el script Clicked del elemento se ejecuta primero, luego ue_item_selected: el código escrito para PopMenu sigue sirviendo. El menú sigue vivo, como con PopMenu: cada apertura vuelve a leer los elementos (Text, Enabled, Checked, Visible, Shortcut). El código que precedía a PopMenu — m_paste.Enabled = (Clipboard() <> "") — y un Clicked que hace this.Checked = not this.Checked se ven por tanto en la apertura siguiente; un elemento atenuado u oculto mientras el menú está abierto no ejecuta su Clicked (ue_dismissed(REASON_UNAVAILABLE)). Mantenga vivo el objeto menú mientras el componente lo use. of_loaded_item devuelve el elemento de una entrada, para leer lo que solo el menú sabe (su MicroHelp) — compruébelo con IsValid, una entrada añadida a mano no tiene. Un script Clicked que lee ParentWindow encuentra en él una ventana válida — medido con PowerBuilder 10, incluso para un menú creado con create y nunca asociado a una ventana —, pero es PowerBuilder quien la elige: nada garantiza que sea la ventana que lleva el menú contextual. Para que un Clicked alcance una ventana concreta, désela al menú en una variable de instancia, asignada antes de of_load_menu, o lleve ese código a ue_item_selected.
// Instance variable of the window : the menu lives as long as it does
// m_popup im_popup
// open event of the window : the items of m_popup.m_edit become the menu
im_popup = create m_popup
uo_menu.of_load_menu(/*menu*/ im_popup.m_edit)
// event rbuttondown of the DataWindow : the code before PopMenu stays,
// of_show replaces PopMenu - the items are read again as it opens
im_popup.m_edit.m_paste.Enabled = (Clipboard() <> "")
uo_menu.of_show()
// event ue_item_hover of uo_menu (ib_track_hover = true) : the MicroHelp
if IsValid(uo_menu.of_loaded_item(/*keys*/ as_keys)) then st_help.text = uo_menu.of_loaded_item(/*keys*/ as_keys).MicroHelp
// A Clicked that must reach ONE given window : the menu keeps that window
// itself. Instance variable of m_popup : window iw_owner
// Clicked of m_edit.m_copy
iw_owner.TriggerEvent("ue_copy")
// open event of the window, before of_load_menu
im_popup.iw_owner = this
Propiedades #
| Propiedad | Tipo | Predeterminado | Función |
|---|---|---|---|
ib_track_hover | boolean | false | Activa ue_item_hover, que dice en qué entrada están el puntero o el teclado — para la línea de ayuda de una barra de estado. Sin él el menú ni siquiera lo informa: un evento lanzado en cada movimiento solo se envía a la aplicación que lo pidió — póngala antes de of_show: cambiada con el menú abierto, vale desde la apertura siguiente |
is_theme_style | string | "" | Estilo visual del componente (constantes THEME_STYLE_*); vacío = el de la aplicación, seguido en cada cambio |
is_theme_mode | string | "" | Variante clara u oscura (constantes THEME_MODE_*); vacío = la de la aplicación, seguida en cada cambio |
il_theme_accent | long | -1 | Color de acento de este componente (-1 = acento de la aplicación, o el del tema) |
Métodos #
| Método | Función | |
|---|---|---|
of_add_header (string as_keys, string as_text) | Añade un encabezado de sección al final del menú (dirección vacía) o de la cascada de una entrada: una línea de título sobre las entradas que la siguen. Nunca elegido ni contado. Devuelve 0 una vez añadido, -5 cuando ninguna entrada vive en esa dirección, -2 cuando el componente no está creado | |
of_add_item (string as_keys, string as_text) | Añade una entrada en su dirección: copy en el menú, export/pdf en la cascada de una entrada export existente, tan profundo como haga falta. Una etiqueta vacía muestra la clave; & marca la letra que la elige con el teclado. Devuelve 0 una vez añadida, -5 cuando la dirección se rechaza (padre no encontrado, dirección ya ocupada, nivel vacío como export/, clave con ` | o que empieza por __), -2` cuando el componente no está creado |
of_add_item (string as_keys, string as_text, string as_image, boolean ab_checked) | Igual, con el icono y la marca — el icono en tercer lugar, como en toda la biblioteca. Una entrada se atenúa por su handle: of_item(keys).ib_enabled = false. Devuelve 0 una vez añadida, -5 cuando la dirección se rechaza, -2 cuando el componente no está creado | |
of_add_separator (string as_keys) | Añade un separador al final del menú (dirección vacía) o de la cascada de una entrada. Devuelve 0 una vez añadido, -5 cuando ninguna entrada vive en esa dirección, -2 cuando el componente no está creado | |
of_clear ( ) | Vacía el menú y libera los handles obtenidos con of_item. Un menú abierto se cierra, y ue_dismissed lo indica. Devuelve 0 una vez aplicado, -2 cuando el componente no está creado | |
of_close ( ) | Cierra el menú del componente si está en pantalla, sin elección: sigue ue_dismissed, como con un clic fuera. Nada abierto, no pasa nada. Devuelve 0 una vez pedido, -2 cuando el componente no está creado | |
of_insert_item (string as_keys, string as_text, long al_index) | Inserta una entrada en un rango de su lista en lugar de al final: as_keys es la dirección que tendrá, al_index su lugar entre las entradas de esa lista, desde 1 (0 o menos = la primera, más allá = el final). Los separadores y los encabezados no cuentan: la entrada va justo antes de la que ocupaba ese rango. Devuelve 0 una vez añadida, -5 cuando la dirección se rechaza (como of_add_item), -2 cuando el componente no está creado | |
of_insert_item (string as_keys, string as_text, string as_image, boolean ab_checked, long al_index) | Igual, con el icono y la marca, como los toma of_add_item. Devuelve 0 una vez añadida, -5 cuando la dirección se rechaza, -2 cuando el componente no está creado | |
of_is_open ( ) | true mientras un menú del componente está en pantalla — abierto, y aún no respondido por una elección o un cierre | |
of_item (string as_keys) | Devuelve el handle de una entrada, por su dirección, para leerla o cambiarla más tarde (etiqueta, estado, icono, atajo, grupo, colores). Una clave sola se resuelve en la dirección completa de la única entrada que la lleva: of_item("pdf") y of_item("export/pdf") devuelven entonces el mismo handle. Ambigua, o sin entrada que la lleve, devuelve un handle que no cambia nada en lugar de la entrada equivocada | |
of_load_menu (menu am_menu) | Construye el menú a partir de un menú PowerBuilder: pase el elemento sobre el que llamaba a PopMenu. Sus elementos se convierten en las entradas, cascadas incluidas, clave = ClassName; al elegir, el Clicked del elemento se ejecuta antes de ue_item_selected. Los elementos se vuelven a leer en cada apertura. El menú sustituye lo que tenía el componente. Devuelve 0 una vez cargado, -5 cuando el menú no es válido, -2 cuando el componente no está creado | |
of_loaded_item (string as_keys) | El elemento de menú PowerBuilder del que procede una entrada (of_load_menu), por su dirección — para leer su MicroHelp. Una dirección que no procede de un menú devuelve una referencia no válida: compruébela con IsValid | |
of_remove_item (string as_keys) | Elimina una entrada y su cascada; las demás se quedan. Sus handles se liberan; un menú abierto se cierra (ue_dismissed). Devuelve 0 una vez eliminada, -5 cuando ninguna entrada vive en esa dirección, -2 cuando el componente no está creado | |
of_reset ( ) | Vacía el menú y devuelve cada propiedad a su valor por defecto, sin lanzar ningún evento. Devuelve 0 una vez aplicado, -2 cuando el componente no está creado | |
of_show ( ) | Abre el menú en el cursor. Llámelo desde el clic derecho del control que recibe el gesto. Un menú sin entradas visibles no se abre: se lanza ue_dismissed. Devuelve 0 una vez pedido, -2 cuando el componente no está creado | |
of_show (long al_x, long al_y) | Igual, en una posición de la pantalla en píxeles. Unas coordenadas negativas son un punto real: una pantalla situada a la izquierda o por encima de la principal. Devuelve 0 una vez pedido, -2 cuando el componente no está creado | |
of_show_at (dragobject ado_control, long al_x, long al_y) | Abre el menú en un punto dentro de un control, en unidades PowerBuilder desde su esquina superior izquierda — el punto que tomaba PopMenu: of_show_at(dw_list, dw_list.PointerX(), dw_list.PointerY()). El control se conserva: of_source lo nombra. Devuelve 0 una vez pedido, -5 cuando el control no es válido o una coordenada es nula, -2 cuando el componente no está creado | |
of_show_under (dragobject ado_control) | Abre el menú bajo un control: cuelga de su borde inferior, alineado con su borde de inicio (su borde derecho en una disposición de derecha a izquierda), y se abre por encima cuando la pantalla se acaba debajo. Devuelve 0 una vez pedido, -5 cuando el control no es válido, -2 cuando el componente no está creado — bajo un componente con elementos (una buttonbar, una toolbar), el menú cuelga bajo el componente entero, no bajo uno de sus botones | |
of_show_under (dragobject ado_control, boolean ab_keyboard) | Igual, indicando cómo se pidió el menú: true para el teclado (Mayús+F10, tecla Menú) — la primera entrada activa queda resaltada, Intro la elige, como en Windows. Devuelve 0 una vez pedido, -5 cuando el control no es válido, -2 cuando el componente no está creado | |
of_source ( ) | El control desde el que se abrió el menú en pantalla — o el último —: el dado a of_show_under o a of_show_at. Léalo en ue_item_selected cuando un menú sirve a varios controles. Un menú abierto en el cursor o en un punto de la pantalla (of_show) no tiene: la referencia no es válida, compruébela con IsValid |
Eventos #
| Evento | Se dispara cuando |
|---|---|
ue_item_selected (string as_keys) | El usuario eligió una entrada, con el ratón o el teclado. as_keys es su dirección completa (export/pdf). Una entrada de un grupo queda marcada, y las demás de su grupo desmarcadas, antes del evento |
ue_dismissed (string as_reason) | El menú se cerró sin elección: un clic fuera, Esc, of_close, una entrada eliminada o el menú vaciado mientras estaba abierto, un segundo of_show que lo sustituyó — y también cuando of_show no tenía nada que mostrar — as_reason dice cuál: REASON_ESCAPE, REASON_OUTSIDE, REASON_FOCUS, REASON_USER, REASON_CODE, REASON_REPLACED, REASON_EMPTY, REASON_UNAVAILABLE (una entrada atenuada, oculta o eliminada desde la apertura) |
ue_item_hover (string as_keys) | Con ib_track_hover = true: la entrada en la que está el puntero, por su dirección — también una entrada atenuada, para que su ayuda diga por qué; con el teclado, las entradas en las que se detiene, saltando las atenuadas. Se lanza una vez por entrada, y luego con una dirección vacía cuando el menú se cierra: vacíe entonces la línea de ayuda. of_reset cierra un menú abierto sin lanzarlo: vacíela usted |
Propiedades de elemento #
| Propiedad | Tipo | Predeterminado | Función |
|---|---|---|---|
is_text | string | "" | Etiqueta de la entrada. & marca la letra que la elige con el teclado (&& para un ampersand); vacía, se muestra la clave y la etiqueta se relee vacía |
ib_enabled | boolean | true | En false, la entrada queda atenuada: mostrada, nunca elegida, su cascada cerrada |
ib_visible | boolean | true | En false, la entrada sale del menú — cascada incluida — sin eliminarse: conserva su clave y su estado, y vuelve a su sitio. Una cascada cuyas entradas están todas ocultas se queda, atenuada |
ib_checked | boolean | false | Una marca en la entrada — una viñeta redonda para una entrada de un grupo. Marcar una entrada de un grupo desmarca las demás del grupo; fuera de un grupo, la entrada no cambia sola al elegirla: hágalo en ue_item_selected, o ponga ib_auto_check |
ib_checkable | boolean | false | Una casilla de verificación: la opción se muestra y se anuncia como tal incluso desmarcada («no activada» para un lector de pantalla). Una entrada marcada una vez lo pasa a ser sola; póngala para una opción que empieza desmarcada. Una entrada de opción (is_group) nunca lo es |
ib_auto_check | boolean | false | En true, elegir la entrada cambia sola su marca, antes de ue_item_selected — ib_checked dice allí el nuevo estado. Pasa a ser una casilla de verificación; sin efecto en una entrada de un grupo |
is_group | string | "" | Convierte la entrada en una entrada de opción del grupo nombrado: las entradas de un grupo bajo el mismo padre se excluyen. Vacío: una entrada corriente |
is_image | string | "" | Icono de la entrada, cambiado en su sitio. Las mismas rutas que of_add_item (mono:, tint:, archivo.dll:NOMBRE); vacío, desaparece |
is_shortcut | string | "" | El atajo mostrado a la derecha de la entrada (Ctrl+C). Solo se muestra: la tecla pertenece al control del que habla el menú. Nunca se muestra en una entrada que abre una cascada |
is_tone | string | "" | El tono del comando: su texto, en reposo, en un color del tema claro u oscuro — TONE_DANGER para el que destruye, TONE_WARN, TONE_SUCCESS, TONE_INFO; vacío o TONE_NEUTRAL = el texto del tema. Señalada, la entrada toma los colores de paso del tema; un il_text_color de la entrada prevalece. Las constantes están en u_pbt_contextmenu |
il_accent | long | -1 | Acento de esta entrada: su marca, y su borde cuando está señalada (-1 = el del tema) |
il_back_color | long | -1 | Fondo de esta entrada en reposo (-1 = el del tema). Dado solo, el texto toma un color legible sobre él |
il_text_color | long | -1 | Color del texto de esta entrada (-1 = el del tema). Un solo color no se lee en el tema claro y en el oscuro: ponga il_back_color con él, o prefiera is_tone, que sigue el tema |
il_back_color_hover | long | -1 | Fondo de esta entrada mientras está señalada (-1 = el del tema) |
il_text_color_hover | long | -1 | Color del texto de esta entrada mientras está señalada (-1 = el del tema): ponga il_back_color_hover con él, el paso del tema cambia de un tema a otro |
Una entrada no muestra ninguna información sobre herramientas: el menú nativo no la tiene. El is_tooltip que hereda el handle se conserva y se relee, pero nunca se muestra — para una ayuda, ib_track_hover y ue_item_hover.
Ejemplos #
Un menú según lo que se ha pulsado #
// event ue_rclicked of the list : the menu is rebuilt for the current row
uo_menu.of_clear()
uo_menu.of_add_item(/*keys*/ "open", /*text*/ "&Open")
uo_menu.of_add_item(/*keys*/ "rename", /*text*/ "Re&name")
uo_menu.of_add_separator(/*keys*/ "")
uo_menu.of_add_item(/*keys*/ "delete", /*text*/ "&Delete")
// A row the user may not change : its commands are greyed
uo_menu.of_item(/*keys*/ "rename").ib_enabled = ib_can_edit
uo_menu.of_item(/*keys*/ "delete").ib_enabled = ib_can_edit
// At the cursor
uo_menu.of_show()
Un botón Más #
// event ue_clicked of the button : the menu hangs from it
uo_menu.of_show_under(/*control*/ uo_more)
Una ayuda en la barra de estado #
// Once, after the menu is built : report the pointed entry
uo_menu.ib_track_hover = true
// event ue_item_hover of uo_menu : (string as_keys), "" when the menu closes
choose case as_keys
case "delete"
st_help.text = "Deletes the row, without the clipboard."
case else
st_help.text = ""
end choose
Buenas prácticas #
- Abra desde el evento de clic derecho del control (vea la tabla): solo una pulsación elige una entrada, la liberación que sigue no elige nada.
- Un menú corto. Los comandos frecuentes arriba, los destructivos abajo, tras un separador, con
TONE_DANGER. - Atenúe en lugar de ocultar un comando que existe pero no se aplica aquí: el usuario aprende dónde está.
- Muestre los atajos de sus comandos: un menú contextual es donde se aprenden.
- Una cascada, no dos: más allá de un nivel, un cuadro de diálogo se lee mejor.
Versión de demostración #
Sin clave, cada lista del menú — la raíz como cada cascada — muestra sus seis primeras entradas visibles; los separadores y los encabezados no cuentan. La última línea, atenuada, dice cuántas entradas no se muestran — o, sin recorte, lleva la mención «PBToolboxAI — DEMO». El modelo lo guarda todo: una clave muestra el menú entero en la apertura siguiente.
El lanzador no tiene superficie: de los miembros heredados más abajo, of_save_as_png, of_print y of_focus_webview no tienen nada que capturar, imprimir ni recibir. of_register_shortcut sigue siendo útil — un atajo de la ventana que abre el menú con of_show_under.
Heredado de la base común #
Estos miembros existen en todos los componentes visuales — no son propios de este. Se detallan una sola vez, en los capítulos transversales; esta tabla solo dice dónde leerlos.
| Miembros | Función | Detallado en |
|---|---|---|
of_count · of_keys_at · of_has | Recorrer lo que el componente contiene | 3.2 Los items |
of_reset | Poner el componente a cero | 3.6 Poner un componente a cero: of_reset() |
of_register_shortcut · of_clear_shortcuts | Atajos de teclado del componente | 3.5 Los atajos de teclado |
of_is_created · of_is_ready · of_get_last_error | Si ha nacido, si está listo, qué ha fallado | 3.7 Diagnóstico |
of_save_as_png · of_save_as_jpg | Exportar el render como imagen | 3.8 Exportar la representación como imagen |
of_set_redraw | Agrupar los cambios en un solo repintado | 3.10 Buenas prácticas |
of_preload_icons | Iconos mostrados sin retardo | Visualización instantánea: of_icon |
of_set_translation | Traducir una etiqueta del componente | 5.2 Adaptar una etiqueta: of_set_translation |
of_focus_webview | Dar el foco al componente | 6.4 Teclado y foco |
of_print · of_print_to_pdf | Imprimir, o escribir un PDF | 6.9 Imprimir |
of_set_property · of_get_property · of_component_name | Controlar una propiedad por su nombre | 3.1 El motor de propiedades |
is_accessible_name · is_accessible_description | El nombre y la descripción que dice un lector de pantalla | 3.4 Propiedades y eventos opcionales |
En este lanzador invisible, of_count y of_keys_at recorren lo que usted ha añadido, ramas ocultas incluidas — no lo que la rueda dibujará. La exportación como imagen, la impresión, of_focus_webview y of_set_redraw no tienen aquí ningún efecto útil: el componente no dibuja nada propio, la rueda vive en su propia ventana.
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.