PBToolboxAI v1 ← Site

codeeditor — u_pbt_codeeditor #

← Riferimento dei componenti · Sommario della guida

Editor di codice con evidenziazione della sintassi: dieci linguaggi, numeri di riga, compressione delle regioni, ricerca integrata e rilascio di file.

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


In breve #

Userobjectu_pbt_codeeditor
Classe degli item— (componente senza item)
Serve perImmettere o visualizzare codice, una query SQL, un file di configurazione: ovunque un multilineedit risulti poco leggibile
Opzioni opt-inib_track_caret, ib_allow_drop, ib_folding

Avvio rapido #

// event open della finestra
uo_editeur.is_syntax = uo_editeur.SYNTAX_SQL
uo_editeur.is_text   = "SELECT c.name, SUM(o.amount) AS total~r~n" &
                       + "FROM customer c~r~n" &
                       + "WHERE o.status = 'paid'"
// Rileggere cio che l'utente ha realmente digitato
string ls_sql

ls_sql = uo_editeur.of_get_text()

is_text restituisce la stessa cosa: la digitazione dell'utente vi arriva non appena l'immissione si posa (event ue_changed).


Linguaggi riconosciuti #

is_syntax accetta una di queste costanti, oppure SYNTAX_NONE (stringa vuota) per testo semplice senza evidenziazione.

LinguaggioCostanteAltre grafie accettate
PowerScriptSYNTAX_POWERSCRIPTpb, powerbuilder
SQLSYNTAX_SQLtsql, plsql
JavaScriptSYNTAX_JAVASCRIPTjs, jsx
JSONSYNTAX_JSONjsonc
Famiglia CSYNTAX_C · SYNTAX_CPP · SYNTAX_CSHARP · SYNTAX_JAVAc++, cxx, cs
HTML / XMLSYNTAX_HTML · SYNTAX_XMLhtm, xhtml, svg
CSSSYNTAX_CSSscss, less
PythonSYNTAX_PYTHONpy
YAMLSYNTAX_YAMLyml
MarkdownSYNTAX_MARKDOWNmd, mkd

I linguaggi di una stessa famiglia condividono l'evidenziazione (SYNTAX_JAVA colora come SYNTAX_C, SYNTAX_XML come SYNTAX_HTML): la costante scelta documenta la Sua intenzione, il risultato sullo schermo è lo stesso. Il valore non distingue tra maiuscole e minuscole e un nome sconosciuto ricade sul testo semplice, senza errore.


Proprietà #

Contenuto e linguaggio #

ProprietàTipoPredefinitoRuolo
is_textstring""Il codice visualizzato nell'editor. In lettura restituisce il contenuto vivo, digitazione dell'utente compresa
is_syntaxstring""Linguaggio di evidenziazione: costanti SYNTAX_* (vedere la tabella qui sopra). SYNTAX_NONE = testo semplice
ib_readonlybooleanfalseEditor in sola lettura: l'utente consulta senza poter modificare

Visualizzazione #

ProprietàTipoPredefinitoRuolo
ib_line_numbersbooleantrueMostra o nasconde il margine dei numeri di riga, a sinistra
ib_current_linebooleantrueEvidenzia la riga in cui si trova il cursore. Nessuna evidenziazione con ib_wrap attivo.
ib_foldingbooleanfalseOpt-in: consente la compressione delle regioni (#region, blocchi tra parentesi graffe) dal margine
ib_wrapbooleanfalseManda a capo le righe lunghe invece di scorrere lateralmente
ii_tab_sizeinteger4Numero di colonne occupate da una tabulazione
is_font_familystring""Carattere dell'editor (vuoto = carattere a spaziatura fissa del tema)
ii_font_sizeinteger0Dimensione del carattere in punti (0 = dimensione del tema)
ProprietàTipoPredefinitoRuolo
ib_search_enabledbooleantrueAttiva la barra di ricerca integrata (Ctrl+F)
ii_doc_lineinteger-1Scorre fino alla riga indicata e la seleziona (numerazione a partire da 1). Nessuna evidenziazione con ib_wrap attivo; lo scorrimento continua a funzionare.
ib_track_caretbooleanfalseOpt-in: attiva ue_caret_changed a ogni spostamento del cursore
ib_allow_dropbooleanfalseOpt-in: accetta il rilascio di file da Esplora file di Windows; i percorsi completi arrivano tramite ue_drop_files
is_theme_stylestringfluentStile visivo del componente (costanti THEME_STYLE_*)
is_theme_modestringlightVariante chiara o scura (costanti THEME_MODE_*)
il_theme_accentlong-1Colore d'accento di questo componente (-1 = accento 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

Metodi #

MetodoRuolo
of_get_text ( ) → stringRestituisce il contenuto vivo — lo stesso valore di is_text, per il codice che preferisce una chiamata di metodo
of_find (string as_text)Apre la barra di ricerca ed evidenzia tutte le occorrenze del testo
of_insert_text (string as_text)Inserisce del testo al cursore, esattamente come se l'utente l'avesse digitato: la selezione corrente viene sostituita e il cursore si posa dopo l'inserimento. È il metodo dietro un pulsante inserisci frammento, là dove is_text getterebbe via il lavoro in corso. Quando l'editor ha il fuoco, l'inserimento passa per il percorso di modifica del browser, quindi Ctrl+Z lo annulla ancora
of_reset ( )Riporta tutte le proprietà al valore predefinito e svuota l'editor
of_set_redraw (boolean)Raggruppa una raffica di modifiche in un unico rendering
of_save_as_png (string) · of_save_as_jpg (string)Esporta il rendering come immagine

Event #

EventAttivato quando
ue_changed (string as_text)L'utente ha modificato il contenuto e la sua digitazione si è stabilizzata; as_text porta il nuovo codice completo
ue_caret_changed (long al_line, long al_col)Il cursore si è spostato; riga e colonna contate a partire da 1 — richiede ib_track_caret = true
ue_find_result (long al_count, long al_index)Una ricerca è andata a buon fine: al_count occorrenze trovate, al_index = posizione di quella messa in evidenza
ue_drop_files (string as_files[])Alcuni file sono stati rilasciati da Windows: percorsi completi, una voce per file. Richiede ib_allow_drop = true
ue_drag_enter ( )Un trascinamento di file entra nell'editor (ib_allow_drop)
ue_drag_leave ( )Il trascinamento di file lascia l'editor
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)

Esempi #

Un editor di query SQL #

uo_requete.of_set_redraw(false)

uo_requete.is_syntax = uo_requete.SYNTAX_SQL
uo_requete.is_text   = "-- Migliori clienti per fatturato incassato~r~n" &
                       + "SELECT c.name, SUM(o.amount) AS total~r~n" &
                       + "FROM customer c~r~n" &
                       + "  INNER JOIN orders o ON o.cust_id = c.id~r~n" &
                       + "WHERE o.status = 'paid'~r~n" &
                       + "GROUP BY c.name~r~n" &
                       + "ORDER BY total DESC"

uo_requete.of_set_redraw(true)
// event clicked di cb_executer
string ls_sql

ls_sql = uo_requete.of_get_text()     // la digitazione reale dell'utente
of_executer(ls_sql)

Un visualizzatore in sola lettura #

Ideale per presentare codice generato, un registro o un estratto che l'utente deve leggere senza modificarlo.

uo_apercu.is_syntax = uo_apercu.SYNTAX_POWERSCRIPT

uo_apercu.ib_readonly     = true      // sola consultazione, nessun cursore di immissione
uo_apercu.ib_line_numbers = false     // nasconde il margine dei numeri
uo_apercu.ib_current_line = false     // nessuna evidenziazione della riga corrente
uo_apercu.ib_wrap         = true      // manda a capo invece di scorrere
uo_apercu.ii_tab_size     = 2         // tabulazioni visualizzate su 2 colonne

uo_apercu.is_text = of_generer_code()

Seguire la posizione del cursore in una barra di stato #

uo_editeur.ib_track_caret = true       // adesione esplicita : altrimenti nessun evento
// event ue_caret_changed di uo_editeur : (long al_line, long al_col)
uo_statut.of_item("pos").is_text = "Riga " + String(al_line) + ", col. " + String(al_col)

Senza ib_track_caret, il cursore non riporta nulla: questo trigger ha una frequenza elevata e rimane disattivato finché non lo richiede.

Cercare e andare a una riga #

// Apre la barra di ricerca ed evidenzia tutte le occorrenze
uo_editeur.of_find(/*testo*/ "ll_total")
// event ue_find_result di uo_editeur : (long al_count, long al_index)
if al_count = 0 then
    uo_statut.of_item("main").is_text = "Nessuna occorrenza"
else
    uo_statut.of_item("main").is_text = String(al_index) + " / " + String(al_count)
end if
// Andare direttamente alla riga segnalata da un compilatore
uo_editeur.ii_doc_line = ll_ligne_erreur     // scorre e seleziona la riga

Aprire un file rilasciato da Esplora file #

uo_editeur.ib_allow_drop = true
// event ue_drop_files di uo_editeur : (string as_files[])
string ls_contenu, ls_ligne
integer li_fichier

// as_files[1] porta il percorso COMPLETO del primo file rilasciato
li_fichier = FileOpen(as_files[1], StreamMode!, Read!)
if li_fichier > 0 then
    FileReadEx(li_fichier, ls_contenu)
    FileClose(li_fichier)

    uo_editeur.is_syntax = of_langage_selon_extension(as_files[1])
    uo_editeur.is_text   = ls_contenu
end if

Reagire alle modifiche #

// event ue_changed di uo_editeur : (string as_text)
ib_modifie = true
uo_statut.of_item("main").is_text = String(Len(as_text)) + " caratteri"

L'event viene attivato solo una volta stabilizzata la digitazione: un'immissione continua non genera un event per ogni tasto.


Buone pratiche #


← Riferimento dei componenti · Sommario della guida