shellexplorer — u_pbt_shellexplorer #
← Riferimento dei componenti · Sommario della guida
L'albero della shell di Windows: Desktop, Questo PC, unità, cartelle, Rete — con le vere icone della postazione.
▶ Vederlo dal vivo — Applicazione dimostrativa, riquadro Shell explorer : l'anteprima, il codice che lo produce e questa pagina, affiancati.
In breve #
| Userobject | u_pbt_shellexplorer |
| Serve a | Scegliere una cartella, o navigare, senza uscire dall'applicazione |
| Principio | Voi dite da dove partire; la shell dice cosa c'è, e voi ricevete ciò che l'utente ha scelto |
Avvio rapido #
// Open event of the window : the tree starts where the application works
uo_tree.is_root = "C:\Projects"
Poi, nell'evento ue_selected dell'albero:
// Event ue_selected : the folder the user chose, by its display name
st_folder.text = as_name
La shell, non il file system #
Il componente non enumera directory: interroga la shell (IShellFolder). È ciò che mette nell'albero Questo PC, la Rete, il Cestino e le cartelle virtuali — l'albero che l'utente già conosce, invece di un elenco di unità.
Ogni nodo è identificato dal suo nome di analisi: un percorso per ciò che sta sul disco, una forma ::{GUID} per il resto. È l'unica chiave che la shell sa rileggere — quindi l'unica da conservare.
🚨
ue_selectedvi dà il nome OLTRE al percorso, e non è una comodità. Il nome visualizzato di una cartella virtuale non è la fine del suo percorso: « Questo PC » non ha fine. Un'applicazione che spezza il percorso mostrerà::{20D04FE0-…}al suo utente.
L'albero si costruisce man mano che lo si percorre: un ramo è chiesto solo alla sua apertura. Leggere un intero disco per disegnare un albero congelerebbe l'applicazione per minuti su un'unità di rete — ed è il caso normale nelle applicazioni in cui questa libreria vive.
// Event ue_selected : the path AND the display name
st_path.text = as_path
st_name.text = as_name
Proprietà #
| Proprietà | Tipo | Predefinito | Ruolo |
|---|---|---|---|
is_root | string | "" | Da dove parte l'albero (costanti ROOT_*). Vuoto = la radice della shell. Un percorso parte invece da lì |
ib_show_files | boolean | false | Mostra anche i file. Falso per impostazione predefinita: un albero serve a scegliere un luogo, e una cartella con quattromila file non è più un luogo |
ib_show_hidden | boolean | impostazione di Esplora risorse | Mostra file e cartelle nascosti. Finché l'applicazione non la imposta, segue l'impostazione « Elementi nascosti » di Esplora risorse della postazione — e la rilegge. I file protetti di sistema seguono solo Esplora risorse |
is_file_filter | string | "" | Quali file sono mostrati quando ib_show_files è vero: modelli separati da punto e virgola (*.pdf;*.docx), confrontati con il vero nome del file. Le cartelle passano sempre, perché l'utente possa arrivare al file. Vuoto = tutti. Impostato finché ib_show_files è falso, non rilegge nulla: parte con i file |
ib_enabled | boolean | true | Falso: l'albero resta visibile, attenuato, e non risponde più né al clic né alla tastiera; esce dall'ordine di tabulazione. L'applicazione lo pilota comunque (of_select, of_expand, of_refresh) |
is_theme_style | string | "" | Stile visivo del componente (costanti THEME_STYLE_*); vuoto = quello dell'applicazione, seguito a ogni cambio |
is_theme_mode | string | "" | Variante chiara o scura (costanti THEME_MODE_*); vuoto = quella dell'applicazione, seguita a ogni cambio |
il_theme_accent | long | -1 | Colore d'accento di questo componente (-1 = accento dell'applicazione, o quello del tema) |
is_tooltip | string | "" | Descrizione comando semplice mostrata al passaggio sul componente |
is_super_tooltip_title | string | "" | Titolo della descrizione arricchita (prevale su is_tooltip) |
is_super_tooltip_text | string | "" | Testo della descrizione arricchita (markup ricco accettato) |
is_super_tooltip_image | string | "" | Immagine della descrizione arricchita |
Una proprietà scritta con il valore che ha già non rilegge nulla dalla shell: una finestra può applicare le sue impostazioni a ogni apertura senza pagarne il costo.
Metodi #
| Metodo | Ruolo |
|---|---|
long of_expand ( string as_path ) | Apre un ramo, e i rami chiusi sopra di esso: una sola chiamata per un percorso profondo, anche non ancora disegnato, da qualsiasi radice (sotto il Desktop, C:\ si raggiunge da Questo PC). Una cartella creata dopo la lettura del suo genitore si trova rileggendo una volta il genitore. Maiuscole e barra rovesciata finale non contano. Un percorso irraggiungibile, o che non è un ramo, solleva ue_path_not_found. Come il chevron, solleva ue_expanded per ogni ramo che si apre lungo il percorso (nessuno per un ramo già aperto). Restituisce 0 una volta inviato, -5 per un percorso vuoto, -2 se il componente non è creato |
long of_collapse ( string as_path ) | Chiude un ramo. I suoi figli restano, quindi riaprirlo non costa nulla. Una selezione al suo interno risale sul ramo. Come un clic sul suo chevron, solleva ue_collapsed, e ue_selected quando la selezione risale sul ramo; nulla se il ramo è già chiuso o non è disegnato (non c'è nulla da chiudere). Un percorso disegnato due volte chiude UNA riga, quella che of_select raggiungerebbe. Restituisce 0 una volta applicato, -5 per un percorso vuoto, -2 se il componente non è creato |
long of_select ( string as_path ) | Seleziona un nodo. I rami sopra di esso si aprono, la selezione è visibile; un nodo non ancora disegnato si raggiunge come con of_expand, uno irraggiungibile solleva ue_path_not_found. Come un clic, solleva ue_selected (nulla se il nodo è già selezionato); of_selected_key lo rilegge una volta arrivato. Restituisce 0 una volta inviato, -5 per un percorso vuoto, -2 se il componente non è creato |
long of_refresh ( { string as_path } ) | Rilegge l'albero dalla shell — dopo che l'applicazione ha scritto sul disco. I rami aperti si riaprono e la selezione ritorna, ritrovati dal loro percorso; ciò che non esiste più è abbandonato, e una selezione scomparsa solleva ue_selected con due testi vuoti. Con un percorso, solo quel ramo è riletto (un ramo mai aperto non ha nulla da rileggere). Restituisce 0 una volta richiesto, -5 per un percorso vuoto, -2 se il componente non è creato |
string of_selected_key ( ) | Il nome di analisi del nodo scelto. L'unica chiave che la shell sa rileggere |
string of_selected_name ( ) | Il nome visualizzato, come lo mostra Esplora risorse. Non deducetelo mai dal percorso |
boolean of_selected_is_folder ( ) | Vero quando il nodo scelto è una cartella, falso per un file o se nulla è selezionato. Gli eventi danno solo il percorso |
boolean of_has ( string as_keys ) | Vero quando questo percorso è disegnato nell'albero, aperto o no. Un percorso è UNA chiave: le sue barre rovesciate non sono livelli. Le maiuscole non contano, né / scritto al posto di \ (C:/Data è C:\Data). La radice (il suo percorso, o "") c'è appena la shell l'ha letta |
long of_count ( { string as_keys } ) | Senza percorso: quante righe l'albero mostra (un ramo chiuso nasconde i suoi figli). Con un percorso: quanti figli sono stati letti sotto di esso — 0 finché non è mai stato aperto, un ramo essendo letto solo alla sua apertura. Anche la radice conta, con il suo percorso o con "": of_count(is_root) è il numero di nodi del primo livello, qualunque cosa sia aperta sotto |
string of_keys_at ( string as_keys, long al_index ) | Il percorso del figlio di rango al_index (da 1) sotto un percorso, "" oltre i limiti. Un percorso di figlio è già intero: si reinserisce così com'è in of_has, of_count, of_select o of_expand. of_keys_at(is_root, i) percorre il primo livello; of_keys_at(al_index) percorre allo stesso modo le righe mostrate |
long of_reset ( ) | Torna alla radice della shell, solo cartelle, nulla selezionato. Restituisce 0 una volta applicato, -2 se il componente non è creato |
Eventi #
| Evento | Scatta quando |
|---|---|
ue_selected (string as_path, string as_name) | Un nodo è selezionato — dall'utente (clic, tastiera) o da of_select / of_collapse: il suo percorso e il suo nome visualizzato. Sollevato anche con due testi vuoti quando una rilettura trova che il nodo selezionato è scomparso |
ue_expanded (string as_path) | Un ramo si apre — dall'utente (chevron, doppio clic, tastiera) o da of_expand / of_select, una volta per ogni ramo aperto lungo il percorso. L'evento parte prima dell'arrivo dei figli — la shell è interrogata in quel momento, e su una condivisione di rete si prende il suo tempo |
ue_activated (string as_path) | Doppio clic, o tasto Invio. È lì che un'applicazione apre la cartella, la carica, o chiude un selettore. Su un ramo lo aprono o lo chiudono anche: segue ue_expanded o ue_collapsed |
ue_error (string as_path, string as_reason, string as_message) | La shell rifiuta un ramo o la radice — unità scollegata, cartella senza diritti, condivisione che non risponde entro 30 secondi —: as_path è il suo percorso ("" per il Desktop), as_reason una costante REASON_* che il codice può verificare (REASON_ACCESS_DENIED, REASON_TIMEOUT, REASON_NOT_FOUND, REASON_UNREADABLE), as_message il testo della shell per una persona, percorso : testo ((root) : … per il Desktop). Il ramo si richiude (ue_collapsed) e sarà richiesto di nuovo alla prossima apertura; una radice illeggibile lo scrive nell'albero |
ue_collapsed (string as_path) | Un ramo si chiude — dall'utente, da of_collapse, o dall'albero stesso quando un ramo annunciato aperto da ue_expanded torna vuoto o è rifiutato dalla shell. Una selezione al suo interno risale sul ramo, e ue_selected lo segnala |
ue_path_not_found (string as_path, string as_action, string as_reason) | Un of_expand o un of_select non ha potuto essere servito. as_action vale expand o select; as_reason una costante REASON_* (vedi sotto): il percorso non esiste, l'albero non lo mostra, è fuori dalla radice, è la radice, non è un ramo, va oltre il limite della dimostrazione, o il suo ramo è illeggibile |
ue_node_rclicked (string as_path, long al_x, long al_y) | Un clic destro su un nodo — selezionato prima, come in Esplora risorse, quindi ue_selected arriva prima quando la selezione cambia —, o il tasto del menu contestuale (o Maiusc + F10) sul nodo selezionato. al_x, al_y sono pixel dello schermo (da tastiera, l'angolo in basso a sinistra del nodo), quelli che prende un contextmenu: uo_menu.of_show(al_x, al_y); per un menu PowerBuilder, PopMenu(PointerX(), PointerY()) della vostra finestra |
Le icone vengono dall'imagelist di sistema della postazione, non da noi: un file
.dwgporta l'icona di AutoCAD se AutoCAD è installato, e quella generica altrimenti. È ciò che l'utente si aspetta, e nient'altro può darlo.
Perché un percorso o un ramo fallisce: le costanti REASON_* #
ue_path_not_found e ue_error danno il loro motivo come costante di u_pbt_shellexplorer, la stessa nei due eventi e in ogni lingua di Windows: verificate quella, mai il testo.
| Costante | Che cosa dice |
|---|---|
REASON_NOT_FOUND | Il percorso non esiste |
REASON_NOT_SHOWN | Il percorso esiste, l'albero non lo mostra: un file mentre ib_show_files è falso, un elemento nascosto, un file escluso da is_file_filter |
REASON_OUTSIDE_ROOT | Il percorso non è sotto is_root |
REASON_THE_ROOT | Il percorso è la radice stessa: non è un nodo dell'albero |
REASON_NOT_A_BRANCH | of_expand di un file, o di una cartella senza figli |
REASON_ACCESS_DENIED | La shell rifiuta: nessun diritto |
REASON_TIMEOUT | Nessuna risposta entro 30 secondi (una condivisione scomparsa); quel server risponde poi subito timeout per 30 secondi, finché una lettura non riesce; of_refresh e F5 lo ritentano subito |
REASON_UNREADABLE | Qualsiasi altro rifiuto della shell: as_message di ue_error ne dà il testo |
REASON_DEMO_LIMIT | Modalità dimostrazione: oltre i nodi disegnati per livello |
Tastiera e mouse #
- Clic su un nodo: è selezionato (
ue_selected, mai una seconda volta per il nodo già selezionato); sul suo chevron: si apre o si chiude; doppio clic:ue_activated, e un ramo si apre o si chiude; clic destro: il nodo è selezionato, poiue_node_rclicked. - Su / Giù: il nodo precedente, il successivo; Home / Fine: il primo, l'ultimo; Pagina su / Pagina giù: di una schermata. Ctrl + Su / Giù scorre senza cambiare la selezione.
- Destra apre il nodo, poi scende al primo figlio; Sinistra lo chiude, poi risale al genitore — invertite in un'applicazione da destra a sinistra. Backspace risale al genitore;
*del tastierino numerico apre il nodo e i rami già letti sotto. - Invio:
ue_activated(e un ramo si apre o si chiude); F5 rilegge il ramo in mano (of_refresh); tasto del menu contestuale o Maiusc + F10:ue_node_rclicked. - Le prime lettere di un nome, spazio compreso, selezionano il nodo mostrato che comincia così; la stessa lettera digitata di nuovo passa al successivo.
Esempi #
Partire altrove che dal Desktop #
// 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"
Aprire ciò che l'utente ha confermato #
// Event ue_activated : a double-click, or Enter
of_open_folder(as_path)
Dire perché un ramo non si apre #
// 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
Aprire il vostro menu con un clic destro #
// 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
Buone pratiche #
- 🚨 Conservate
of_selected_key(), mostrateof_selected_name(). Spezzare il percorso per un'etichetta funziona conC:\Clientie mostra::{20D04FE0-…}per Questo PC. - Lasciate
ib_show_filesa falso finché cercate una cartella. I file rendono l'albero illeggibile e lento. - Prevedete
ue_errorfin dalla prima versione: un'unità di rete scollegata è il caso ordinario, non l'eccezione. Verificateas_reason, mai il testo:REASON_TIMEOUTdice che una condivisione non risponde in ogni lingua di Windows. - Usate
ue_activated, nonue_selected, per confermare. Selezionare è guardare; fare doppio clic è decidere. - Rileggete il ramo che è cambiato. Dopo aver scritto in una cartella,
of_refresh(percorso)rilegge solo quella cartella;of_refresh()rilegge tutto ciò che è aperto — lo stato è conservato, ma su una condivisione di rete ogni ramo aperto costa un andata e ritorno. - Un percorso di partenza stretto batte un albero intero quando l'applicazione sa già dove lavora: partite da
C:\Progetti.
Ereditato dalla base comune #
Questi membri esistono su tutti i componenti visivi — non sono propri di questo. Sono descritti una sola volta, nei capitoli trasversali; questa tabella dice solo dove leggerli.
| Membri | Ruolo | Descritto in |
|---|---|---|
of_reset | Riportare il componente a zero | 3.6 Riportare un componente a zero: of_reset() |
of_register_shortcut · of_clear_shortcuts | Scorciatoie da tastiera del componente | 3.5 Le scorciatoie da tastiera |
of_is_created · of_is_ready · of_get_last_error | Se è nato, se è pronto, cosa è fallito | 3.7 Diagnostica |
of_save_as_png · of_save_as_jpg | Esportare il rendering in immagine | 3.8 Esportare il rendering come immagine |
of_set_redraw | Raggruppare le modifiche in un solo ridisegno | 3.10 Buone pratiche |
of_preload_icons | Icone mostrate senza ritardo | Visualizzazione istantanea: of_icon |
of_set_translation | Tradurre una dicitura del componente | 5.2 Adattare un'etichetta: of_set_translation |
of_focus_webview | Dare il focus al componente | 6.4 Tastiera e focus |
of_print · of_print_to_pdf | Stampare, o scrivere un PDF | 6.9 Stampare |
of_set_property · of_get_property · of_component_name | Pilotare una proprietà per nome | 3.1 Il motore delle proprietà |
is_accessible_name · is_accessible_description | Il nome e la descrizione che dice un lettore di schermo | 3.4 Proprietà ed event opzionali |
Due aiuti non sono ereditati: of_icon e of_escape_markup vivono su n_pbt_utils. Ne dichiari uno — n_pbt_utils lnv_utils, niente da creare — e li chiami su di esso.