PBToolboxAI v5 ← Site

treeview — u_pbt_treeview #

← Riferimento dei componenti · Sommario della guida

treeview mostra dati ad albero: nodi che ne contengono altri, aperti e chiusi dal loro chevron, con un'immagine, un badge, una casella a tre stati e una selezione singola o multipla. Appena gli si aggiunge una colonna, diventa una lista ad albero (TreeList): la prima colonna porta l'albero, le altre mostrano i campi di ogni nodo, ordinabili con un clic sulla loro intestazione. Un ramo può promettere figli che legge solo all'apertura; l'utente rinomina un nodo (F2) e lo trascina altrove, e la vostra applicazione può rifiutare prima; una ricerca tiene solo ciò che corrisponde. L'albero si riempie a mano o da un DataStore gerarchico (una riga nomina il suo padre), e può riscrivervi ciò che l'utente cambia.

▶ Vederlo dal vivo — Applicazione dimostrativa, riquadro Tree view: l'anteprima, il codice che lo produce e questa pagina, affiancati.


In breve #

Userobjectu_pbt_treeview
Classi di elementin_pbt_treeview_node (of_node(keys)), n_pbt_treeview_column (of_column(key))
Serve aUn albero di cartelle, un organigramma, categorie di prodotti, diritti da spuntare, una distinta base con le sue quantità
PrincipioUn nodo ha una chiave unica sotto il suo padre; il suo indirizzo unisce le chiavi dei suoi livelli con / ("europe/france")
Opzioni opt-inib_checkboxes, ib_editable, ib_drag_drop, ib_veto_changes, ib_veto_selection, ib_veto_toggle, ib_single_expand, ib_parents_first, ib_toolbar, ib_show_lines, ib_write_back, ib_allow_drop
Limite in modalità demoI primi 8 nodi di ogni livello disegnati, sotto ogni padre, nell'ordine del modello, e 200 nodi in tutto l'albero, i primi aggiunti (un nodo nascosto conta, lotti e gruppi compresi; un totale non conta mai ciò che il limite nasconde) — vedere la modalità demo

Avvio rapido #

// Two levels : a continent, then its countries (the parent is added first)
uo_tree.of_add_node(/*keys*/ "europe", /*text*/ "Europe")
uo_tree.of_add_node(/*keys*/ "europe/france", /*text*/ "France")
uo_tree.of_add_node(/*keys*/ "europe/italy", /*text*/ "Italy")

// Open the continent : its countries show
uo_tree.of_node(/*keys*/ "europe").ib_expanded = true
// event ue_node_opened of uo_tree : (string as_keys)
// A double click or Enter on a node : your own window shows it
OpenWithParm(w_country, as_keys)

Un indirizzo per nodo #

Un nodo è designato dal suo indirizzo: le chiavi dei suoi livelli unite da /. "europe" è in cima, "europe/france" dentro "europe" — il padre si aggiunge prima. Una chiave è unica sotto il suo padre: "europe/paris" e "usa/paris" sono due nodi. Un indirizzo già preso, un padre sconosciuto, un livello vuoto, una chiave che contiene | o comincia con __: l'aggiunta restituisce -5 e of_get_last_error dice perché. of_insert_node mette un nodo tra i suoi fratelli (posizione contata a partire da 1), of_move_node lo sposta con il suo sottoalbero sotto un altro padre ("" = in cima): il suo indirizzo cambia, e gli handle presi al vecchio indirizzo sono liberati subito (un handle preso poi al nuovo resta valido). Per percorrere l'albero: of_count() e of_keys_at(n) per il primo livello, of_count(indirizzo) e of_keys_at(indirizzo, n) per i figli di un nodo — che restituisce l'indirizzo completo, riutilizzabile così com'è.

// Local variables
long ll_i

// Paris first among the cities of France, then Italy moved under a new region
uo_tree.of_add_node(/*keys*/ "europe/france/lyon", /*text*/ "Lyon")
uo_tree.of_insert_node(/*keys*/ "europe/france/paris", /*text*/ "Paris", /*image*/ "", /*position*/ 1)
uo_tree.of_add_node(/*keys*/ "south", /*text*/ "Southern Europe")
uo_tree.of_move_node(/*keys*/ "europe/italy", /*to_parent_keys*/ "south", /*position*/ 1)

// The children of France, by their whole address
for ll_i = 1 to uo_tree.of_count(/*keys*/ "europe/france")
    lb_cities.AddItem(uo_tree.of_keys_at(/*keys*/ "europe/france", /*index*/ ll_i))
next

Aprire, selezionare, spuntare #

Un nodo si apre dal suo chevron, un doppio clic, la tastiera o il vostro codice (ib_expanded del suo handle, of_expand_all, of_collapse_all, of_expand_to_level, of_scroll_to_node, ciò che apre of_select_node; of_clear_children chiude): ognuno solleva ue_node_toggled, poi ue_layout_changed. La selezione segue is_selection_mode: un nodo (SELECT_SINGLE, il predefinito), più nodi con Ctrl e Maiusc come in Esplora risorse (SELECT_MULTIPLE), o nessuno (SELECT_NONE: la tastiera sposta solo un focus). of_select_node seleziona un nodo da solo, apre ciò che lo contiene e lo porta a schermo — un albero apre per selezionare, come il TreeView di Windows, ma giudica prima: un nodo nascosto o contenuto in un nascosto, oltre il limite demo o escluso dalla ricerca è rifiutato (-5, of_get_last_error dice perché) e nulla si apre. ue_selection_changed riceve gli indirizzi selezionati in un array JSON — che l'abbia cambiata un clic, la tastiera o il vostro codice, o che un nodo selezionato abbia lasciato lo schermo (ramo chiuso, nodo rimosso o nascosto, nodo celato dalla ricerca). Chiudere un ramo vi riporta il focus. Con ib_checkboxes, ogni nodo ha una casella; con ib_check_cascade (il predefinito), una spunta dell'utente su un padre spunta il suo sottoalbero tranne un nodo disattivato e il suo sottoalbero, che restano come sono (il padre è allora misto); una spunta del vostro codice spunta tutto. Durante una ricerca, la cascata prende tutto il sottoalbero, nodi celati compresi. Sotto la cascata, un padre è lo stato dei figli che l'albero può disegnare (né nascosti né, in modalità demo, oltre il limite): spuntato quando lo sono tutti, misto quando lo è una parte. Una spunta messa dall'utente solleva ue_node_checked; una spunta messa dal vostro codice (ib_checked, of_check_all) è un valore, muto come SetItem. I figli ricevuti sotto una foglia spuntata prendono la sua spunta — tutti, tutta la risposta a ue_children_needed — finché una spunta (gesto o codice) o un nodo spostato dentro non vi mette fine. Una spunta dell'utente non tocca mai un nodo oltre il limite demo, né, con ib_write_back, un nodo nascosto. of_select_nodes(as_keys_json) seleziona più nodi in una volta in SELECT_MULTIPLE — il corrispettivo di of_selected_keys — con una sola domanda ai veti e un solo ue_selection_changed; il focus va all'ultimo indirizzo nominato.

// Local variables
n_pbt_json lnv_json
string ls_keys[]
long ll_i

// A box before each node : checking a parent checks its subtree
uo_tree.ib_checkboxes = true
uo_tree.of_node(/*keys*/ "europe/france").ib_checked = true

// Every checked node, in the order of the tree
lnv_json.of_load(/*json*/ uo_tree.of_checked_keys())
for ll_i = 1 to lnv_json.of_get_array(/*path*/ "", /*values*/ ls_keys)
    lb_chosen.AddItem(ls_keys[ll_i])
next

Chiedere prima: selezione e apertura #

Una schermata master-detail non deve lasciare una scheda non salvata. Con ib_veto_selection, ue_selection_changing riceve la selezione attuale e quella richiesta (array JSON di indirizzi) prima di ogni scelta: un clic, Ctrl o Maiusc + clic, la tastiera, F3, of_select_node, of_clear_selection, of_search_next o of_search_prev. Restituite FALSE per rifiutare: nulla si muove, nemmeno il focus della tastiera, e il metodo restituisce -4; ue_node_clicked è sollevato comunque, il clic è avvenuto. Ciò che esce dalla selezione per conseguenza — un ramo chiuso, un nodo rimosso, nascosto o celato dalla ricerca — non è chiesto. Allo stesso modo, ib_veto_toggle pone ue_node_toggling prima di ogni apertura o chiusura, da un gesto o dal codice: un ib_expanded rifiutato non invia nulla (of_get_last_error lo dice), of_expand_all, of_collapse_all e of_expand_to_level applicano gli altri nodi e restituiscono -4, of_select_node e of_scroll_to_node restituiscono -4 senza aprire nulla. of_select_node chiede prima le aperture (ue_node_toggling), poi la selezione: un'applicazione non agisce mai su una selezione accettata per un'apertura poi rifiutata. Ciò che esce dalla selezione per conseguenza non si rifiuta: perché un ramo chiuso non lasci una scheda non salvata, abbinate ib_veto_selection a ib_veto_toggle e rifiutate la chiusura del ramo che la contiene. ib_single_expand lascia un solo ramo aperto sotto ogni padre: aprire un nodo chiude i suoi fratelli aperti, senza chiedere; impostarlo non chiude nulla sul momento.

// A record shown beside the tree : ask before the selection leaves it, and before
// a branch closes (closing the branch that holds it would leave it)
uo_tree.ib_veto_selection = true
uo_tree.ib_veto_toggle = true
// event ue_selection_changing of uo_tree : (string as_from_keys_json, string as_keys_json)
// Unsaved changes in the detail : the user decides
if dw_detail.ModifiedCount() > 0 then
    if MessageBox("Unsaved changes", "Leave this record without saving?", Question!, YesNo!) = 2 then return false
end if
return true
// event ue_node_toggling of uo_tree : (string as_keys, boolean ab_expanding)
// Closing the branch that holds an unsaved record would leave it : refused
if not ab_expanding and dw_detail.ModifiedCount() > 0 then
    if Pos(uo_tree.of_selected_key() + "/", as_keys + "/") = 1 then return false
end if
return true

Rami caricati su richiesta #

Un albero grande — un disco, un catalogo, una tabella di migliaia di righe — non deve essere letto tutto in una volta. ib_has_children = true su un nodo è una promessa: il suo chevron si mostra anche se non contiene nulla. Quando si apre — un clic, la tastiera, il vostro codice, o of_select_node che apre ciò che contiene un nodo —, viene sollevato ue_children_needed: i vostri of_add_node fatti durante l'evento ci sono quando il ramo si apre, dopo il ritorno della riga che l'ha aperto (ib_expanded = true non li aspetta). La promessa vale fino a questa risposta, anche se nel frattempo vi è stato aggiunto o rilasciato un nodo; se non aggiungete nulla, è ritirata (lo chevron sparisce). Rimettere ib_has_children = true la fa richiedere alla prossima apertura. Un'apertura fatta durante l'evento solleva un solo ue_node_toggled. of_expand_all apre solo i rami che hanno già dei figli: un ramo la cui promessa non ha avuto risposta resta chiuso, nessuna domanda è posta in massa. Per una tabella, inutile chiamare of_add_node riga per riga: of_from_datastore(ads, as_parent_keys) fa delle righe di un DataStore i figli del nodo, in un solo messaggio — lo schema ItemPopulate → Retrieve del TreeView di PowerBuilder. ROLE_PARENT vi nomina una riga dello stesso lotto (vuoto o sconosciuto: direttamente sotto il nodo); lo stesso DataStore ridato sotto lo stesso nodo sostituisce il suo lotto, un altro DataStore aggiunge il proprio. of_row di un nodo di un lotto restituisce la sua riga nel suo DataStore, e ib_write_back scrive lì. of_clear_children rimuove i figli di un nodo e lo fa promettere di nuovo: la sua prossima apertura richiede di nuovo (l'«aggiorna» di una cartella). Date a ogni lotto il suo DataStore (creato all'apertura del suo ramo, mantenuto finché i suoi nodi sono mostrati): un DataStore ricaricato per un altro nodo — Reset, Retrieve, poi of_from_datastore sotto un altro nodo — porta le sue righe al nuovo lotto, e PowerBuilder ridà gli stessi RowID dopo un Reset. I nodi del lotto precedente mantengono allora ciò che mostrano ma non hanno più una riga: of_row restituisce 0, uno spostamento dal codice restituisce -5 ("loaded again"), un testo rinominato o una spunta è rifiutato e ue_write_back_failed dice perché, e il caricamento che l'ha causato li conta (stale=N) in of_get_last_error. Lo stesso DataStore ridato sotto lo stesso nodo sostituisce il suo lotto; per aggiornare un lotto da un altro oggetto DataStore, chiamate prima of_clear_children, altrimenti si aggiunge accanto al primo. Una colonna chiamata has_children (ROLE_HAS_CHILDREN) fa promettere a una riga i propri figli, senza ciclo. as_parent_keys vuoto è rifiutato (-5): la cima dell'albero è of_from_datastore(ads).

// A folder that promises children : nothing is read before it opens
uo_tree.of_add_node(/*keys*/ "docs", /*text*/ "Documents", /*image*/ "img\packimages.dll:png/folder")
uo_tree.of_node(/*keys*/ "docs").is_expanded_image = "mono:img\packimages.dll:svg/samples/folder-open"
uo_tree.of_node(/*keys*/ "docs").ib_has_children = true
// event ue_children_needed of uo_tree : (string as_keys)
// Local variables
datastore lds_folders
n_pbt_utils lnv_utils

// The folder opens : ITS sub-folders are retrieved into a DataStore of their own and
// added in ONE call - code is their key and name their text (of_map, once), the
// column has_children says whether each one promises its own
lds_folders = create datastore
lds_folders.DataObject = "d_folders"
lds_folders.SetTransObject(SQLCA)

// as_keys is the whole ADDRESS (docs/reports) : the code of the folder is its LAST key
lds_folders.Retrieve(lnv_utils.of_leaf(/*keys*/ as_keys))
uo_tree.of_from_datastore(/*ads*/ lds_folders, /*parent_keys*/ as_keys)

// One DataStore per lot, kept while its nodes are shown : of_row and ib_write_back
// read it ; the window destroys them when it closes
ids_lots[UpperBound(ids_lots) + 1] = lds_folders

Rinominare e spostare #

Con ib_editable, l'utente rinomina un nodo: F2, o un clic sul nodo già selezionato (dopo un breve ritardo, come in Esplora risorse). Invio (o lasciare il campo) tiene il testo, Esc lo ripristina, un testo svuotato è rifiutato (la modifica si annulla); ue_node_edited riceve il testo digitato e quello vecchio — un testo digitato è testo, mai markup. Un comando del vostro codice durante la modifica conserva il campo e ciò che vi è digitato; se la riga modificata lascia lo schermo senza un gesto dell'utente (codice, scorrimento), la modifica è annullata. Con ib_drag_drop, trascina un nodo: sul quarto alto di una riga va prima di essa, sul quarto basso dopo — come primo figlio se è un ramo aperto —, al centro dentro; un ramo chiuso sotto il puntatore si apre dopo un istante, l'albero scorre vicino ai suoi bordi, Esc annulla, un nodo non va mai nel proprio sottoalbero né dove la sua chiave è presa, e nulla si rilascia sulla riga di un nodo disattivato. Un trascinamento il cui pulsante rilasciato l'albero non vede — la finestra perde il focus (Alt+Tab, una finestra di messaggio) — è annullato: nulla si sposta. Sotto un ordinamento, o con ib_parents_first, un rilascio va solo dentro. ue_node_moved riceve il nuovo indirizzo, il vecchio e il posto sotto il nuovo padre; un nodo rilasciato dove già si trova non chiede, non scrive e non solleva nulla. Con ib_veto_changes, ue_node_editing e ue_node_moving sono posti prima — ue_node_moving con il posto finale, quello che dirà ue_node_moved: restituite FALSE per rifiutare — nulla cambia, e of_move_node restituisce -4. Si trascina un nodo alla volta, anche in selezione multipla.

// Renaming and moving by the user, with a question before each change
uo_tree.ib_editable = true
uo_tree.ib_drag_drop = true
uo_tree.ib_veto_changes = true
// event ue_node_moving of uo_tree : (string as_keys, string as_to_parent_keys, long al_position)
// Nothing goes to the top level : FALSE keeps the node where it is
if as_to_parent_keys = "" then return false
return true

Anche il vostro codice apre un nome in modifica: of_edit_node(as_keys) — l'EditLabel di un TreeView PowerBuilder, per una «Nuova cartella» che si apre pronta a essere nominata. Il nodo viene prima selezionato (ciò che lo contiene si apre), poi il campo si apre; la fine spetta all'utente, come sopra. Un blocco ferma l'utente, mai il vostro codice: funziona con ib_editable = false, su un nodo di sola lettura o disattivato. of_cancel_edit() chiude il campo e ripristina il testo, come Esc.

// A new folder, opened at once in edit mode : the user types its name, then Enter
uo_tree.of_add_node(/*keys*/ "docs/new", /*text*/ "New folder")
uo_tree.of_edit_node(/*keys*/ "docs/new")

Blocchi, Canc e copia #

Tre blocchi per nodo fermano l'utente, mai il vostro codice: ib_read_only (né rinominato né trascinato, resta una destinazione), ib_drop_target = false (nulla viene rilasciato dentro di esso, né un nodo né un file — prima o dopo di esso resta permesso) e ib_show_checkbox = false (nessuna casella: il nodo non conta per il padre, non è in of_checked_keys, e la cascata lo attraversa verso i figli). Canc solleva ue_delete_requested con i nodi selezionati (in SELECT_NONE, quello del focus; senza selezione altrimenti non si solleva nulla), tranne quelli disattivati e in sola lettura: l'albero non rimuove nulla, la vostra applicazione chiama of_remove_node per ciò che elimina. Ctrl+C (o Ctrl+Ins) solleva ue_copy con i nodi selezionati (in SELECT_NONE, quello del focus) in testo separato da tabulazioni, un numero grezzo (un punto, né raggruppamento né simbolo): il testo dopo tante tabulazioni quanta la sua profondità, poi le colonne di una lista ad albero allineate, prima una riga d'intestazione; l'albero prova anche gli appunti del browser, che possono essere rifiutati alla pagina — ClipBoard(as_tsv) per essere sicuri.

// The system folder : neither renamed nor dragged, nothing dropped into it, no check box
uo_tree.of_node(/*keys*/ "system").ib_read_only = true
uo_tree.of_node(/*keys*/ "system").ib_drop_target = false
uo_tree.of_node(/*keys*/ "system").ib_show_checkbox = false
// event ue_delete_requested of uo_tree : (string as_keys_json)
// Local variables
n_pbt_json lnv_json
string ls_keys[]
long ll_i

// Delete pressed : the tree removes nothing, your application decides
lnv_json.of_load(/*json*/ as_keys_json)
for ll_i = 1 to lnv_json.of_get_array(/*path*/ "", /*values*/ ls_keys)
    uo_tree.of_remove_node(/*keys*/ ls_keys[ll_i])
next
// event ue_copy of uo_tree : (string as_tsv)
// Ctrl+C : the nodes copied, ready for a spreadsheet
ClipBoard(as_tsv)

File rilasciati da Esplora risorse #

Con ib_allow_drop, l'albero accetta file trascinati da Esplora risorse di Windows su un nodo: il nodo sotto il cursore si illumina durante il trascinamento, ue_drop_files riceve il suo indirizzo e i percorsi completi. as_keys è vuoto per un rilascio accanto ai nodi, su un nodo disattivato o su un nodo il cui ib_drop_target vale false. ue_drag_enter e ue_drag_leave dicono che un trascinamento di file è entrato, poi è uscito senza rilasciare nulla.

// Files of the Explorer dropped on a folder of the tree
uo_tree.ib_allow_drop = true
// event ue_drop_files of uo_tree : (string as_keys, string as_files[])
// The folder under the cursor : your application copies the files there
if as_keys <> "" then wf_copy_files(as_files, uo_tree.of_get_field(/*keys*/ as_keys, /*field*/ "path"))

Colonne, ordinamento e disposizione #

of_add_column fa dell'albero una lista ad albero: la prima colonna porta l'albero (il suo titolo è is_tree_title), ogni colonna aggiunta mostra il campo della stessa chiave di ogni nodo — posto con of_set_field, o una colonna del DataStore. L'handle di una colonna (of_column) regola il suo titolo, la sua larghezza (0 = automatica), il suo allineamento, il suo formato (una maschera numerica come "#,##0.00" con i separatori della lingua di visualizzazione, o token di data per un valore "yyyy-mm-dd", quelli del datagrid), la sua visibilità e il suo posto. Un clic su un'intestazione ordina i fratelli di ogni livello — crescente, decrescente, poi l'ordine di aggiunta — e solleva ue_sort_changed; of_sort fa lo stesso dal codice. L'ordinamento cambia solo l'ordine mostrato: of_keys_at e le posizioni mantengono l'ordine di aggiunta. L'utente allarga una colonna dal bordo della sua intestazione e la sposta trascinando l'intestazione. Ciò che ha sistemato — larghezze, ordine, visibilità, ordinamento, nodi aperti — si legge con of_get_layout e si restituisce con of_set_layout; ue_layout_changed porta la disposizione intera dopo ogni gesto che la cambia, e quando il vostro codice scrive la larghezza, il posto o la visibilità di una colonna (ii_width, ii_index, ib_visible) e la disposizione cambia. Valori uguali mantengono l'ordine del modello, e l'ordinamento è rifatto quando la lingua di visualizzazione cambia. Rimuovere la colonna ordinata (of_remove_column, of_clear_columns) solleva ue_sort_changed con la chiave successiva dell'ordinamento — SORT_NONE quando era la sola —, poi ue_layout_changed. I cinque colori dell'handle di una colonna (il_accent, il_back_color, il_text_color, il_back_color_hover, il_text_color_hover) colorano la sua intestazione. Appena ci sono colonne, la colonna dell'albero resta bloccata nello scorrimento orizzontale. L'ordinamento può riguardare più chiavi: of_sort(as_sort) legge la sintassi del SetSort di un DataWindow («type A, text D», «text» essendo il testo dei nodi), of_sort(as_column, as_dir) accetta anche un campo che nessuna colonna mostra, e ue_sort_changed riceve l'ordinamento intero come terzo argomento. ib_parents_first mette a ogni livello i nodi che hanno (o promettono) figli prima delle foglie — le cartelle prima dei file — qualunque sia l'ordinamento. Una colonna non può prendere la chiave text, che indica il testo dei nodi (-5): of_sort("text", as_dir) ordina per esso, e of_sort accetta più spazi tra una colonna e la sua direzione, come SetSort.

// A tree list : the population of each country beside the tree
uo_tree.is_tree_title = "Country"
uo_tree.of_add_column(/*key*/ "population", /*title*/ "Population", /*width*/ 120)
uo_tree.of_column(/*key*/ "population").is_format = "#,##0"
uo_tree.of_column(/*key*/ "population").is_align = u_pbt_treeview.ALIGN_END
uo_tree.of_set_field(/*keys*/ "europe/france", /*field*/ "population", /*value*/ "68000000")

// The largest countries first, inside each continent
uo_tree.of_sort(/*column*/ "population", /*dir*/ u_pbt_treeview.SORT_DESC)
// The folders first, then by type and by name
uo_tree.ib_parents_first = true
uo_tree.of_sort(/*sort*/ "type A, text A")

Esportare l'albero con la sua gerarchia: of_export_csv(as_path) scrive un CSV (UTF-8, punto e virgola) in cui il testo di un nodo sta nella cella del suo livello — una cella più a destra per livello —, le colonne di una lista ad albero dopo il livello più profondo, prima una riga d'intestazione; of_export_xlsx(as_path) scrive una cartella di lavoro Excel in cui il testo è rientrato del suo livello e ogni ramo raggruppato sotto il suo genitore, ripiegabile in Excel, i numeri restando numeri. is_export_scope dice quali nodi: EXPORT_ALL (il predefinito) tutti i nodi, rami chiusi compresi, EXPORT_SHOWN le righe sullo schermo. L'albero costruisce il file, la DLL lo scrive, ue_csv_saved / ue_xlsx_saved confermano; rifiutato in modalità demo.

// The tree written to Excel - every node, the closed branches too ; ue_xlsx_saved confirms
uo_tree.is_export_scope = u_pbt_treeview.EXPORT_ALL
uo_tree.of_export_xlsx(/*path*/ "C:\exports\countries.xlsx")

Totali per ramo #

Una colonna di una lista ad albero può mostrare, su ogni ramo, il totale di ciò che contiene: is_summary sul suo handle vale SUMMARY_SUM, SUMMARY_AVG, SUMMARY_MIN, SUMMARY_MAX o SUMMARY_COUNT (i valori non vuoti). Il calcolo scende fino alle foglie — una media è quella delle foglie, mai una media di medie — e il totale si scrive in grassetto, con is_format — un conteggio sempre come numero semplice. Un ramo che ha un valore proprio lo tiene e lo fa risalire, tranne con ib_summary_over_value sulla colonna. Contano solo i nodi che l'albero può disegnare (mai uno nascosto); con ib_summary_filtered, sul componente, solo ciò che la ricerca mostra. of_get_field restituisce il totale grezzo (un numero con il punto), un ordinamento su questa colonna usa i totali, e i totali seguono ogni aggiunta, rimozione o trascinamento. SUMMARY_MIN e SUMMARY_MAX confrontano anche date (yyyy-mm-dd, yyyy-mm-dd hh:mm:ss, hh:mm:ss), e una somma di interi resta esatta oltre 2^53.

// Each continent shows the sum of its countries, in bold
uo_tree.of_column(/*key*/ "population").is_summary = u_pbt_treeview.SUMMARY_SUM

// The total of Europe, read like a field
st_total.text = uo_tree.of_get_field(/*keys*/ "europe", /*field*/ "population")

Cercare #

is_filter mostra solo i nodi il cui testo contiene la ricerca (maiuscole ignorate), con i nodi che li contengono, aperti, e il testo trovato evidenziato. "" mostra tutto. Ciò che contiene una corrispondenza si mostra aperto senza cambiare ib_expanded, e gli chevron sono inerti durante la ricerca. Con ib_toolbar, una barra sopra l'albero porta un campo di ricerca (che scrive is_filter: una lettura lo restituisce subito), e i pulsanti Espandi tutto e Comprimi tutto. Esc nel campo svuota la ricerca, Freccia giù passa all'albero, Invio e F3 vanno alla corrispondenza successiva (Maiusc: alla precedente) e il campo tiene la tastiera. Un nodo selezionato che la ricerca nasconde esce dalla selezione, e ue_selection_changed lo dice; il nodo che lo contiene non è selezionato al suo posto. of_select_node e of_scroll_to_node rifiutano un nodo che la ricerca esclude (-5). Per andare da una corrispondenza all'altra, of_search_next e of_search_prev selezionano la successiva o la precedente dopo il nodo del focus, in cerchio (F3 e Maiusc+F3 da tastiera), e of_match_count dice quante la ricerca ne ha trovate. of_find_node(as_field, as_value, as_after_keys) trova senza filtrare: l'indirizzo del primo nodo il cui campo ("" = il suo testo) vale esattamente il valore, nell'ordine che l'albero mostra, rami chiusi compresi; ridate l'indirizzo trovato per il successivo. In SELECT_NONE, of_search_next e of_search_prev vi spostano il focus, come F3. of_find_node parte dopo il posto di as_after_keys nell'ordine mostrato — anche un nodo nascosto; uno sconosciuto restituisce "" e of_get_last_error lo dice. of_find_nodes(as_field, as_value) restituisce tutte le corrispondenze in una volta, come array JSON nell'ordine mostrato.

La ricerca ignora gli accenti per impostazione predefinita, come l'ordinamento: «montreal» trova «Montréal», e la I con il punto del turco conta come una I («izmir» trova «İzmir»); ib_filter_accents = true li fa contare. In selezione multipla, Ctrl+A seleziona tutti i nodi mostrati (una sola domanda con ib_veto_selection).

// A search field above the tree, and a first search from the code
uo_tree.ib_toolbar = true
uo_tree.is_filter = "par"
// Local variables
string ls_keys

// The first node whose code is FR, selected if there is one
ls_keys = uo_tree.of_find_node(/*field*/ "code", /*value*/ "FR", /*after_keys*/ "")
if ls_keys <> "" then uo_tree.of_select_node(/*keys*/ ls_keys)
// Every node whose status is late, selected at once (a multiple selection)
uo_tree.is_selection_mode = u_pbt_treeview.SELECT_MULTIPLE
uo_tree.of_select_nodes(/*keys_json*/ uo_tree.of_find_nodes(/*field*/ "status", /*value*/ "late"))

Da un DataStore #

of_from_datastore fa un nodo di ogni riga di una tabella gerarchica: la colonna ROLE_KEY dà la sua chiave (senza di essa, il RowID della riga), la colonna ROLE_PARENT nomina la chiave del nodo che lo contiene (vuota, sconosciuta, o un ciclo: in cima) — con una colonna ROLE_KEY, un valore di padre nomina una chiave, mai un RowID. Gli altri ruoli: il testo (ROLE_TEXT, mostrato come testo, mai come markup), l'immagine, la spunta, il badge e l'apertura al caricamento. Una colonna gioca un ruolo quando si chiama come lui (key, parent, text…) o quando of_map lo dice. Ogni colonna è un campo (of_get_field) — le colonne della lista non sono create per voi: of_add_column con il nome della colonna. Date e numeri sono letti qualunque siano le impostazioni regionali, in una sola forma: una data yyyy-mm-dd, una data-ora yyyy-mm-dd hh:mm:ss, un numero con il punto e senza zeri inutili (1234,50 diventa 1234.5) — una colonna decimale si formatta e si ordina come un numero. Due righe con la stessa chiave: la seconda prende "chiave~RowID". Ciò che il caricamento ha dovuto correggere (righe il cui padre manca, cicli spezzati, chiavi doppie, chiavi impossibili) è detto da of_get_last_error, il ritorno resta 0. of_reload_row rilegge una riga cambiata dal vostro codice e aggiorna il suo nodo sul posto; una riga la cui chiave o il cui padre è cambiato sposta il suo nodo. Il nodo di una riga rimosso da of_remove_node resta fuori fino al prossimo of_from_datastore; of_reload_row della sua riga lo riporta. Con ib_write_back, un testo rinominato è scritto nella colonna ROLE_TEXT e un nodo che cambia padre lo scrive nella colonna ROLE_PARENT (NULL in cima, qualunque sia il suo tipo; uno spostamento tra gli stessi fratelli non scrive nulla), prima dell'evento; un nodo di riga non va allora né sotto un nodo aggiunto a mano, né sotto una riga senza valore di chiave — la sua colonna padre non saprebbe dirlo. Un valore che il DataStore rifiuta, o un DataStore distrutto dopo il caricamento (no DataStore is bound), rimette a posto il nodo e solleva ue_write_back_failed. Senza ib_write_back, un trascinamento sposta solo il nodo: la sua riga mantiene ciò che dice il DataStore, e la rilettura successiva delle righe (of_map, is_group_by, of_reload_row, un nuovo caricamento) rimette il nodo dove dice la sua riga — il suo vecchio handle è liberato. L'Update resta vostro. L'handle di un nodo legge il numero della sua riga (of_row). of_from_datastore legge anche le righe di un DataWindow o di un DataWindowChild — quello che l'utente vede accanto: l'albero scrive allora in quello. Con ib_write_back, una spunta dell'utente si scrive anche nella colonna ROLE_CHECKED di ogni riga che ha cambiato — cascata compresa, e i rami sopra il cui stato passa a spuntato o non spuntato (un ramo che diventa misto mantiene il suo valore) —, scritta come la colonna la scrive già (1/0, Y/N, T/F, O/N, -1/0…; una colonna che mostra solo il suo no scrive il sì abituale: Y per N, 1 per 0 — O e -1 solo se la colonna ne contiene già uno); una colonna i cui valori non sono né un sì né un no è rifiutata, con il suo motivo. Ogni valore è giudicato prima e la scrittura è tutto o niente: un rifiuto rende le spunte del gesto e solleva ue_write_back_failed. of_row_keys restituisce l'indirizzo del nodo di una riga del DataStore principale: rimuovete il nodo prima di un DeleteRow. Ogni scrittura di ritorno è tutto o niente — ogni valore giudicato prima che uno sia scritto; una data-ora mantiene la sua ora, una colonna time si scrive, si legge e si raggruppa in hh:mm:ss. Uno spostamento scritto da of_move_node è giudicato di nuovo dopo ue_node_moving, e ciò che era scritto è rimesso se il nodo non si muove. Con ib_write_back, un nodo di riga il cui DataStore non ha una colonna ROLE_TEXT non si rinomina. Un nuovo caricamento libera solo gli handle di ciò che sostituisce: l'handle di un nodo aggiunto a mano, un handle inerte o preso a un indirizzo non ancora creato restano validi; of_from_datastore da una DataWindow verifica che i suoi dati si possano condividere (-5 con il motivo). Ciò che una rilettura delle righe ha dovuto correggere si conta in of_get_last_error — compresi i nodi aggiunti a mano risaliti in cima perché il loro gruppo non c'è più (lifted=N) e i lotti partiti con il loro nodo (lots=N); of_map e is_group_by lo dicono per tutte le fonti.

// The departments : each row names its parent by its id
ids_depts.Retrieve()
uo_tree.of_map(/*role*/ u_pbt_treeview.ROLE_KEY, /*column*/ "dept_id")
uo_tree.of_map(/*role*/ u_pbt_treeview.ROLE_PARENT, /*column*/ "parent_id")
uo_tree.of_map(/*role*/ u_pbt_treeview.ROLE_TEXT, /*column*/ "dept_name")
uo_tree.of_from_datastore(/*ads*/ ids_depts)

// Two columns of the DataStore shown beside the tree
uo_tree.of_add_column(/*key*/ "head_count", /*title*/ "Staff")
uo_tree.of_add_column(/*key*/ "budget", /*title*/ "Budget")
uo_tree.of_column(/*key*/ "budget").is_format = "#,##0"

// A renamed or moved department is written into its row before the event
uo_tree.ib_write_back = true
uo_tree.ib_editable = true
uo_tree.ib_drag_drop = true
// event ue_node_moved of uo_tree : (string as_keys, string as_old_keys, long al_position)
// parent_id is already written in the row : save it
if ids_depts.Update() = 1 then commit using sqlca;

Un ruolo si risolve per DataStore: la colonna che of_map(ads, as_role, as_column) ha dato a questo DataStore, altrimenti quella di of_map(as_role, as_column) quando questo DataStore la ha, altrimenti la colonna che porta il nome del ruolo. Un lotto di dipendenti sotto un albero di reparti non ha quindi bisogno di nessuna colonna dei reparti. Una tabella le cui radici portano 0 nella colonna padre (una colonna NOT NULL) lo dice con is_root_parent_value = "0" ("0|-1" per due valori): quelle righe stanno in cima senza contare come orfane, e un nodo spostato in cima con ib_write_back scrive 0 invece di NULL. Le colonne ROLE_STATE_IMAGE e ROLE_OVERLAY_IMAGE danno l'immagine di stato e l'immagine sovrapposta di un nodo, lette come ROLE_IMAGE.

// event ue_children_needed of uo_tree : (string as_keys)
// Local variables
datastore lds_staff
n_pbt_utils lnv_utils

// The employees of the department that opens, in a DataStore of their own
lds_staff = create datastore
lds_staff.DataObject = "d_staff"
lds_staff.SetTransObject(SQLCA)
lds_staff.Retrieve(lnv_utils.of_leaf(/*keys*/ as_keys))

// THEIR key and THEIR text : the departments keep dept_id and dept_name
uo_tree.of_map(/*ads*/ lds_staff, /*role*/ u_pbt_treeview.ROLE_KEY, /*column*/ "emp_id")
uo_tree.of_map(/*ads*/ lds_staff, /*role*/ u_pbt_treeview.ROLE_TEXT, /*column*/ "emp_name")
uo_tree.of_from_datastore(/*ads*/ lds_staff, /*parent_keys*/ as_keys)

// Kept while its nodes are shown ; the window destroys them when it closes
ids_lots[UpperBound(ids_lots) + 1] = lds_staff
// The roots of the table carry 0 in parent_id (a NOT NULL column) : 0 names the top
uo_tree.is_root_parent_value = "0"
uo_tree.of_from_datastore(/*ads*/ ids_depts)

Un albero raggruppato per colonne #

Lo stile TreeView di un DataWindow, senza DataWindow: is_group_by = "region|country|city" fa delle righe di of_from_datastore le foglie di gruppi costruiti sui valori di quelle colonne, un livello per colonna (ROLE_PARENT non ha alcun ruolo, ROLE_KEY nomina le foglie). La chiave di un gruppo è il suo valore (/, | e % scritti %2F, %7C, %25), il suo testo il valore scritto con il formato della colonna della stessa chiave, «(vuoto)» per un valore vuoto; l'handle di un nodo di gruppo legge of_group_column() e of_group_value(). Posto dopo un caricamento, raggruppa di nuovo; of_reload_row mette una riga il cui valore è cambiato nel suo nuovo gruppo. of_set_level_image dà un'immagine a tutti i nodi di un livello, of_expand_to_level apre l'albero fino a un livello, e is_summary dà i totali di ogni gruppo. Con ib_write_back, una foglia rilasciata sotto un gruppo dell'ultimo livello scrive tutte le sue colonne di gruppo prima dell'evento; altrove, e per un nodo di gruppo, lo spostamento è rifiutato. Il testo di un gruppo segue un formato impostato dopo il caricamento, l'arrivo della sua colonna e la lingua di visualizzazione; un valore che comincia con __ si scrive %5F_ nella chiave; of_group_value di una data-ora vale yyyy-mm-dd hh:mm:ss, di un'ora hh:mm:ss. Senza ib_write_back, una foglia trascinata sotto un altro gruppo torna nel suo al raggruppamento successivo, poiché la sua riga non è cambiata; un nodo aggiunto a mano sotto un gruppo che scompare risale in cima.

// The sales, one row per sale, grouped by region, country and city : the customer is
// the text of each sale
uo_tree.is_group_by = "region|country|city"
uo_tree.of_map(/*role*/ u_pbt_treeview.ROLE_TEXT, /*column*/ "customer")
uo_tree.of_from_datastore(/*ads*/ ids_sales)

// The amount of each sale, and the total of each group
uo_tree.of_add_column(/*key*/ "amount", /*title*/ "Amount")
uo_tree.of_column(/*key*/ "amount").is_format = "#,##0.00"
uo_tree.of_column(/*key*/ "amount").is_summary = u_pbt_treeview.SUMMARY_SUM

// A globe before every region ; only the regions show at first
uo_tree.of_set_level_image(/*level*/ 1, /*image*/ "mono:img\packimages.dll:svg/ribbon/globe", /*expanded_image*/ "")
uo_tree.of_expand_to_level(/*level*/ 1)

Proprietà #

ProprietàTipoPredefinitoRuolo
is_selection_modestringSELECT_SINGLECome l'utente seleziona: SELECT_SINGLE (un nodo), SELECT_MULTIPLE (Ctrl e Maiusc, come in Esplora risorse) o SELECT_NONE (la tastiera sposta solo un focus, nulla è selezionato). Un altro valore è rifiutato: il vecchio resta, of_get_last_error dice perché
ib_checkboxesbooleanfalseUna casella di spunta prima di ogni nodo
ib_check_cascadebooleantrueUna spunta dell'utente su un nodo spunta il suo sottoalbero, tranne un nodo disattivato e il suo sottoalbero; una spunta del codice spunta tutto. Un padre è lo stato dei figli che l'albero può disegnare: spuntato quando lo sono tutti, misto (CHECK_MIXED) quando lo è una parte. false: ogni nodo mantiene la propria spunta; una spunta dell'utente non tocca mai un nodo oltre il limite demo, né, con ib_write_back, un nodo nascosto
ib_editablebooleanfalseL'utente rinomina un nodo: F2, o un clic sul nodo già selezionato. Invio tiene, Esc ripristina (ue_node_edited); un testo svuotato è rifiutato
ib_drag_dropbooleanfalseL'utente trascina un nodo prima, dopo o dentro un altro (ue_node_moved); mai nel proprio sottoalbero; un rilascio sul quarto basso di un ramo aperto ne fa il primo figlio; la finestra che perde il focus durante un trascinamento lo annulla
ib_veto_changesbooleanfalsePorre ue_node_editing e ue_node_moving prima che un testo digitato sia tenuto o che un nodo si sposti — col gesto come con of_move_node (disattivato per default, come ogni evento annullabile)
is_filterstring""La ricerca: si mostrano solo i nodi il cui testo la contiene, con quelli che li contengono, aperti, il testo trovato evidenziato. "" mostra tutto. Anche il campo della barra degli strumenti la scrive: una lettura la restituisce subito; un nodo selezionato che nasconde esce dalla selezione (ue_selection_changed)
ib_toolbarbooleanfalseUna barra sopra l'albero: il campo di ricerca, Espandi tutto, Comprimi tutto
ib_show_linesbooleanfalseLinee sottili collegano ogni nodo al suo padre
ii_indentinteger18Il rientro di un livello, in pixel, da 8 a 64. Un altro valore è rifiutato: il vecchio resta, of_get_last_error dice perché
is_tree_titlestring""Il titolo della colonna dell'albero di una lista ad albero. Accetta il testo formattato con tag
ib_write_backbooleanfalseCon un albero alimentato da of_from_datastore: un testo rinominato è scritto nella colonna ROLE_TEXT, un nodo che cambia padre lo scrive nella colonna ROLE_PARENT (NULL in cima; uno spostamento tra gli stessi fratelli non scrive nulla), prima dell'evento. Un nodo di riga non va allora né sotto un nodo aggiunto a mano, né sotto una riga senza valore di chiave. Un valore rifiutato, o un DataStore distrutto, rimette a posto il nodo e solleva ue_write_back_failed. Senza di essa, un trascinamento sposta solo il nodo. L'Update resta vostro. Una spunta dell'utente si scrive anche nella colonna ROLE_CHECKED di ogni riga che cambia. Una spunta scrive anche i rami sopra il cui stato passa a spuntato o non spuntato; ogni valore è giudicato prima, tutto o niente; senza colonna ROLE_TEXT un nodo di riga non si rinomina
ib_enabledbooleantruefalse disattiva l'albero: i nodi restano visibili, più nulla risponde all'utente e l'albero esce dall'ordine del tasto Tab. Il vostro codice cambia sempre tutto; non prende più il focus
ib_veto_selectionbooleanfalseChiedere ue_selection_changing prima che la selezione cambi: una scelta dell'utente, of_select_node, of_clear_selection (disattivato per impostazione predefinita, come ogni evento annullabile)
ib_veto_togglebooleanfalseChiedere ue_node_toggling prima che un nodo si apra o si chiuda, da un gesto o dal codice
ib_single_expandbooleanfalseUn solo ramo aperto sotto ogni padre: aprire un nodo chiude i suoi fratelli aperti (ue_node_toggled per ciascuno, senza domanda); impostarlo non chiude nulla sul momento; of_expand_all e of_expand_to_level lo ignorano
ib_parents_firstbooleanfalseA ogni livello, i nodi che hanno (o promettono) figli prima delle foglie — le cartelle prima dei file —, qualunque sia l'ordinamento; un rilascio va allora solo dentro
ib_summary_filteredbooleanfalseI totali dei rami (is_summary di una colonna) contano solo ciò che la ricerca mostra; false: ogni nodo che l'albero può disegnare
is_group_bystring""Un albero raggruppato per colonne, come lo stile TreeView di un DataWindow: `"regioncountry" fa un livello di gruppi per colonna, le righe di of_from_datastore essendo le foglie sotto l'ultimo. Posto dopo un caricamento, raggruppa di nuovo; una colonna assente dal DataStore è ignorata. Ciò che un raggruppamento ha dovuto correggere, per tutte le fonti, si legge in of_get_last_error`
is_root_parent_valuestring""I valori di padre che nominano la cima dell'albero, uniti da ` ("0", "0-1"): una tale riga sta in cima senza contare come orfana, e un nodo spostato in cima con ib_write_back scrive il primo invece di NULL. ""`: solo un padre vuoto (NULL) nomina la cima
ib_filter_accentsbooleanfalsefalse: la ricerca (is_filter) ignora gli accenti, come l'ordinamento; true: contano
ib_auto_tooltipbooleantrueUn'etichetta tagliata dalla larghezza mostra il suo testo intero in un tooltip — mai sopra un tooltip che la vostra applicazione ha dato al nodo
is_export_scopestringEXPORT_ALLCiò che scrivono of_export_csv e of_export_xlsx: EXPORT_ALL tutti i nodi, rami chiusi compresi, EXPORT_SHOWN le righe sullo schermo. Un nodo nascosto non è mai scritto; un altro valore è rifiutato
ib_allow_dropbooleanfalseAccettare i file rilasciati da Esplora risorse su un nodo: il nodo sotto il cursore si illumina, ue_drop_files lo nomina con i percorsi completi
is_theme_stylestring""Stile visivo del componente (costanti THEME_STYLE_*); vuoto = quello dell'applicazione, seguito a ogni cambio
is_theme_modestring""Variante chiara o scura (costanti THEME_MODE_*); vuoto = quella dell'applicazione, seguita a ogni cambio
il_theme_accentlong-1Colore d'accento di questo componente (-1 = accento dell'applicazione, o quello del tema)
is_tooltipstring""Tooltip semplice mostrato al passaggio del mouse sul componente
is_super_tooltip_titlestring""Titolo del tooltip avanzato (prevale su is_tooltip)
is_super_tooltip_textstring""Testo del tooltip avanzato (markup avanzato accettato)
is_super_tooltip_imagestring""Immagine del tooltip avanzato

Proprietà di un nodo — n_pbt_treeview_node #

Il suo handle, tramite of_node(indirizzo). Una lettura chiede all'albero cosa sia il nodo ora. Il suo of_count() conta i suoi figli, il suo of_keys_at(n) restituisce l'indirizzo del suo n-esimo figlio (a partire da 1), il suo of_has(chiave) dice se ha quel figlio, il suo of_key() restituisce la sua chiave.

ProprietàTipoPredefinitoRuolo
is_textstring""Il testo del nodo. Accetta il testo formattato con tag. Vuoto, il nodo mostra la sua chiave
is_imagestring""L'immagine prima del testo: un file della postazione, una risorsa "file.dll:nome", un glifo "mono:…" / "tint:…" disegnato nel tema, un indirizzo https://. http:// è rifiutato (ue_image_failed, REASON_INSECURE)
is_expanded_imagestring""L'immagine quando il nodo è aperto (una cartella aperta); "" tiene is_image
is_state_imagestring""L'immagine di stato del nodo, prima della sua immagine: una bandierina, uno stato — la StatePicture di un TreeView PowerBuilder. Un clic su di essa solleva ue_state_clicked e non seleziona il nodo; stesse fonti e rifiuti di is_image
is_overlay_imagestring""Una piccola immagine disegnata sopra l'angolo inferiore dell'immagine del nodo (una freccia di collegamento, un lucchetto) — l'OverlayPicture di un TreeView PowerBuilder
is_selected_imagestring""L'immagine del nodo quando è selezionato — la SelectedPicture di un TreeView PowerBuilder. "" mantiene is_image
ib_expandedbooleanfalsetrue apre il nodo (i suoi figli si mostrano), false lo chiude; segue ue_node_toggled, come per un clic sul suo chevron. Un nodo senza figli si legge false; aprire un nodo che si limita a promettere figli li chiede (ue_children_needed); arrivano con la risposta, dopo il ritorno di questa riga; con ib_veto_toggle, ue_node_toggling è posto prima; rifiutato, nulla è inviato e of_get_last_error lo dice
ib_has_childrenbooleanfalseUna promessa di figli: lo chevron si mostra anche se nulla è ancora aggiunto. Aprire il nodo solleva ue_children_needed, dove la vostra applicazione li aggiunge. La promessa vale fino alla risposta, anche se vi è stato aggiunto o rilasciato un nodo; rimetterla a true la fa richiedere alla prossima apertura
ib_checkedbooleanfalseLa spunta del nodo (ib_checkboxes dell'albero). Con ib_check_cascade, scriverla spunta tutto il sottoalbero (nodi disattivati compresi), e si legge true quando i suoi figli che l'albero può disegnare sono tutti spuntati (of_check_state dice misto); i figli ricevuti sotto una foglia spuntata prendono la sua spunta. Una spunta scritta dal vostro codice non solleva nulla
ib_enabledbooleantruefalse disattiva il nodo: l'utente non può né selezionarlo, né spuntarlo, né rinominarlo, né trascinarlo, nulla si rilascia sulla sua riga, la tastiera lo salta, e una spunta dell'utente su un padre lo lascia com'è, con il suo sottoalbero. Il vostro codice lo seleziona e lo spunta comunque
ib_visiblebooleantruefalse toglie dallo schermo il nodo e il suo sottoalbero; mantiene il suo indirizzo
is_badgestring""Un piccolo badge dopo il testo (markup accettato): un numero di elementi non letti; "" nessuno
ib_read_onlybooleanfalsetrue: l'utente non può né rinominarlo né trascinarlo (resta una destinazione), e Canc lo esclude; il vostro codice può sempre
ib_drop_targetbooleantruefalse: nulla viene rilasciato dentro di esso, né un nodo trascinato né un file di Esplora risorse; prima o dopo di esso resta permesso
ib_show_checkboxbooleantruefalse: nessuna casella su questo nodo (ib_checkboxes) — non conta per il padre, non è in of_checked_keys, e la cascata lo attraversa verso i figli
of_keys ( ) → string——Restituisce l'indirizzo del nodo: le sue chiavi unite da /
of_level ( ) → long——Restituisce la sua profondità: 1 per un nodo in cima, 2 per un nodo al suo interno… 0 quando l'albero non lo contiene
of_position ( ) → long——Restituisce il suo posto tra i figli del suo padre, a partire da 1, nell'ordine di aggiunta (un ordinamento cambia solo l'ordine mostrato); 0 quando l'albero non lo contiene
of_parent_keys ( ) → string——Restituisce l'indirizzo del suo padre; "" per un nodo in cima
of_check_state ( ) → string——Restituisce lo stato della sua casella: CHECK_ON, CHECK_OFF o CHECK_MIXED (una parte dei suoi figli spuntata, con ib_check_cascade); "" quando l'albero non lo contiene
of_row ( ) → long——Restituisce il numero di riga di oggi, nel DataStore di of_from_datastore, della riga da cui viene il nodo — qualunque chiave abbia dovuto prendere, e dopo un ordinamento o un filtro del DataStore. 0 per un nodo aggiunto a mano o la cui riga è sparita; un nodo di un lotto restituisce la sua riga nel suo DataStore, un nodo di gruppo 0; 0 anche quando il DataStore del suo lotto è stato ricaricato per un altro nodo
of_group_column ( ) → string——Per un nodo di gruppo di is_group_by: la colonna su cui raggruppa il suo livello ("region"); "" per ogni altro nodo
of_group_value ( ) → string——Per un nodo di gruppo: il valore della sua colonna che rappresenta, come le righe lo contengono (una data yyyy-mm-dd, un numero con il punto, "" per il gruppo dei valori vuoti); "" per ogni altro nodo; una data-ora yyyy-mm-dd hh:mm:ss, un'ora hh:mm:ss
is_tooltipstring""Tooltip semplice mostrato al passaggio del mouse sull'item
is_super_tooltip_titlestring""Titolo del tooltip avanzato dell'item (prevale su is_tooltip)
is_super_tooltip_textstring""Testo del tooltip avanzato dell'item (markup avanzato accettato)
is_super_tooltip_imagestring""Immagine del tooltip avanzato dell'item
il_accentlong-1Accento del nodo: la sua selezione (finché l'albero ha il focus) e la sua casella spuntata lo prendono; il badge mantiene il colore del tema (-1 = quello del componente)
il_back_colorlong-1Sfondo della riga del nodo, in RGB(r,g,b) (-1 = quello che dà il tema). Una riga selezionata prende i colori della selezione
il_text_colorlong-1Colore del testo della riga del nodo (-1 = quello che dà il tema)
il_back_color_hoverlong-1Sfondo della riga del nodo sotto il puntatore (-1 = quello che dà il tema)
il_text_color_hoverlong-1Colore del testo della riga del nodo sotto il puntatore (-1 = quello che dà il tema)

Proprietà di una colonna — n_pbt_treeview_column #

Il suo handle, tramite of_column(chiave). Un valore scritto dal vostro codice è muto, come SetItem — tranne la sua disposizione: ii_width, ii_index e ib_visible scritti dal vostro codice sollevano ue_layout_changed quando la disposizione cambia, come un gesto. Una lettura restituisce ciò che l'utente può aver cambiato (larghezza, posto).

ProprietàTipoPredefinitoRuolo
is_titlestring""Il titolo nell'intestazione (markup accettato); "" mostra la chiave
ii_widthinteger0La larghezza in pixel: 0 è automatica (larga quanto il titolo e i valori disegnati), altrimenti da 40 a 2000. L'utente trascina il bordo dell'intestazione: una lettura la restituisce subito
is_alignstringALIGN_STARTDove stanno i valori nelle loro celle: ALIGN_START, ALIGN_CENTER, ALIGN_END — l'inizio e la fine della lettura, che seguono un'applicazione da destra a sinistra. Un altro valore è rifiutato
is_formatstring""Come un valore è scritto: una maschera numerica per un numero ("#,##0.00", separatori della lingua di visualizzazione), i token di data di un formato di visualizzazione PowerBuilder per una data o una data-ora ("dd/mm/yyyy", "d mmm yyyy hh:mm" — mm dopo un'ora sono i minuti —, AM/PM, s, f, letterali "…", [shortdate], [longdate], [time]), gli stessi del datagrid; "" scrive il valore così com'è
ib_visiblebooleantruefalse toglie la colonna dallo schermo; mantiene il suo posto e la sua chiave
ii_indexinteger—Il suo posto tra tutte le colonne, a partire da 1: scriverlo sposta la colonna. Anche l'utente trascina un'intestazione: una lettura lo restituisce subito
ib_sortablebooleantrueUn clic sulla sua intestazione ordina l'albero per questa colonna. L'intestazione della colonna dell'albero (is_tree_title) ordina sempre, per il testo dei nodi
is_summarystring""Il totale che ogni ramo mostra in questa colonna: SUMMARY_SUM, SUMMARY_AVG, SUMMARY_MIN, SUMMARY_MAX, SUMMARY_COUNT (i valori non vuoti), di ciò che portano i figli fino alle foglie, in grassetto; SUMMARY_NONE (""): nessuno. of_get_field legge il totale, un ordinamento lo usa; SUMMARY_COUNT si scrive come numero semplice, mai con is_format; SUMMARY_MIN e SUMMARY_MAX confrontano anche date
ib_summary_over_valuebooleanfalsefalse: un ramo che ha un valore proprio nella colonna lo tiene (e lo fa risalire); true: il totale prende il suo posto
il_accentlong-1Accento dell'intestazione: la sua freccia di ordinamento e l'anello della tastiera lo prendono (-1 = quello del componente)
il_back_colorlong-1Sfondo dell'intestazione, in RGB(r,g,b) (-1 = ciò che dà il tema)
il_text_colorlong-1Colore del testo dell'intestazione (-1 = ciò che dà il tema)
il_back_color_hoverlong-1Sfondo dell'intestazione sotto il puntatore (-1 = ciò che dà il tema)
il_text_color_hoverlong-1Colore del testo dell'intestazione sotto il puntatore (-1 = ciò che dà il tema)
is_tooltipstring""Tooltip semplice mostrato al passaggio del mouse sull'intestazione della colonna
is_super_tooltip_titlestring""Titolo del tooltip avanzato dell'intestazione (prevale su is_tooltip)
is_super_tooltip_textstring""Testo del tooltip avanzato dell'intestazione (markup avanzato accettato)
is_super_tooltip_imagestring""Immagine del tooltip avanzato dell'intestazione

Costanti #

Vivono su u_pbt_treeview: u_pbt_treeview.CHECK_MIXED.

CostanteValoreSignificato
SUMMARY_NONE""Nessun totale — il predefinito
SUMMARY_SUM"sum"La somma
SUMMARY_AVG"avg"La media delle foglie
SUMMARY_MIN"min"Il valore più piccolo
SUMMARY_MAX"max"Il valore più grande
SUMMARY_COUNT"count"Il numero di valori non vuoti
SELECT_SINGLE"single"Un nodo selezionato alla volta — il predefinito
SELECT_MULTIPLE"multiple"Più nodi, con Ctrl e Maiusc
SELECT_NONE"none"Nessuno: si sposta solo un focus
SORT_ASC"asc"Crescente
SORT_DESC"desc"Decrescente
SORT_NONE"none"Nessun ordinamento: l'ordine di aggiunta
CHECK_ON"on"Spuntato (con la cascata: tutto il sottoalbero)
CHECK_OFF"off"Non spuntato
CHECK_MIXED"mixed"Una parte dei figli spuntata
ALIGN_START"start"All'inizio della lettura — il predefinito
ALIGN_CENTER"center"Al centro
ALIGN_END"end"Alla fine della lettura (i numeri)
ROLE_KEY"key"La chiave del nodo (un identificativo); senza di essa, il RowID
ROLE_PARENT"parent"La chiave del nodo che lo contiene; con una colonna ROLE_KEY, mai un RowID
ROLE_TEXT"text"Il suo testo (mostrato come testo)
ROLE_IMAGE"image"La sua immagine
ROLE_CHECKED"checked"Spuntato quando il valore dice sì (1, -1, true, y, yes, on, t, o; no: 0, false, n, no, off, f, maiuscole ignorate); riscritto come la colonna lo scrive già; sotto la cascata, letto solo per una foglia: un padre vi è lo stato dei suoi figli
ROLE_BADGE"badge"Il suo badge
ROLE_EXPANDED"expanded"Aperto al caricamento quando il valore dice sì
ROLE_HAS_CHILDREN"has_children"La riga promette figli quando il valore dice sì: un chevron, e ue_children_needed all'apertura del nodo; letto una volta, alla creazione del nodo
ROLE_STATE_IMAGE"state_image"La sua immagine di stato
ROLE_OVERLAY_IMAGE"overlay_image"La sua immagine sovrapposta
EXPORT_ALL"all"Esportazione: tutti i nodi, rami chiusi compresi — il predefinito
EXPORT_SHOWN"shown"Esportazione: le righe sullo schermo
REASON_INSECURE"insecure"Un indirizzo http://
REASON_NOT_FOUND"notfound"Un file non trovato
REASON_UNC"unc"Un percorso di rete venuto da una colonna di DataStore, rifiutato prima di ogni richiesta

Metodi #

MetodoRuolo
of_add_node (string as_keys, string as_text)Aggiunge un nodo al suo indirizzo, alla fine del suo padre: "europe" in cima, "europe/france" dentro "europe" (aggiunto prima). as_text accetta il markup ("" mostra la chiave). Restituisce 0 una volta aggiunto, -5 per un indirizzo con un livello vuoto, una chiave con ` o che comincia con __, un indirizzo già preso, un padre sconosciuto (of_get_last_error dice quale), -2` quando il componente non è creato
of_add_node (string as_keys, string as_text, string as_image)Lo stesso con la sua immagine (is_image dell'handle). Restituisce 0 una volta aggiunto, -5 come sopra, -2 quando il componente non è creato
of_insert_node (string as_keys, string as_text, string as_image, long al_position)Aggiunge un nodo a un posto tra i figli del suo padre, a partire da 1 (oltre l'ultimo: alla fine). Restituisce 0 una volta aggiunto, -5 come of_add_node, -2 quando il componente non è creato
of_remove_node (string as_keys)Rimuove un nodo e tutto ciò che contiene (i loro handle sono liberati). Rimuovere il nodo selezionato passa la selezione a ciò che lo conteneva (ue_selection_changed). Il nodo di una riga di DataStore resta fuori fino al prossimo of_from_datastore: né of_map né la rilettura di un'altra riga lo riportano, of_reload_row della sua riga sì. Restituisce 0 una volta rimosso, -5 per un indirizzo che l'albero non contiene, -2 quando il componente non è creato
of_move_node (string as_keys, string as_to_parent_keys, long al_position)Sposta un nodo con il suo sottoalbero sotto un altro padre ("" = in cima), a un posto a partire da 1 (oltre l'ultimo: alla fine) — o a un altro posto tra i suoi fratelli. Il suo indirizzo cambia: gli handle presi al vecchio indirizzo sono liberati da questa chiamata, subito; un handle preso poi al nuovo resta valido (uno spostamento tra gli stessi fratelli non libera nulla). Con ib_veto_changes, ue_node_moving è posto prima, con il posto finale; con ib_write_back, un nodo di riga che cambia padre lo scrive prima di muoversi (uno spostamento tra gli stessi fratelli non scrive nulla). Segue ue_node_moved, come per un trascinamento. Ciò che scrive è giudicato di nuovo dopo ue_node_moving; se il nodo non si muove, ciò che era scritto è rimesso. Restituisce 0 (anche quando è già lì: nulla è chiesto, scritto né sollevato), -4 se l'applicazione rifiuta o se il DataStore rifiuta il valore (ue_write_back_failed), -5 per un nodo o un padre sconosciuto, uno spostamento nel proprio sottoalbero, una chiave già presa sotto il nuovo padre, con ib_write_back un nodo di riga sotto un nodo aggiunto a mano o sotto una riga senza valore di chiave, un nodo di un lotto fuori dal suo lotto o il cui DataStore è stato ricaricato per un altro nodo, una foglia di un albero raggruppato altrove che sotto un gruppo dell'ultimo livello, un nodo di gruppo, un nodo che si è spostato o è sparito durante ue_node_moving, -2 quando il componente non è creato
of_clear ( )Svuota l'albero: nodi, handle e righe lette (il DataStore resta legato per un nuovo of_from_datastore); le colonne e le opzioni restano. Segue ue_selection_changed se c'erano nodi selezionati. Le colonne mantengono i loro colori e tooltip. Anche le immagini dei livelli (of_set_level_image) restano. Restituisce 0 una volta applicato, -2 quando il componente non è creato
of_node (string as_keys)L'handle n_pbt_treeview_node di un nodo, tramite il suo indirizzo (creato al primo accesso): il suo testo, immagine, spunta, stati, colori e tooltip; un indirizzo impossibile (livello vuoto, `, __`) restituisce un handle inerte, che non legge né scrive nulla
of_edit_node (string as_keys)Apre il testo di un nodo in modifica dal vostro codice — l'EditLabel di un TreeView PowerBuilder. Il nodo viene prima selezionato (in SELECT_NONE, solo portato in vista), poi il campo si apre; la fine è dell'utente (Invio: ue_node_editing, poi ue_node_edited; Esc o of_cancel_edit ripristina il testo). Funziona con ib_editable = false, su un nodo di sola lettura o disattivato. Restituisce 0 una volta aperto il campo, -5 per un nodo che l'albero non tiene o non può disegnare, un albero disattivato, un nodo di gruppo di is_group_by o una riga il cui DataStore non ha una colonna ROLE_TEXT con ib_write_back (of_get_last_error dice quale), -4 quando ue_selection_changing (o ue_node_toggling) ha rifiutato, -2 quando il componente non è creato
of_cancel_edit ( )Chiude il campo di una modifica in corso (aperta dall'utente o da of_edit_node) e ripristina il testo, come Esc: nulla viene sollevato. Restituisce 0 una volta applicato (nessuna modifica in corso: 0, nulla cambia), -2 quando il componente non è creato
of_expand_all ( )Apre tutti i nodi che hanno figli (un ramo solo promesso resta chiuso: nulla è chiesto). Segue ue_node_toggled per ciascuno, poi ue_layout_changed una volta. Restituisce 0 una volta applicato, -4 quando ue_node_toggling ne ha rifiutati, -2 quando il componente non è creato
of_collapse_all ( )Chiude tutti i nodi. Segue ue_node_toggled per ciascuno di quelli che erano aperti, poi ue_layout_changed una volta. Restituisce 0 una volta applicato, -4 quando ue_node_toggling ne ha rifiutati, -2 quando il componente non è creato
of_expand_all (string as_keys)Apre un nodo e ogni nodo sotto di esso che ha figli (l'ExpandAll(handle) di PowerBuilder); "" = tutto l'albero. Restituisce 0 una volta applicato, -4 quando ue_node_toggling ne ha rifiutati, -5 per un nodo che l'albero non contiene, -2 quando il componente non è creato
of_collapse_all (string as_keys)Chiude un nodo e ogni nodo sotto di esso; "" = tutto l'albero. Restituisce 0 una volta applicato, -4 quando ue_node_toggling ne ha rifiutati, -5 per un nodo che l'albero non contiene, -2 quando il componente non è creato
of_expand_to_level (long al_level)Mostra l'albero fino a un livello: i livelli sopra al_level si aprono, questo livello e i successivi si chiudono (1: si vede solo la cima). Un ramo la cui promessa non ha avuto risposta resta chiuso. ue_node_toggled per ogni nodo cambiato, poi ue_layout_changed. Restituisce 0 una volta applicato, -4 quando ue_node_toggling ne ha rifiutati, -5 per un livello sotto 1, -2 quando il componente non è creato
of_set_level_image (integer ai_level, string as_image, string as_expanded_image)L'immagine di ogni nodo di un livello (1 = la cima) che non ne ha una propria — il SetLevelPictures di PowerBuilder, comodo per un albero raggruppato: as_image, e as_expanded_image mentre il nodo è aperto ("" mantiene as_image). Due "" tolgono le immagini del livello. Restituisce 0 una volta impostato, -5 per un livello sotto 1, -2 quando il componente non è creato
of_clear_children (string as_keys)Rimuove i figli di un nodo (i loro handle sono liberati; un nodo di riga resta fuori fino al prossimo of_from_datastore) e mantiene il nodo, che promette di nuovo: la sua prossima apertura solleva ue_children_needed — l'«aggiorna» di una cartella. Aperto, si chiude (ue_node_toggled). Chiude senza chiedere ue_node_toggling, e segue ue_layout_changed. Restituisce 0 una volta applicato, -5 per un nodo che l'albero non contiene, -2 quando il componente non è creato
of_scroll_to_node (string as_keys)Mostra un nodo: ciò che lo contiene si apre (ue_node_toggled per ciascuno, dal più esterno), poi l'albero scorre finché non è in vista. La selezione non cambia. Un nodo che l'albero non potrebbe disegnare è rifiutato prima che qualcosa si apra. Restituisce 0 una volta applicato, -5 per un nodo che l'albero non contiene o non disegna (nascosto o contenuto in un nascosto, oltre il limite demo, escluso dalla ricerca; of_get_last_error dice quale), -4 se ue_node_toggling rifiuta di aprire un nodo che lo contiene (ib_veto_toggle), -2 quando il componente non è creato
of_select_node (string as_keys)Seleziona un nodo da solo, come un clic: ciò che lo contiene si apre (un ramo promesso pone la sua domanda), il focus va su di lui ed entra in vista; segue ue_selection_changed (già selezionato da solo: nulla è sollevato). Anche un nodo disattivato viene selezionato: il disattivato ferma l'utente, non il vostro codice. Il nodo è giudicato prima: un albero apre per selezionare, come il TreeView di Windows, ma nulla si apre per un nodo rifiutato. Con i due veti, si chiedono prima le aperture (ue_node_toggling), poi la selezione (ue_selection_changing). Restituisce 0 una volta selezionato, -5 per un nodo che l'albero non contiene o non disegna (nascosto o contenuto in un nascosto, oltre il limite demo, escluso dalla ricerca; of_get_last_error dice quale), o quando is_selection_mode vale SELECT_NONE, -4 se ue_selection_changing rifiuta la selezione (ib_veto_selection) o ue_node_toggling un nodo da aprire (ib_veto_toggle), -2 quando il componente non è creato
of_select_nodes (string as_keys_json)Seleziona più nodi in una volta — il corrispettivo di of_selected_keys: as_keys_json è un array JSON di indirizzi, in qualsiasi ordine (["europe/france","asia"], lo stesso indirizzo due volte conta una volta). Ogni nodo è giudicato prima (presente, e disegnabile una volta aperto ciò che lo contiene); poi ciò che li contiene si apre, il focus e l'ancora vanno all'ultimo indirizzo nominato, e ue_selection_changed segue una volta. Con ib_veto_toggle, ue_node_toggling è chiesto per ogni nodo che apre, poi con ib_veto_selection ue_selection_changing una volta per tutta la selezione. "[]" non lascia nulla selezionato; in SELECT_SINGLE, un indirizzo al massimo. Restituisce 0 una volta selezionati (anche quando quella selezione c'è già: nulla è sollevato), -4 rifiutato, -5 per un testo che non è un array JSON di indirizzi, un indirizzo che l'albero non contiene o non disegna (of_get_last_error dice quale), più di un indirizzo in SELECT_SINGLE, o SELECT_NONE, -2 quando il componente non è creato
of_clear_selection ( )Non lascia nessun nodo selezionato: segue ue_selection_changed("[]") (già nulla selezionato: nulla è sollevato). Restituisce 0 una volta applicato, -4 se ue_selection_changing rifiuta, -2 quando il componente non è creato
of_selected_key ( )L'indirizzo del nodo selezionato (quello con il focus quando ce ne sono più); altrimenti "". Letto in diretta
of_selected_keys ( )Gli indirizzi di tutti i nodi selezionati, in un array JSON nell'ordine dell'albero: ["europe/france","asia"]; "[]" se nessuno. Letto in diretta; si legge con n_pbt_json
of_checked_keys ( )Gli indirizzi di tutti i nodi spuntati, in un array JSON nell'ordine dell'albero. Con ib_check_cascade, un nodo il cui sottoalbero è tutto spuntato ne fa parte, un nodo misto no. Letto in diretta
of_check_all (boolean ab_checked)Spunta (o toglie la spunta a) tutti i nodi in una volta. Una spunta scritta dal codice è un valore: nulla è sollevato. Restituisce 0 una volta applicato, -2 quando il componente non è creato
of_sort (string as_column, string as_dir)Ordina i nodi mostrati, a ogni livello: per una colonna (la sua chiave) o per il testo dei nodi (as_column = ""). as_dir: SORT_ASC, SORT_DESC o SORT_NONE (l'ordine di aggiunta). L'ordine del modello (of_keys_at, of_position) non cambia. Seguono ue_sort_changed poi ue_layout_changed, come per un clic su un'intestazione. as_column può anche nominare un campo che nessuna colonna mostra; una colonna riassunta ordina sui suoi totali, e con ib_parents_first i rami restano prima delle foglie. as_column "text" è il testo dei nodi, come "". Restituisce 0 una volta applicato (anche quando l'ordinamento è già quello: nulla è sollevato), -5 per un nome che non lo è (lettere, cifre e _) o una direzione sconosciuta, -2 quando il componente non è creato
of_sort (string as_sort)Ordina su più chiavi, nel loro ordine: la prima decide, le successive spareggiano. as_sort si scrive come lo legge il SetSort di un DataWindow — "type A, text D" (anche asc e desc, senza direzione = crescente, text = il testo dei nodi, ogni altro nome una colonna o un campo); "" toglie l'ordinamento. Seguono ue_sort_changed poi ue_layout_changed. Più spazi tra una colonna e la sua direzione sono accettati, come da SetSort. Restituisce 0 una volta ordinato (anche quando è già quell'ordinamento: nulla è sollevato), -5 per un nome che non lo è, un'altra direzione o una chiave nominata due volte, -2 quando il componente non è creato
of_find_node (string as_field, string as_value, string as_after_keys)L'indirizzo del primo nodo il cui campo vale esattamente as_value (le maiuscole contano): as_field "" = il testo del nodo, ogni altro nome un campo (vostro, una colonna del DataStore, il totale di una colonna riassunta). Nell'ordine che l'albero mostra, rami chiusi e nodi esclusi dalla ricerca compresi, mai un nodo nascosto; as_after_keys "" parte dal primo, altrimenti dopo quel nodo: ridate l'indirizzo trovato per il successivo. "" quando non ce n'è (of_get_last_error dice perché quando gli argomenti sono rifiutati). Parte dopo il posto di as_after_keys nell'ordine mostrato — anche un nodo nascosto; un as_after_keys sconosciuto, o una chiamata durante un'attesa, restituisce "" e of_get_last_error dice perché (questa lettura lo svuota prima). of_find_nodes li restituisce tutti in una volta
of_find_nodes (string as_field, string as_value)Tutti i nodi il cui campo vale esattamente as_value (le maiuscole contano), in una passata: i loro indirizzi in un array JSON, nell'ordine che l'albero mostra (["europe/france","asia"]); "[]" se nessuno. as_field "" è il testo del nodo, ogni altro nome un campo. I rami chiusi e i nodi che la ricerca esclude sono percorsi, mai un nodo nascosto (né, in modalità demo, un nodo oltre il limite). "[]" con of_get_last_error quando il nome di campo non lo è o durante un'attesa. Leggetelo con n_pbt_json
of_search_next ( )Seleziona il nodo successivo che la ricerca ha trovato (is_filter), dopo il nodo del focus, in cerchio; F3 fa lo stesso. Come of_select_node: segue ue_selection_changed, e con ib_veto_selection è posto prima ue_selection_changing. In SELECT_NONE, vi sposta il focus e restituisce 0; durante un'attesa, restituisce -5 e of_get_last_error dice perché. Restituisce 0 una volta selezionato, -4 rifiutato, -5 senza ricerca o senza corrispondenze, -2 quando il componente non è creato
of_search_prev ( )Seleziona il nodo precedente che la ricerca ha trovato, prima del nodo del focus, in cerchio; Maiusc+F3 fa lo stesso. In SELECT_NONE, vi sposta il focus e restituisce 0; durante un'attesa, restituisce -5 e of_get_last_error dice perché. Restituisce 0 una volta selezionato, -4 rifiutato, -5 senza ricerca o senza corrispondenze, -2 quando il componente non è creato
of_match_count ( )Restituisce quanti nodi la ricerca (is_filter) ha trovato, letto subito; 0 senza ricerca
of_add_column (string as_key, string as_title)Aggiunge una colonna alla fine: l'albero diventa una lista ad albero, la prima colonna porta l'albero, questa mostra il campo della stessa chiave di ogni nodo (of_set_field, o la colonna del DataStore). La sua larghezza è automatica. La chiave text è rifiutata (-5): indica il testo dei nodi. Restituisce 0 una volta aggiunta, -5 per una chiave che non può esserlo (vuota, con / o `, che comincia con __) o una colonna già presente, -2` quando il componente non è creato
of_add_column (string as_key, string as_title, integer ai_width)Lo stesso con una larghezza in pixel (0 = automatica; da 40 a 2000). Restituisce 0 una volta aggiunta, -5 come sopra, -2 quando il componente non è creato
of_remove_column (string as_key)Rimuove una colonna (il suo handle è liberato); partita l'ultima, la lista torna un albero. Rimuovere la colonna ordinata solleva ue_sort_changed con la chiave successiva dell'ordinamento — SORT_NONE quando era la sola —, poi ue_layout_changed. Restituisce 0 una volta rimossa, -5 per una colonna che la lista non contiene, -2 quando il componente non è creato
of_clear_columns ( )Rimuove tutte le colonne (i loro handle sono liberati): la lista torna un albero. Rimuovere la colonna ordinata solleva ue_sort_changed con la chiave successiva dell'ordinamento — SORT_NONE quando era la sola —, poi ue_layout_changed. Restituisce 0 una volta applicato, -2 quando il componente non è creato
of_column (string as_key)L'handle n_pbt_treeview_column di una colonna (creato al primo accesso): il suo titolo, larghezza, allineamento, formato, visibilità, posto e se un clic sulla sua intestazione ordina
of_set_field (string as_keys, string as_field, string as_value)Dà a un nodo un campo vostro: of_set_field("europe/france", "population", "68000000"); la colonna di chiave population lo mostra. Un nodo di un DataStore ha già ogni colonna come campo; un vostro campo con lo stesso nome prevale. Un nome di campo: lettere, cifre e _, senza cifra iniziale. Restituisce 0 una volta impostato, -5 per un nodo sconosciuto o un nome non valido, -2 quando il componente non è creato
of_get_field (string as_keys, string as_field)Legge un campo di un nodo, in diretta: uno dei vostri (of_set_field), una colonna del DataStore da cui viene, o un campo integrato (key, keys, text, badge, level, position, count, image). "" quando non ne ha; per una colonna riassunta (is_summary), il totale grezzo del ramo, un numero con il punto; il campo integrato count conta i figli che l'albero può disegnare
of_from_datastore (datastore ads)Alimenta l'albero da un DataStore: una riga = un nodo (vedi sopra). I nodi di un caricamento precedente se ne vanno (i loro handle sono liberati); i nodi aggiunti a mano in cima restano, anche i loro handle. Due righe con la stessa chiave: la seconda prende "chiave~RowID"; una chiave impossibile (con / o `, o che comincia con __): il RowID — i suoi figli la ritrovano comunque dal suo valore. Con una colonna ROLE_KEY, un valore di padre nomina una chiave, mai un RowID. Date e numeri sono letti qualunque siano le impostazioni regionali (data yyyy-mm-dd, hh:mm:ss, numero con il punto). Ciò che il caricamento ha dovuto correggere (padri mancanti, cicli, chiavi doppie o impossibili) è detto da of_get_last_error, il ritorno resta 0. Con is_group_by, le righe sono le foglie di gruppi (ROLE_PARENT non ha alcun ruolo). Un nuovo caricamento porta via i lotti appesi sotto le sue righe e mantiene quelli appesi sotto un nodo aggiunto a mano. Un nuovo caricamento libera solo gli handle di ciò che sostituisce (un nodo aggiunto a mano, un handle inerte, un indirizzo non ancora creato mantengono il loro); un nodo di riga spostato senza ib_write_back torna al posto che dice la sua riga. Il rapporto di of_get_last_error conta anche i nodi aggiunti a mano risaliti in cima (lifted=N) e i lotti partiti con il loro nodo (lots=N). Restituisce 0 una volta caricato, -5 quando il DataStore non è valido, non ha alcuna colonna o manca di una colonna nominata da of_map (of_get_last_error la nomina), -2` quando il componente non è creato
of_from_datastore (datawindow adw)Lo stesso dalle righe di un DataWindow: l'albero riscrive in questo DataWindow (ib_write_back), quello che l'utente vede accanto. I suoi dati sono condivisi con un DataStore di passaggio: una DataWindow che non può condividerli è rifiutata (-5, con il motivo). Restituisce 0 una volta caricato, -5 come sopra, -2 quando il componente non è creato
of_from_datastore (datawindowchild adwc)Lo stesso dalle righe di un DataWindowChild (un DataWindow a discesa, un report annidato): l'albero vi riscrive. Restituisce 0 una volta caricato, -5 come sopra, -2 quando il componente non è creato
of_from_datastore (datastore ads, string as_parent_keys)Un lotto: le righe di un DataStore diventano i figli del nodo as_parent_keys, il resto dell'albero non si muove — ciò che ue_children_needed fa con una sola chiamata. Un ruolo si risolve per ogni DataStore: la colonna di of_map(ads, …) per questo, altrimenti quella di of_map quando la ha, altrimenti la colonna che porta il nome del ruolo; ROLE_PARENT nomina una riga dello stesso lotto (vuoto o sconosciuto: il nodo stesso). Lo stesso DataStore ridato sotto lo stesso nodo sostituisce il suo lotto (i suoi handle sono liberati), un altro aggiunge il proprio; of_row di un nodo del lotto è la sua riga in questo DataStore, e ib_write_back vi scrive. Una chiave già presa sotto il nodo prende "chiave~RowID". Un DataStore per lotto: ricaricato per un altro nodo (Reset, Retrieve — PowerBuilder ridà gli stessi RowID), porta le sue righe al nuovo lotto, e i nodi del lotto precedente mantengono ciò che mostrano senza riga (of_row 0, uno spostamento dal codice -5, una scrittura rifiutata con ue_write_back_failed; il caricamento conta stale=N). Per aggiornare un lotto da un altro oggetto DataStore, prima of_clear_children. Restituisce 0 una volta caricato, -5 quando il DataStore non è valido, non ha alcuna colonna, manca di una colonna nominata per lui da of_map(ads, …), o as_parent_keys è vuoto (la cima dell'albero è of_from_datastore(ads)) o non è un nodo dell'albero, -2 quando il componente non è creato
of_from_datastore (datawindow adw, string as_parent_keys)Un lotto dalle righe di un DataWindow (vedi sopra). Restituisce 0 una volta caricato, -5 come sopra, -2 quando il componente non è creato
of_from_datastore (datawindowchild adwc, string as_parent_keys)Un lotto dalle righe di un DataWindowChild. Restituisce 0 una volta caricato, -5 come sopra, -2 quando il componente non è creato
of_row_keys (long al_row)L'indirizzo del nodo di una riga del DataStore di of_from_datastore (quello principale, non un lotto), dal suo numero di riga di oggi: rimuovete il nodo (of_remove_node) prima del DeleteRow. "" quando la riga non ha nodo (rimosso, mai caricato, nessuna tale riga). "" anche una volta che il DataStore principale è stato ridato come lotto, fino al prossimo caricamento principale
of_map (string as_role, string as_column)Dà un ruolo (ROLE_KEY, ROLE_PARENT, ROLE_TEXT…) a una colonna del DataStore quando il suo nome non lo dice: of_map(ROLE_PARENT, "manager_id"). Il ruolo vale per ogni DataStore che ha quella colonna: un lotto letto da un DataStore che non la ha prende la colonna che porta il nome del ruolo, e of_map(ads, …) dà a un DataStore i suoi ruoli. Prima o dopo of_from_datastore: dopo, le righe sono rilette, e ciò che è stato posto sui nodi resta. "" come colonna restituisce il ruolo alla colonna che porta il suo nome. Un nuovo ROLE_KEY o ROLE_PARENT dà nuovi indirizzi: solo gli handle dei nodi il cui indirizzo è cambiato sono liberati, gli altri restano validi. I ruoli dati restano per i successivi of_from_datastore, anche dopo of_clear; solo of_reset li dimentica. La sua rilettura delle righe dice ciò che ha dovuto correggere, per tutte le fonti, in of_get_last_error. Restituisce 0 una volta impostato, -5 quando il ruolo non è una costante ROLE_ o la colonna non è del DataStore dell'ultimo of_from_datastore, -2 quando il componente non è creato
of_map (datastore ads, string as_role, string as_column)Dà un ruolo a una colonna solo per questo DataStore: il lotto dei reparti e quello dei dipendenti di uno stesso albero nominano ciascuno la loro chiave e il loro testo. Viene prima di of_map(as_role, as_column) per questo DataStore; "" restituisce il ruolo. Prima o dopo of_from_datastore: dopo, le righe sono rilette, ciò che è stato posto sui nodi resta. Restituisce 0 una volta impostato, -5 quando il DataStore non è valido, il ruolo non è una costante ROLE_ o il DataStore non ha tale colonna, -2 quando il componente non è creato
of_map (datawindow adw, string as_role, string as_column)Lo stesso per le righe di un DataWindow dato a of_from_datastore. Restituisce 0 una volta impostato, -5 per un argomento rifiutato, -2 quando il componente non è creato
of_map (datawindowchild adwc, string as_role, string as_column)Lo stesso per le righe di un DataWindowChild dato a of_from_datastore. Restituisce 0 una volta impostato, -5 per un argomento rifiutato, -2 quando il componente non è creato
of_reload_row (long al_row)Rimanda all'albero una riga del DataStore di of_from_datastore, letta ora: dopo che il vostro codice l'ha cambiata (SetItem, una finestra di modifica). al_row è il numero di riga di oggi; il nodo segue la riga sul posto: ciò che vi è stato posto (aperto, disattivato, visibile, campi, colori) resta, nulla è sollevato. Una riga la cui chiave o il cui padre è cambiato sposta il suo nodo (gli handle di ciò che si è spostato sono liberati, gli altri restano validi); una riga che l'albero non ha ancora (InsertRow) arriva anch'essa, al suo rango tra i fratelli; la riga di un nodo rimosso da of_remove_node ritorna. Ogni valore è scritto come lo scrive il caricamento. Solo il DataStore principale è riletto, non un lotto (ridatelo); in un albero raggruppato, una riga il cui valore di gruppo è cambiato va nel suo nuovo gruppo. Una volta che il DataStore principale è stato ridato come lotto, restituisce -5 fino al prossimo caricamento principale; una riga il cui padre o gruppo cambia sposta il suo nodo sul posto. Restituisce 0 una volta inviata, -5 quando nessun DataStore è collegato, l'albero è stato svuotato da of_clear dopo il caricamento, o la riga non esiste, -2 quando il componente non è creato
of_export_csv (string as_path)Scrive l'albero in un file CSV (UTF-8, punto e virgola) con la sua gerarchia: il testo di un nodo nella cella del suo livello, le colonne dopo il livello più profondo, prima una riga d'intestazione; un numero grezzo, con il separatore decimale della lingua di visualizzazione. is_export_scope dice quali nodi; ue_csv_saved conferma; un percorso relativo si scrive nella cartella di avvio dell'applicazione. Rifiutato in modalità demo. Restituisce 0 una volta richiesto, -5 quando il percorso è vuoto, -2 quando il componente non è creato
of_export_xlsx (string as_path)Scrive l'albero in una cartella di lavoro Excel (.xlsx): il testo di un nodo nella prima colonna, rientrato del suo livello e raggruppato sotto il suo genitore (i livelli di struttura di Excel: ogni ramo si piega con il + / - del margine, fino a 7 livelli, tutto scritto aperto), le colonne dopo, i numeri restando numeri (con il formato della loro colonna quando è una maschera numerica). is_export_scope dice quali nodi; ue_xlsx_saved conferma. Rifiutato in modalità demo. Restituisce 0 una volta richiesto, -5 quando il percorso è vuoto, -2 quando il componente non è creato
of_get_layout ( )Ciò che l'utente ha sistemato, in JSON: {"columns":[{"key":"","width":260,"visible":true},…],"sort":{"column":"","dir":"none"},"expanded":["europe"]} — prima la colonna dell'albero (chiave ""), poi ogni colonna nel suo ordine con la sua larghezza (0 = automatica) e visibilità, l'ordinamento, i nodi aperti. Da conservare (file, registro, database) poi da restituire a of_set_layout. Letto in diretta. Porta anche "sorts" (tutte le chiavi dell'ordinamento), "selected" (i nodi selezionati) e "top" (il nodo in cima alla vista, mai pixel)
of_set_layout (string as_layout_json)Rimette una disposizione letta da of_get_layout o ricevuta da ue_layout_changed: larghezze, ordine e visibilità delle colonne, ordinamento, e quali nodi sono aperti (quelli che non nomina si chiudono). Una colonna o un nodo che nomina e che l'albero non contiene è ignorato. ue_layout_changed è sollevato una volta quando qualcosa è cambiato (né ue_node_toggled né ue_sort_changed: rimette uno stato). Rende anche la selezione (ue_selection_changed se è cambiata, nulla è chiesto) e scorre fino al nodo in cima. Un indirizzo che chiede aperto in un ramo non ancora risposto è ricordato: si apre da sé quando la risposta del suo ramo lo porta (ue_node_toggled, poi ue_layout_changed); ue_selection_changed è sollevato una volta sola. Le domande di ib_veto_selection e ib_veto_toggle non sono poste: rimette uno stato, tipicamente all'avvio. Un ramo promesso che contiene già un nodo non è aperto su metà del suo contenuto: chiede prima ue_children_needed. Restituisce 0 una volta applicato, -5 quando il testo è vuoto o non è un oggetto JSON, -2 quando il componente non è creato

Eventi #

EventAttivato quando
ue_node_clicked (string as_keys)Un nodo è stato cliccato (e selezionato, salvo in SELECT_NONE). Un clic sullo chevron o sulla casella non lo solleva; un nodo disattivato non solleva nulla
ue_node_opened (string as_keys)Un doppio clic su un nodo, o Invio: aprite il vostro editor per lui. Un doppio clic su un ramo lo apre o lo chiude anche (ue_node_toggled)
ue_node_rclicked (string as_keys, long al_x, long al_y)Un clic destro su un nodo (selezionato prima, salvo se ue_selection_changing lo rifiuta o in SELECT_NONE: agite su as_keys, mai su of_selected_key), o il tasto menu (o Maiusc + F10) sul nodo che ha il focus. al_x, al_y sono pixel dello schermo — il punto del clic, o l'angolo in basso a sinistra del nodo per il tasto menu —, quelli che prende un contextmenu: uo_menu.of_show(al_x, al_y); per un menu PowerBuilder, PopMenu(PointerX(), PointerY()) della vostra finestra
ue_node_toggled (string as_keys, boolean ab_expanded)Un nodo si è aperto (ab_expanded = true) o chiuso: il suo chevron, un doppio clic, la tastiera, o il vostro codice (ib_expanded, of_expand_all, of_collapse_all, e ciò che of_select_node o of_scroll_to_node aprono); un'apertura fatta durante ue_children_needed lo solleva una sola volta; of_expand_to_level, of_clear_children (che chiude) e un ramo ricordato da of_set_layout lo sollevano anche
ue_selection_changed (string as_keys_json)La selezione è cambiata: un clic, la tastiera, il vostro codice (of_select_node, of_clear_selection), o nodi selezionati che hanno lasciato lo schermo (ramo chiuso, nodo rimosso o nascosto, nodo celato dalla ricerca — ciò che lo contiene non è selezionato al suo posto). as_keys_json è l'array JSON degli indirizzi selezionati, nell'ordine dell'albero: ["europe/france", "asia"]
ue_node_checked (string as_keys, boolean ab_checked)L'utente ha spuntato (ab_checked = true) o tolto la spunta a un nodo: la sua casella, o Spazio. Con ib_check_cascade, tutto il suo sottoalbero segue, già al suo posto quando l'evento arriva. Una spunta scritta dal vostro codice non solleva nulla. Una spunta dell'utente salta un nodo disattivato e il suo sottoalbero
ue_children_needed (string as_keys)Un ramo promesso da ib_has_children si apre e non contiene ancora i suoi figli: aggiungeteli ora (of_add_node); il ramo si apre con loro al ritorno dell'evento, dopo il ritorno della riga che l'ha aperto. La promessa vale fino a questa risposta, anche se vi è stato aggiunto o rilasciato un nodo; sotto una foglia spuntata, ogni figlio aggiunto prende la sua spunta. Se non aggiungete nulla, la promessa è ritirata (lo chevron sparisce)
ue_node_editing (string as_keys, string as_text) → booleanAnnullabile, posto prima che un testo digitato dall'utente sia tenuto, solo quando ib_veto_changes = true. Restituire FALSE rifiuta: il nodo tiene il suo testo. Predefinito: TRUE
ue_node_edited (string as_keys, string as_text, string as_old_text)L'utente ha rinominato un nodo (F2, o un secondo clic lento con ib_editable). Il nodo mostra già as_text; as_old_text è quello che aveva. Con ib_write_back, il DataStore è già scritto
ue_node_moving (string as_keys, string as_to_parent_keys, long al_position) → booleanAnnullabile, posto prima che un nodo si sposti (un trascinamento o of_move_node), solo quando ib_veto_changes = true. as_to_parent_keys vale "" per la cima, al_position il suo posto finale lì, a partire da 1, limitato ai fratelli — quello che dirà ue_node_moved. Un nodo già al suo posto non chiede nulla. Restituire FALSE rifiuta: nulla si sposta, e of_move_node restituisce -4. Un of_move_node dello stesso nodo fatto nell'evento non è richiesto di nuovo: si applica, e l'of_move_node che poneva la domanda restituisce allora -5; un altro nodo è richiesto normalmente. Per impostazione predefinita: TRUE
ue_node_moved (string as_keys, string as_old_keys, long al_position)Un nodo si è spostato con il suo sottoalbero: un trascinamento dell'utente o of_move_node. as_keys è il suo nuovo indirizzo, as_old_keys quello che aveva, al_position il suo posto sotto il nuovo padre (a partire da 1). Gli handle presi al vecchio indirizzo sono già liberati (of_move_node li libera subito, un trascinamento prima di questo evento); un handle preso al nuovo resta valido
ue_sort_changed (string as_column, string as_dir, string as_sort)L'ordinamento è cambiato: un clic su un'intestazione o of_sort. as_column è la sua prima chiave ("" per il testo dei nodi), as_dir la sua direzione (una delle costanti SORT_), as_sort l'ordinamento intero scritto come lo legge il SetSort di un DataWindow ("type A, text D", "" senza ordinamento). Rimuovere la colonna ordinata lo solleva con la chiave successiva dell'ordinamento, SORT_NONE quando era la sola
ue_layout_changed (string as_layout_json)La disposizione è cambiata: larghezza o ordine di una colonna, ordinamento, un nodo aperto o chiuso, o of_set_layout. as_layout_json è la disposizione intera, come la restituisce of_get_layout. Una larghezza, un posto o una visibilità di colonna scritti dal vostro codice lo sollevano anche, quando la disposizione cambia; titolo, formato, allineamento, ordinamento permesso e totale restano muti
ue_write_back_failed (string as_keys, string as_col, string as_value, string as_reason)ib_write_back: il DataStore ha rifiutato un valore (un tipo che non può contenere, una riga eliminata dopo il caricamento), o non c'è più un DataStore (as_reason = no DataStore is bound). Il nodo è tornato (as_keys è l'indirizzo che ha di nuovo); l'evento del gesto non è sollevato. as_reason dice anche quando il lotto del nodo è stato ricaricato per un altro nodo, o quando la colonna della spunta porta valori che non sono né un sì né un no
ue_image_failed (string as_keys, string as_reason)L'immagine di un nodo non ha potuto essere mostrata: as_reason vale REASON_INSECURE (un indirizzo http://), REASON_UNC (un percorso di rete venuto da una colonna di DataStore) o REASON_NOT_FOUND (file non trovato). Detto una volta per nodo e per immagine
ue_selection_changing (string as_from_keys_json, string as_keys_json) → booleanAnnullabile, posto prima che l'utente scelga un'altra selezione (un clic, la tastiera, F3) e prima di of_select_node, of_clear_selection, of_search_next / of_search_prev, solo quando ib_veto_selection = true. as_from_keys_json è la selezione attuale, as_keys_json quella richiesta (array JSON di indirizzi). Restituire FALSE rifiuta: nulla si muove, nemmeno il focus della tastiera, e il metodo restituisce -4. Ciò che esce dalla selezione per conseguenza (ramo chiuso, rimozione, nodo nascosto, ricerca) non è chiesto. of_select_nodes chiede una volta per tutta la selezione. Per mandare l'utente altrove, selezionate durante l'evento e poi restituite FALSE: una selezione fatta durante l'evento non è richiesta di nuovo. Per impostazione predefinita: TRUE
ue_node_toggling (string as_keys, boolean ab_expanding) → booleanAnnullabile, posto prima che un nodo si apra (ab_expanding = true) o si chiuda, solo quando ib_veto_toggle = true: un gesto (chevron, doppio clic, tastiera, *, barra degli strumenti, un ramo sotto un trascinamento) e il vostro codice (ib_expanded, of_expand_all, of_collapse_all, of_expand_to_level — una domanda per nodo —, of_select_node e of_scroll_to_node per i nodi che aprono). Restituire FALSE rifiuta: il nodo resta com'è, e un metodo restituisce -4. I fratelli che ib_single_expand chiude non sono chiesti. Per impostazione predefinita: TRUE. of_clear_children chiude senza chiedere
ue_delete_requested (string as_keys_json)L'utente ha premuto Canc: as_keys_json è l'array JSON dei nodi selezionati (in SELECT_NONE, quello del focus; senza selezione altrimenti non si solleva nulla), né disattivati né in sola lettura. L'albero non rimuove nulla: chiamate of_remove_node per ciò che la vostra applicazione elimina
ue_copy (string as_tsv)L'utente ha premuto Ctrl+C (o Ctrl+Ins): as_tsv contiene i nodi selezionati (in SELECT_NONE, quello del focus; senza selezione altrimenti non si solleva nulla) nell'ordine dell'albero, uno per riga, il testo dopo tante tabulazioni quanta la sua profondità, poi le colonne di una lista ad albero allineate (prima una riga d'intestazione), un numero grezzo (un punto, né raggruppamento né simbolo). L'albero prova anche gli appunti del browser, che possono essere rifiutati a una pagina: ClipBoard(as_tsv) per essere sicuri
ue_drop_files (string as_keys, string as_files[])Dei file sono stati rilasciati da Esplora risorse su un nodo (ib_allow_drop): as_keys è l'indirizzo del nodo sotto il cursore — vuoto per un rilascio accanto ai nodi, su un nodo disattivato o su un nodo il cui ib_drop_target vale false —, as_files i percorsi completi
ue_state_clicked (string as_keys)L'utente ha cliccato l'immagine di stato di un nodo (is_state_image): una bandierina, uno stato che la vostra applicazione accende e spegne. Il nodo non è selezionato, come per la sua casella; un nodo disattivato non solleva nulla. Sollevato solo per un gesto
ue_csv_saved (string as_path, boolean ab_ok, string as_error)Il CSV richiesto da of_export_csv è stato scritto (ab_ok = true) — o no: as_error dice perché (la modalità demo, un percorso che non si può scrivere). as_path è il percorso scritto, uno relativo risolto
ue_xlsx_saved (string as_path, boolean ab_ok, string as_error)La cartella di lavoro richiesta da of_export_xlsx è stata scritta (ab_ok = true) — o no: as_error dice perché
ue_drag_enter ( )Un trascinamento di file da Esplora risorse è entrato nel componente (ib_allow_drop)
ue_drag_leave ( )Il trascinamento di file è uscito senza rilasciare nulla — un rilascio solleva solo ue_drop_files
ue_ready ( )Il componente ha terminato il caricamento; tutto ciò che è stato inviato prima è stato riprodotto
ue_runtime_missing ( )Il runtime WebView2 è assente: il componente resta vuoto
ue_bg_color (long al_color)Il componente ha calcolato il colore di sfondo del proprio tema; l'userobject lo ha già adottato (backcolor)

Tastiera e mouse #


Esempi #

Diritti da spuntare #

// The rights of a role : a module, then what it allows
uo_rights.ib_checkboxes = true
uo_rights.of_add_node(/*keys*/ "sales", /*text*/ "Sales")
uo_rights.of_add_node(/*keys*/ "sales/read", /*text*/ "Read orders")
uo_rights.of_add_node(/*keys*/ "sales/write", /*text*/ "Create and change orders")
uo_rights.of_add_node(/*keys*/ "sales/delete", /*text*/ "Delete orders")

// What the role already has ; Sales shows mixed
uo_rights.of_node(/*keys*/ "sales/read").ib_checked = true
uo_rights.of_node(/*keys*/ "sales").ib_expanded = true
// event ue_node_checked of uo_rights : (string as_keys, boolean ab_checked)
// Delete never without write : checking it checks write too
if as_keys = "sales/delete" and ab_checked then this.of_node(/*keys*/ "sales/write").ib_checked = true

Ritrovare la disposizione al prossimo avvio #

// event ue_layout_changed of uo_tree : (string as_layout_json)
// Widths, order, sort and open nodes, kept for the next start
// (the nodes need STABLE keys : a ROLE_KEY column, never the RowIDs a new Retrieve gives)
SetProfileString("app.ini", "tree", "layout", as_layout_json)
// Local variables
string ls_layout

// After the tree is filled : the layout of the last time, if there is one
ls_layout = ProfileString("app.ini", "tree", "layout", "")
if ls_layout <> "" then uo_tree.of_set_layout(/*layout_json*/ ls_layout)

Un menu su un nodo #

// The entries of the menu, once : uo_menu is a contextmenu of the window, and
// is_menu_keys a string instance variable that keeps the node right-clicked
uo_menu.of_add_item(/*keys*/ "expand", /*text*/ "Expand")
uo_menu.of_add_item(/*keys*/ "delete", /*text*/ "Delete")
// event ue_node_rclicked of uo_tree : (string as_keys, long al_x, long al_y)
// The node clicked is kept : the selection may have stayed elsewhere (a veto that
// refused it, SELECT_NONE). The menu opens where the user clicked
is_menu_keys = as_keys
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 node right-clicked
choose case as_keys
    case "expand"
        uo_tree.of_node(/*keys*/ is_menu_keys).ib_expanded = true
    case "delete"
        uo_tree.of_remove_node(/*keys*/ is_menu_keys)
end choose

Buone pratiche #

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.

MembriRuoloDescritto in
of_count · of_keys_at · of_hasPercorrere ciò che il componente contiene3.2 Gli item
of_resetRiportare il componente a zero3.6 Riportare un componente a zero: of_reset()
of_register_shortcut · of_clear_shortcutsScorciatoie da tastiera del componente3.5 Le scorciatoie da tastiera
of_is_created · of_is_ready · of_get_last_errorSe è nato, se è pronto, cosa è fallito3.7 Diagnostica
of_save_as_png · of_save_as_jpgEsportare il rendering in immagine3.8 Esportare il rendering come immagine
of_set_redrawRaggruppare le modifiche in un solo ridisegno3.10 Buone pratiche
of_preload_iconsIcone mostrate senza ritardoVisualizzazione istantanea: of_icon
of_set_translationTradurre una dicitura del componente5.2 Adattare un'etichetta: of_set_translation
of_focus_webviewDare il focus al componente6.4 Tastiera e focus
of_print · of_print_to_pdfStampare, o scrivere un PDF6.9 Stampare
of_set_property · of_get_property · of_component_namePilotare una proprietà per nome3.1 Il motore delle proprietà
is_accessible_name · is_accessible_descriptionIl nome e la descrizione che dice un lettore di schermo3.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.

← Riferimento dei componenti · Sommario della guida