shellexplorer — u_pbt_shellexplorer #
← Referencia de componentes · Índice de la guía
El árbol del shell de Windows: Escritorio, Este equipo, unidades, carpetas, Red — con los iconos reales del puesto.
▶ Verlo en vivo — Aplicación de demostración, mosaico Shell explorer : la vista previa, el código que lo produce y esta página, lado a lado.
En resumen #
| Userobject | u_pbt_shellexplorer |
| Sirve para | Elegir una carpeta, o navegar, sin salir de la aplicación |
| Principio | Usted dice dónde empezar; el shell dice qué hay, y usted recibe lo que el usuario eligió |
Inicio rápido #
// Open event of the window : the tree starts where the application works
uo_tree.is_root = "C:\Projects"
Después, en el evento ue_selected del árbol:
// Event ue_selected : the folder the user chose, by its display name
st_folder.text = as_name
El shell, no el sistema de archivos #
El componente no enumera directorios: interroga al shell (IShellFolder). Es lo que pone en el árbol Este equipo, la Red, la Papelera y las carpetas virtuales — el árbol que el usuario ya conoce, en vez de una lista de unidades.
Cada nodo se identifica por su nombre de análisis: una ruta para lo que está en el disco, una forma ::{GUID} para el resto. Es la única clave que el shell sabe releer — así que la única que hay que guardar.
🚨
ue_selectedle da el nombre ADEMÁS de la ruta, y no es una comodidad. El nombre mostrado de una carpeta virtual no es el final de su ruta: «Este equipo» no tiene final. Una aplicación que corta la ruta para sacar una etiqueta mostrará::{20D04FE0-…}a su usuario.
El árbol se construye a medida que se recorre: una rama solo se pide al abrirla. Leer un disco entero para dibujar un árbol congelaría la aplicación durante minutos en una unidad de red — y ese es el caso normal en las aplicaciones donde vive esta biblioteca.
// Event ue_selected : the path AND the display name
st_path.text = as_path
st_name.text = as_name
Propiedades #
| Propiedad | Tipo | Predeterminado | Función |
|---|---|---|---|
is_root | string | "" | Dónde empieza el árbol (constantes ROOT_*). Vacío = la raíz del shell. Una ruta empieza ahí en su lugar |
ib_show_files | boolean | false | Muestra también los archivos. Falso por defecto: un árbol sirve para elegir un lugar, y una carpeta con cuatro mil archivos ya no es un lugar |
ib_show_hidden | boolean | ajuste del Explorador | Muestra los archivos y carpetas ocultos. Mientras la aplicación no la fije, sigue el ajuste «Elementos ocultos» del Explorador del puesto — y lo relee. Los archivos protegidos del sistema solo siguen al Explorador |
is_file_filter | string | "" | Qué archivos se muestran cuando ib_show_files es verdadero: patrones separados por punto y coma (*.pdf;*.docx), comparados con el nombre real del archivo. Las carpetas siempre aparecen, para que el usuario llegue al archivo. Vacío = todos. Puesto mientras ib_show_files es falso, no relee nada: sale con los archivos |
ib_enabled | boolean | true | Falso: el árbol sigue visible, atenuado, y ya no responde ni al clic ni al teclado; sale del orden de tabulación. La aplicación lo sigue manejando (of_select, of_expand, of_refresh) |
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) |
is_tooltip | string | "" | Información sobre herramientas simple al pasar por encima del componente |
is_super_tooltip_title | string | "" | Título de la información enriquecida (tiene prioridad sobre is_tooltip) |
is_super_tooltip_text | string | "" | Texto de la información enriquecida (se acepta marcado enriquecido) |
is_super_tooltip_image | string | "" | Imagen de la información enriquecida |
Una propiedad escrita con el valor que ya tiene no relee nada del shell: una ventana puede aplicar sus ajustes en cada apertura sin pagar por ello.
Métodos #
| Método | Función |
|---|---|
long of_expand ( string as_path ) | Abre una rama, y las ramas cerradas por encima: una sola llamada para una ruta profunda, aunque no esté dibujada, desde cualquier raíz (bajo el Escritorio, C:\ se alcanza por Este equipo). Una carpeta creada después de leer su padre se encuentra releyendo una vez ese padre. Mayúsculas y barra invertida final no cuentan. Una ruta inalcanzable, o que no es una rama, dispara ue_path_not_found. Como el chevron, dispara ue_expanded por cada rama que se abre en el camino (ninguno para una rama ya abierta). Devuelve 0 una vez enviado, -5 para una ruta vacía, -2 si el componente no está creado |
long of_collapse ( string as_path ) | Cierra una rama. Sus hijos siguen ahí, así que reabrirla no cuesta nada. Una selección dentro de ella sube a la rama. Como un clic en su chevron, dispara ue_collapsed, y ue_selected cuando la selección sube a la rama; nada si la rama ya está cerrada o no está dibujada (no hay nada que cerrar). Una ruta dibujada dos veces cierra UNA fila, la que alcanzaría of_select. Devuelve 0 una vez aplicado, -5 para una ruta vacía, -2 si el componente no está creado |
long of_select ( string as_path ) | Selecciona un nodo. Las ramas por encima se abren, la selección queda a la vista; un nodo aún no dibujado se alcanza como con of_expand, uno inalcanzable dispara ue_path_not_found. Como un clic, dispara ue_selected (nada si el nodo ya está seleccionado); of_selected_key lo relee una vez llegado. Devuelve 0 una vez enviado, -5 para una ruta vacía, -2 si el componente no está creado |
long of_refresh ( { string as_path } ) | Relee el árbol desde el shell — después de que la aplicación haya escrito en el disco. Las ramas abiertas se reabren y la selección vuelve, encontradas por su ruta; lo que ya no existe se abandona, y una selección desaparecida dispara ue_selected con dos textos vacíos. Con una ruta, solo esa rama se relee (una rama nunca abierta no tiene nada que releer). Devuelve 0 una vez solicitado, -5 para una ruta vacía, -2 si el componente no está creado |
string of_selected_key ( ) | El nombre de análisis del nodo elegido. La única clave que el shell sabe releer |
string of_selected_name ( ) | El nombre mostrado, tal como el Explorador lo enseña. Nunca lo deduzca de la ruta |
boolean of_selected_is_folder ( ) | Verdadero cuando el nodo elegido es una carpeta, falso para un archivo o si no hay selección. Los eventos solo dan la ruta |
boolean of_has ( string as_keys ) | Verdadero cuando esta ruta está dibujada en el árbol, abierta o no. Una ruta es UNA clave: sus barras invertidas no son niveles. Las mayúsculas no cuentan, ni / escrito por \ (C:/Data es C:\Data). La raíz (su ruta, o "") está en cuanto el shell la ha leído |
long of_count ( { string as_keys } ) | Sin ruta: cuántas filas muestra el árbol (una rama cerrada oculta a sus hijos). Con una ruta: cuántos hijos se leyeron bajo ella — 0 mientras nunca se abrió, ya que una rama solo se lee al abrirse. La raíz también cuenta, por su ruta o por "": of_count(is_root) es el número de nodos del primer nivel, esté lo que esté abierto debajo |
string of_keys_at ( string as_keys, long al_index ) | La ruta del hijo de rango al_index (desde 1) bajo una ruta, "" fuera de los límites. Una ruta de hijo ya está completa: se reinyecta tal cual en of_has, of_count, of_select u of_expand. of_keys_at(is_root, i) recorre el primer nivel; of_keys_at(al_index) recorre igual las filas mostradas |
long of_reset ( ) | Vuelve a la raíz del shell, solo carpetas, nada seleccionado. Devuelve 0 una vez aplicado, -2 si el componente no está creado |
Eventos #
| Evento | Se dispara cuando |
|---|---|
ue_selected (string as_path, string as_name) | Se selecciona un nodo — por el usuario (clic, teclado) o por of_select / of_collapse: su ruta y su nombre mostrado. También se dispara con dos textos vacíos cuando una relectura encuentra que el nodo seleccionado ha desaparecido |
ue_expanded (string as_path) | Se abre una rama — por el usuario (chevron, doble clic, teclado) o por of_expand / of_select, una vez por cada rama abierta en el camino. El evento sale antes de que lleguen los hijos — el shell se interroga en ese momento, y en un recurso de red se toma su tiempo |
ue_activated (string as_path) | Doble clic, o tecla Intro. Ahí una aplicación abre la carpeta, la carga, o cierra un selector. En una rama también la abren o la cierran: sigue ue_expanded o ue_collapsed |
ue_error (string as_path, string as_reason, string as_message) | El shell rechaza una rama o la raíz — unidad desconectada, carpeta sin permisos, recurso que no responde en 30 segundos —: as_path es su ruta ("" para el Escritorio), as_reason una constante REASON_* que su código puede comprobar (REASON_ACCESS_DENIED, REASON_TIMEOUT, REASON_NOT_FOUND, REASON_UNREADABLE), as_message el texto del shell para una persona, ruta : texto ((root) : … para el Escritorio). La rama se cierra (ue_collapsed) y se vuelve a pedir en su próxima apertura; una raíz ilegible lo dice en el árbol |
ue_collapsed (string as_path) | Se cierra una rama — por el usuario, por of_collapse, o por el propio árbol cuando una rama anunciada abierta por ue_expanded vuelve vacía o el shell la rechaza. Una selección dentro de ella sube a la rama, y ue_selected lo informa |
ue_path_not_found (string as_path, string as_action, string as_reason) | Un of_expand o un of_select no pudo servirse. as_action vale expand o select; as_reason una constante REASON_* (ver más abajo): la ruta no existe, el árbol no la muestra, queda fuera de la raíz, es la raíz, no es una rama, supera el límite de la demostración, o su rama es ilegible |
ue_node_rclicked (string as_path, long al_x, long al_y) | Un clic derecho en un nodo — seleccionado antes, como en el Explorador, así que ue_selected llega antes cuando la selección cambia —, o la tecla del menú contextual (o Mayús + F10) en el nodo seleccionado. al_x, al_y son píxeles de pantalla (con el teclado, la esquina inferior izquierda del nodo), los que toma un contextmenu: uo_menu.of_show(al_x, al_y); para un menú de PowerBuilder, PopMenu(PointerX(), PointerY()) de su ventana |
Los iconos vienen de la lista de imágenes del sistema del puesto, no de nosotros: un archivo
.dwglleva el icono de AutoCAD si AutoCAD está instalado, y el genérico si no. Es lo que el usuario espera, y nada más puede darlo.
Por qué falla una ruta o una rama: las constantes REASON_* #
ue_path_not_found y ue_error dan su motivo como constante de u_pbt_shellexplorer, la misma en los dos eventos y en todos los idiomas de Windows: compruebe esa, nunca el texto.
| Constante | Qué dice |
|---|---|
REASON_NOT_FOUND | La ruta no existe |
REASON_NOT_SHOWN | La ruta existe, el árbol no la muestra: un archivo mientras ib_show_files es falso, un elemento oculto, un archivo excluido por is_file_filter |
REASON_OUTSIDE_ROOT | La ruta no está bajo is_root |
REASON_THE_ROOT | La ruta es la propia raíz: no es un nodo del árbol |
REASON_NOT_A_BRANCH | of_expand de un archivo, o de una carpeta sin hijos |
REASON_ACCESS_DENIED | El shell lo rechaza: sin permisos |
REASON_TIMEOUT | Sin respuesta en 30 segundos (un recurso desaparecido); ese servidor responde luego timeout al instante durante 30 segundos, hasta una lectura que funcione; of_refresh y F5 lo reintentan al instante |
REASON_UNREADABLE | Cualquier otro rechazo del shell: as_message de ue_error da su texto |
REASON_DEMO_LIMIT | Modo de demostración: más allá de los nodos dibujados por nivel |
Teclado y ratón #
- Clic en un nodo: se selecciona (
ue_selected, nunca una segunda vez para el nodo ya seleccionado); en su chevron: se abre o se cierra; doble clic:ue_activated, y una rama se abre o se cierra; clic derecho: el nodo se selecciona, luegoue_node_rclicked. - Arriba / Abajo: el nodo anterior, el siguiente; Inicio / Fin: el primero, el último; Re Pág / Av Pág: de una pantalla. Ctrl + Arriba / Abajo desplaza sin cambiar la selección.
- Derecha abre el nodo, luego baja a su primer hijo; Izquierda lo cierra, luego sube al padre — invertidas en una aplicación de derecha a izquierda. Retroceso sube al padre;
*del teclado numérico abre el nodo y las ramas ya leídas debajo. - Intro:
ue_activated(y una rama se abre o se cierra); F5 relee la rama en mano (of_refresh); tecla del menú contextual o Mayús + F10:ue_node_rclicked. - Las primeras letras de un nombre, espacio incluido, seleccionan el nodo mostrado que empieza así; la misma letra tecleada de nuevo pasa al siguiente.
Ejemplos #
Empezar en otro sitio que el Escritorio #
// Only the drives, nothing above them
uo_tree.is_root = u_pbt_shellexplorer.ROOT_COMPUTER
// Or somewhere the application already knows
uo_tree.is_root = "C:\Projects"
Abrir lo que el usuario ha validado #
// Event ue_activated : a double-click, or Enter
of_open_folder(as_path)
Decir por qué una rama no se abre #
// Event ue_error : 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
Abrir su menú con un clic derecho #
// The entries of the menu, once : uo_menu is a contextmenu of the window, and
// is_menu_path a string instance variable that keeps the folder right-clicked
uo_menu.of_add_item(/*keys*/ "open", /*text*/ "Open")
uo_menu.of_add_item(/*keys*/ "refresh", /*text*/ "Refresh")
// event ue_node_rclicked of uo_tree : (string as_path, long al_x, long al_y)
// The folder is selected first, as in the Explorer : the menu opens where the
// user clicked (from the keyboard, under the folder)
is_menu_path = as_path
uo_menu.of_show(/*x*/ al_x, /*y*/ al_y)
// event ue_item_selected of uo_menu : (string as_keys)
// The entry chosen acts on the folder right-clicked
choose case as_keys
case "open"
of_open_folder(is_menu_path)
case "refresh"
uo_tree.of_refresh(/*path*/ is_menu_path)
end choose
Buenas prácticas #
- 🚨 Guarde
of_selected_key(), muestreof_selected_name(). Cortar la ruta para una etiqueta funciona conC:\Clientesy muestra::{20D04FE0-…}para Este equipo. - Deje
ib_show_filesen falso mientras busca una carpeta. Los archivos vuelven el árbol ilegible y lento. - Prevea
ue_errordesde la primera versión: una unidad de red desconectada es el caso ordinario, no la excepción. Compruebeas_reason, nunca el texto:REASON_TIMEOUTdice que un recurso no responde en todos los idiomas de Windows. - Use
ue_activated, noue_selected, para validar. Seleccionar es mirar; hacer doble clic es decidir. - Relea la rama que ha cambiado. Tras escribir en una carpeta,
of_refresh(ruta)relee solo esa carpeta;of_refresh()relee todo lo abierto — el estado se conserva, pero en un recurso de red cada rama abierta cuesta un viaje de ida y vuelta. - Una ruta de partida estrecha vale más que un árbol entero cuando la aplicación ya sabe dónde trabaja: empiece en
C:\Proyectos.
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_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 |
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.