PBToolboxAI v4 ← Site

webbrowser — u_pbt_webbrowser #

← Riferimento dei componenti · Sommario della guida

Browser web integrato nella Sua finestra: visualizzazione di una pagina, barra degli indirizzi, cronologia Indietro / Avanti, menu contestuale di navigazione.

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


In breve #

Userobjectu_pbt_webbrowser
Classe degli item— (componente senza item)
Serve perMostrare una pagina web, un portale interno, una documentazione online o un contenuto HTML generato, senza uscire dall'applicazione

Avvio rapido #

// event open della finestra
uo_browser.ib_address_bar = true    // barra degli indirizzi + pulsanti di navigazione
uo_browser.is_address = "https://fr.wikipedia.org/wiki/PowerBuilder"

Impostare is_address è l'atto di navigazione: ogni assegnazione apre la pagina richiesta. Un indirizzo privo di protocollo ("esempio.it") riceve automaticamente https://. Un percorso su disco (C:\cartella\pagina.html, \\server\condivisione\pagina.html) diventa un indirizzo file:///. Parole che non sono un indirizzo ("fattura 2026") vanno al motore di ricerca di is_search_url; senza motore vengono rifiutate e ue_error lo segnala. Un nome di server di una sola parola seguito da /, ? o # (office/, intranet/home) è un indirizzo, come un indirizzo IPv6 tra parentesi quadre ([::1]/x); la parola da sola (intranet) resta testo libero. Un server senza HTTPS si scrive con http:// esplicito.


Proprietà #

ProprietàTipoPredefinitoRuolo
is_addressstring""Indirizzo visualizzato. Assegnare questa proprietà avvia la navigazione. Rileggerla restituisce la pagina realmente visualizzata: se l'utente segue un link o torna indietro, segue anche lei (ue_load_completed La avvisa). Schemi accettati: http(s):, file: (anche un percorso su disco), about:, data:, mailto:, tel:; javascript: è rifiutato
ib_address_barbooleanfalseMostra la barra degli indirizzi integrata: campo URL, pulsanti Indietro / Avanti / Ricarica
ib_context_menubooleanfalseAttiva il menu contestuale al clic destro: Indietro, Avanti, Ricarica, più Copia su una selezione, Apri collegamento e Copia indirizzo collegamento su un collegamento, Copia immagine su un'immagine. Aperto da tastiera (Maiusc+F10), compare sull'elemento. In un campo di immissione resta il menu Taglia / Copia / Incolla
is_search_urlstring""Motore di ricerca per le parole che non sono un indirizzo, %s = il testo codificato (es. https://www.bing.com/search?q=%s). Vuoto per impostazione predefinita: un tale testo viene rifiutato e viene sollevato ue_error — un'applicazione gestionale non invia ciò che digitano i suoi utenti a un motore che non ha scelto. È accettato solo un indirizzo http(s) che contiene %s: qualsiasi altro solleva ue_error e il motore in vigore resta
ib_veto_new_windowbooleanfalseChiede a ue_new_window prima di aprire una nuova finestra nella vista; restituire false mantiene la pagina corrente
ib_veto_downloadsbooleanfalseChiede a ue_download_starting prima di ogni download; restituire false lo annulla
ib_veto_navigationbooleanfalseChiede a ue_navigating prima che il sito passi a un'altra pagina (collegamento, modulo, script); restituire false mantiene la pagina corrente. Una pagina autorizzata viene riaperta all'indirizzo richiesto: un modulo inviato in POST perde i suoi dati
ib_privatebooleanfalseNavigazione privata: cookie, archiviazione e cache dei siti non vengono mai scritti su disco e scompaiono con la vista. Da impostare prima di is_address: cambiarla riapre la vista vuota (nessuna pagina, nessuna cronologia); reimpostarla a true apre una nuova sessione privata
is_titlestring""Titolo della pagina visualizzata, letto in tempo reale (ue_title_changed avvisa quando cambia). Solo lettura: scriverlo non cambia nulla
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)

Metodi #

MetodoRuolo
of_refresh ( )Ricarica la pagina corrente. Restituisce 0 una volta richiesto, -4 se nessuna pagina è visualizzata (is_address vuoto), -2 se il componente non è creato
of_go_back ( )Torna alla pagina precedente. Segue l'ordine del Suo codice: is_address poi of_go_back() vengono eseguiti in quest'ordine
of_go_forward ( )Avanza alla pagina successiva
of_can_go_back ( ) → booleantrue se esiste una pagina precedente — per attivare o disattivare il Suo pulsante Indietro. Letto in diretta dalla pagina; da leggere dopo un caricamento (ue_load_completed)
of_can_go_forward ( ) → booleantrue se esiste una pagina successiva
of_stop ( )Interrompe il caricamento in corso e abbandona le pagine ancora in attesa; il caricamento interrotto solleva ue_load_failed
of_execute_javascript (string as_script)Esegue uno script nella pagina visualizzata e ne restituisce il valore in JSON: un testo torna tra virgolette, un numero no (42), uno script che solleva un errore o non restituisce nulla dà null. Una risposta lunga torna intera. Una sola condizione, ed è strutturale: la pagina deve essere caricata, quindi la chiami da ue_load_completed, mai subito dopo aver impostato is_address. Restituisce una stringa vuota se non c'è ancora una pagina o senza risposta entro 5 secondi: of_get_last_error() dice perché
of_show_html (string as_html) → longMostra una pagina costruita dall'applicazione (una fattura, una lettera). La pagina è codificata: un colore #c00, un'ancora, un % o un accento appaiono come scritti. Al massimo 2 MB una volta codificata: oltre, ue_error e nulla cambia. Restituisce 0 una volta inviato, -2 se il componente non è creato
of_clear_browsing_data ( ) → longCancella ciò che i siti hanno memorizzato: cookie (una sessione aperta), archiviazione locale, cache, permessi concessi. La cancellazione prende posto dopo gli indirizzi già impostati: la pagina successiva si apre pulita. Tutti i webbrowser dell'applicazione condividono questi dati. Restituisce 0 una volta inviato, -2 se il componente non è creato
of_reset ( )Riporta il componente allo stato iniziale: pagina svuotata, cronologia di navigazione cancellata, barra degli indirizzi nascosta, menu contestuale disattivato, motore di ricerca svuotato, richieste (ib_veto_*) disattivate, navigazione privata disattivata. Cookie e sessioni dei siti restano: per quelli c'è of_clear_browsing_data. Restituisce 0 una volta applicato, -2 se il componente non è creato
of_save_as_png (string) · of_save_as_jpg (string)Esporta il sito visualizzato come immagine. Restituisce 0 una volta scritta l'immagine, -4 se la scrittura fallisce, -2 se il componente non è creato

Event #

EventAttivato quando
ue_load_completed (string as_url)Una pagina ha finito di caricarsi (la Sua, un link, Indietro, of_refresh); as_url è l'indirizzo effettivamente raggiunto, redirezioni comprese. Non sollevato per un indirizzo vuoto (about:blank) né per un caricamento fallito
ue_load_failed (string as_url, long al_status)Una pagina non ha potuto essere caricata: host sconosciuto, nessuna rete, certificato, o caricamento annullato da of_stop o da un indirizzo più recente. al_status dice il motivo: vedere Perché una pagina non si è caricata
ue_error (string as_message)Un testo impostato in is_address (o digitato nella barra) non è un indirizzo e nessun is_search_url è impostato, un indirizzo non ha potuto essere aperto affatto, o il processo della pagina si è fermato. Nient'altro resta bloccato: l'indirizzo successivo si carica normalmente
ue_new_window (string as_url) → booleanLa pagina chiede una nuova finestra dopo un clic (link target=_blank, window.open): si apre in questa vista. Annullabile se ib_veto_new_window = true: restituire false mantiene la pagina corrente. Una finestra aperta da uno script da solo, senza clic, viene ignorata. Si aprono solo indirizzi http e https: un sito che chiede un file, una pagina data: o un link di posta ottiene ue_error. Un link file: in una pagina web (http, https, data:) è rifiutato dal motore stesso, prima del componente: non si apre nulla e non viene sollevato alcun evento
ue_download_starting (string as_url, string as_path) → booleanUn download sta iniziando: as_url è ciò che viene scaricato, as_path il file che verrà scritto. Annullabile se ib_veto_downloads = true: restituire false lo annulla; altrimenti prosegue come in Edge
ue_navigating (string as_url) → booleanIl sito passa a un'altra pagina: un collegamento, un modulo, uno script — mai un indirizzo impostato dalla Sua applicazione. Annullabile se ib_veto_navigation = true: restituire false mantiene la pagina corrente
ue_title_changed (string as_title)Il titolo della pagina visualizzata è cambiato (is_title lo rilegge in qualsiasi momento)
ue_permission_requested (string as_url, string as_kind) → booleanIl sito chiede la fotocamera, il microfono, la posizione… (as_kind = una costante PERMISSION_*). Rifiutato a meno che l'evento restituisca true: l'unica domanda della libreria in cui il silenzio vale NO
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)
ue_script_error (string as_message, string as_stack)Si è verificato un errore JavaScript nella barra degli indirizzi del componente (mai nel sito visualizzato)

La barra degli indirizzi integrata #

È la soluzione più rapida: una proprietà, e l'utente dispone di un campo URL e dei pulsanti Indietro / Avanti / Ricarica, a tema come il resto dell'applicazione.

// La barra degli indirizzi, poi la pagina da aprire
uo_browser.ib_address_bar = true
uo_browser.is_address = "https://fr.wikipedia.org/wiki/PowerBuilder"

I pulsanti si disattivano da soli quando non c'è alcun posto dove andare. Nel campo indirizzo, F5 (o Ctrl+R) ricarica, Alt+← / Alt+→ vanno indietro e avanti (invertiti nella scrittura da destra a sinistra), Esc ripristina l'indirizzo corrente dopo una digitazione abbandonata, e il primo clic seleziona l'intero indirizzo.

I Suoi pulsanti personali #

Se preferisce pilotare la navigazione dalla Sua barra degli strumenti, nasconda la barra integrata e utilizzi i metodi:

// Pulsanti Indietro / Avanti della Sua finestra
uo_browser.of_go_back()
uo_browser.of_go_forward()
// event ue_load_completed di uo_browser : (string as_url)
// Aggiornare lo stato dei Suoi pulsanti dopo ogni pagina
uo_toolbar.of_item(/*keys*/ "main/back").ib_enabled = uo_browser.of_can_go_back()
uo_toolbar.of_item(/*keys*/ "main/forward").ib_enabled   = uo_browser.of_can_go_forward()

// E rispecchiare l'indirizzo reale (redirezioni comprese)
sle_url.text = as_url

Il menu contestuale di navigazione #

ib_context_menu aggiunge al clic destro un piccolo menu Indietro / Avanti / Ricarica, a tema e disegnato dall'applicazione. Segue ciò che si trova sotto il mouse: Copia su un testo selezionato, Apri collegamento e Copia indirizzo collegamento su un collegamento, Copia immagine su un'immagine. Aperto da tastiera (Maiusc+F10, tasto Menu), compare sull'elemento. Condivide esattamente la stessa cronologia della barra degli indirizzi: i due restano quindi sempre coerenti.

// A small menu on a right click : back, forward, refresh
uo_browser.ib_context_menu = true

Interrompere un caricamento #

// Pulsante Stop : interrompe una pagina che tarda
uo_browser.of_stop()

Parole invece di un indirizzo #

Per impostazione predefinita, un testo che non è un indirizzo viene rifiutato (ue_error), senza bloccare nulla: l'indirizzo successivo si carica normalmente. Per farne una ricerca, scelga il motore:

// Words typed in the address bar go to this engine (%s = the text)
uo_browser.is_search_url = "https://www.bing.com/search?q=%s"
uo_browser.is_address = "PowerBuilder WebView2"

Nuove finestre e download #

Un link «apri in una nuova scheda» o una finestra di accesso aperta dopo un clic viene mostrata nella vista, e ue_new_window glielo segnala. Un download prosegue come in Edge, e ue_download_starting Le fornisce indirizzo e file. Entrambi diventano una domanda quando lo richiede:

// Ask before each download
uo_browser.ib_veto_downloads = true
// ue_download_starting event of uo_browser : (string as_url, string as_path)
// Only PDF files may be downloaded
return Lower(Right(as_path, 4)) = ".pdf"

Restare sui propri server #

ue_navigating viene sollevato ogni volta che il sito passa a un'altra pagina — un collegamento, un modulo, uno script —, mai per un indirizzo impostato dal Suo codice. Con ib_veto_navigation diventa una domanda: restituire false mantiene la pagina corrente. Una pagina autorizzata viene riaperta all'indirizzo richiesto dal sito; un modulo inviato in POST perde i suoi dati.

// Ask before the site leaves for another page
uo_browser.ib_veto_navigation = true
// ue_navigating event of uo_browser : (string as_url)
// Only the company servers may be opened
return Pos(Lower(as_url), "://intranet.example.com/") > 0

Fotocamera, microfono, posizione #

Quando un sito chiede la fotocamera, il microfono, la posizione, le notifiche o la lettura degli appunti, decide ue_permission_requested, e la risposta predefinita è no: un sito non accende una fotocamera tramite una richiesta che l'utente non capisce. È l'unica domanda della libreria in cui il silenzio vale rifiuto. Nulla viene memorizzato: la domanda ritorna a ogni richiesta.

// ue_permission_requested event of uo_browser : (string as_url, string as_kind)
// The video-call page of the company may use the camera and the microphone
if Pos(Lower(as_url), "://visio.example.com/") = 0 then return false
return as_kind = uo_browser.PERMISSION_CAMERA or as_kind = uo_browser.PERMISSION_MICROPHONE

Valori di as_kind: PERMISSION_CAMERA, PERMISSION_MICROPHONE, PERMISSION_GEOLOCATION, PERMISSION_NOTIFICATIONS, PERMISSION_CLIPBOARD, PERMISSION_SENSORS, PERMISSION_DOWNLOADS (più download di seguito), PERMISSION_FILES, PERMISSION_AUTOPLAY, PERMISSION_FONTS, PERMISSION_MIDI, PERMISSION_WINDOWS, PERMISSION_UNKNOWN.

Perché una pagina non si è caricata #

al_status di ue_load_failed si confronta con le costanti LOADSTATUS_* del componente:

CostanteSignifica
LOADSTATUS_HOST_NOT_RESOLVEDHost sconosciuto (nome errato, DNS)
LOADSTATUS_DISCONNECTED · LOADSTATUS_CANNOT_CONNECT · LOADSTATUS_SERVER_UNREACHABLENessuna rete, server irraggiungibile
LOADSTATUS_TIMEOUTIl server non ha risposto in tempo
LOADSTATUS_CERT_INVALID · LOADSTATUS_CERT_EXPIRED · LOADSTATUS_CERT_NAME_INCORRECT · LOADSTATUS_CERT_REVOKED · LOADSTATUS_CLIENT_CERT_ERRORCertificato rifiutato
LOADSTATUS_CANCELEDCaricamento annullato da of_stop o da un indirizzo più recente
LOADSTATUS_AUTH_REQUIRED · LOADSTATUS_PROXY_AUTH_REQUIREDCredenziali richieste (server, proxy)
LOADSTATUS_CONNECTION_ABORTED · LOADSTATUS_CONNECTION_RESET · LOADSTATUS_INVALID_RESPONSE · LOADSTATUS_REDIRECT_FAILED · LOADSTATUS_UNEXPECTED_ERROR · LOADSTATUS_UNKNOWNAltri errori di connessione o di risposta
// ue_load_failed event of uo_browser : (string as_url, long al_status)
if al_status = uo_browser.LOADSTATUS_HOST_NOT_RESOLVED then
	st_message.text = "Unknown address : " + as_url
end if

Eseguire uno script nella pagina #

of_execute_javascript legge o modifica la pagina visualizzata (il titolo, un campo, un contatore). Non è limitato dalla licenza, anche su una pagina about:blank o data:: eseguire uno script nella pagina è il mestiere di un browser, e il componente è gratuito.

// ue_load_completed event of uo_browser : (string as_url)
// The page title, as JSON : "PowerBuilder - Wikipedia" (quotes included)
sle_title.text = uo_browser.of_execute_javascript(/*script*/ "document.title")

Siti che rifiutano la visualizzazione integrata #

Alcuni siti — Google, la maggior parte delle banche, molte applicazioni SaaS — inviano intestazioni di sicurezza che vietano la visualizzazione all'interno di un'altra pagina. Il componente non è interessato: non mostra mai un sito in un riquadro. La pagina viene aperta come documento principale, esattamente come fa il Suo browser, e quelle intestazioni non si applicano più.

Non c'è quindi nulla da impostare, né alcun caso particolare da gestire nel Suo codice.

// Un sito che rifiuta di essere integrato in una pagina : niente di speciale da fare
uo_browser.ib_address_bar = true
uo_browser.is_address = "https://www.google.com"

In cambio, la pagina occupa tutta la superficie del componente sotto la barra degli indirizzi: ciò che disegnasse sopra di essa (fasce, sovrapposizioni a tema) non è visibile durante la navigazione.


Contenuto HTML senza rete #

of_show_html mostra una pagina HTML costruita dalla Sua applicazione: l'anteprima di una lettera, di un ticket, di una fattura o di un report, senza alcuna chiamata di rete né file temporaneo. La pagina viene codificata per Lei: un colore #c00, un'ancora, un % o un accento appaiono come scritti (al massimo 2 MB).

// Local variables
string ls_html

// An order summary built by the application : the colour and the "%" come out as written
ls_html = "<html><body>" &
        + "<h1 style='color:#1f6feb'>Order #4152</h1>" &
        + "<p>Discount : 10%</p>" &
        + "</body></html>"
uo_browser.of_show_html(/*html*/ ls_html)

Impostato direttamente in is_address, un indirizzo data:text/html, non viene codificato: un # taglia lì la pagina (tutto ciò che segue passa per un'ancora) e un % la altera. Preferisca of_show_html, oppure codifichi da sé (# → %23, % → %25).

Un file locale si apre allo stesso modo con file:///C:/temp/rapporto.html, o semplicemente con il suo percorso C:\temp\rapporto.html.


Ripartire da zero #

of_reset() non si limita a svuotare la pagina: cancella anche la cronologia di navigazione. Un utente non può quindi tornare, con il pulsante Indietro, su una pagina consultata dall'utente precedente o in un'altra pratica. Non tocca ciò che i siti hanno memorizzato: cookie, sessioni aperte, archiviazione locale, permessi. Su una postazione condivisa, l'utente successivo arriverebbe connesso con l'account del precedente — è of_clear_browsing_data() a cancellarlo. I siti vivono in un profilo di navigazione a parte, separato dai componenti dell'applicazione.

// Cambio di pratica : si riparte da un browser vergine, senza cronologia
uo_browser.of_reset()

// Poi la pratica, con la sua barra degli indirizzi
uo_browser.ib_address_bar = true
uo_browser.is_address = ls_folder_url
// The user of the workstation changes : no page, no history, no signed-in session left
uo_browser.of_reset()
uo_browser.of_clear_browsing_data()

Perché nulla venga mai scritto su disco, imposti ib_private = true prima del primo indirizzo: cookie e archiviazione scompaiono con la vista.

È il riflesso da avere ogni volta che uno stesso componente serve a mostrare contenuti di contesti differenti.


Esempio completo #

// event open della finestra : pagina iniziale del portale interno
uo_browser.of_reset()                  // ripartire puliti (cronologia compresa)

// Gli strumenti di navigazione, poi la pagina iniziale
uo_browser.ib_address_bar  = true      // campo URL + Indietro / Avanti / Ricarica
uo_browser.ib_context_menu = true      // stessa navigazione con il clic destro
uo_browser.is_address = "https://intranet.example.com/home"
// event ue_load_completed di uo_browser : (string as_url)
uo_status.of_panel(/*key*/ "main").is_text = "Pagina caricata: " + as_url

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_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à

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