Categorie
Computer, hardware e software Script Per Jaws Uno Script al giorno

Aiutare l’inserimento di funzioni nell’Editor di Script

Auto compilazione e lettura delle descrizioni.

Nelle ultime versioni di Jaws può capitare che, quando si inserisce una funzione e si inizia a digitarne il nome nell'apposito campo, non venga più aggiornato il nome completo della stessa funzione che andrebbe inserita, o elaborata, nel caso in cui si premessero i relativi tasti. Grazie ad una funzione Evento si può comunque ripristinare tale funzionalità, ed in più far sì che, al primo ingresso nei campi di inserimento degli eventuali parametri, sia letto prima il titolo del campo, poi la sua descrizione.

Al di là dell'utilità specifica di questo script, come al solito esso rappresenta soprattutto l'occasione per dare un esempio pratico di utilizzo, sia delle funzioni analizzate sinora nella guida a Gli Script di Jaws. Ecco come programmarli da soli, sia per farne conoscere di nuove.

La funzione di cui ci serviamo in questo caso,
ScreenStabilizedEvent ()
, (EventoSchermoStabilizzato), è stata utilizzata nell'Ottavo capitolo della Guida. Essa, come dice il suo significato letterale, entra in azione in modo automatico quando nello schermo non si muove più nulla.

La sua particolarità è che Jaws non la utilizza, almeno nella sua configurazione predefinita, e per questo noi siamo liberi di poterla usare per i nostri scopi.

Le fasi dello Script.

Nel dettaglio, l'azione svolta dalla funzione si articola su più momenti:

  1. Un primo controllo, verifica tramite due condizioni se ci si trova nella fase di inserimento delle funzioni. Se questo non avviene, il flusso entra nella struttura, e si interrompe immediatamente.
  2. Se invece ci si trova nella finestra corretta, il flusso prosegue dapprima registrando il tipo e la posizione del cursore attivo, poi si memorizza il nome dell'oggetto sul cursore. Se questo si rivela essere un campo per l'indicazione dei parametri, il flusso entra nel primo ramo della seconda struttura di controllo, dove può essere letta la descrizione ad esso abbinata.
  3. Se la prima condizione non si verifica, la seconda condizione controlla se ci si trovi invece nella fase di definizione della funzione da inserire, dove la si può anche specificare scrivendone i primi caratteri. In questo caso, quando si interrompe la digitazione, viene letto il nome completo della funzione in quel momento attiva.
  4. A prescindere dal fatto se il cursore sia stato mosso dai precedenti controlli, alla fine esso viene fatto tornare alle condizioni iniziali.

Come ulteriori annotazioni, va chiarito che all'interno della Guida, tra i capitoli 6 e 7, è stato proposto un modo più organico di verificare se ci si trovi in una determinata finestra. Qui, per semplificare e rendere a sé stante il codice, sono state poste due singole condizioni, le quali controllano in modo sufficiente tale corrispondenza.

Poi, nelle fasi 2 e 3, essendo che durante la permanenza in questa finestra la funzione evento continua ad attivarsi, il testo pronunciato viene memorizzato in una variabile globale. Questo sistema consente di far eseguire la successiva lettura solo quando il testo viene modificato, evitando così fastidiose ed inutili ripetizioni.

Le parole chiave del Codice.

Una buona parte delle funzioni e dei comandi usati nello script sono stati già illustrati, così come si accennava, ed in particolare nei primi otto capitoli della Guida.

Le nuove funzioni di questo codice, sono quattro:

  1. StringStartsWith
    , (DatoTestualeIniziaCon), la quale verifica se il testo specificato come secondo parametro è uguale alla parte iniziale di quello indicato come primo. Se i due testi coincidono, viene restituito un valore
    TRUE
    , altrimenti un
    FALSE
    . La funzione ha anche un terzo parametro facoltativo, con il quale si può indicare se le due stringhe devono essere uguali anche nelle maiuscole o nelle minuscole, ponendo un valore positivo. Se invece non si specifica nulla, o si pone un valore zero, allora il confronto avverrà senza badare a queste differenze.
  2. MoveToControl
    , (MuoviAlControllo), che sposta il cursore appunto al controllo indicato. Nel primo parametro, alla funzione bisogna indicare l'Handle della finestra in cui cercare il controllo, mentre il secondo deve contenere l'ID del controllo su cui posizionarsi. Se quando si chiama questa funzione è attivo il cursore PC, allora l'eventuale spostamento avviene passando automaticamente al cursore Jaws. Negli altri casi, viene mantenuto il cursore attivo. Come risultato, la funzione restituisce
    TRUE
    , nel caso di avvenuto spostamento, e
    FALSE
    , se questo non riesce.
  3. GetParent
    , (OttieniGenitore), che restituisce la finestra di livello superiore a quella che si specifica nel suo unico parametro. L'utilizzo tipico di questa funzione è proprio quello che facciamo in questo caso, quando cioè ci si deve muovere tra i controlli e si deve indicare la finestra che li contiene.
  4. GetWindowText
    , (OttieniTestoFinestra), la quale restituisce appunto ciò che una finestra contiene, . Nel primo parametro della funzione, bisogna come al solito specificare l'Handle della finestra desiderata. Nel secondo, anch'esso obbligatorio, bisogna indicare se si vuole solo il testo evidenziato, ponendovi un valore positivo, oppure no, mettendo un valore nullo.

Il codice dello Script.

Chi fosse interessato a provare questo script, deve necessariamente inserirlo nel file script predefinito,
Default.JSS
. Lì, bisognerà portarsi sulla versione originale della funzione, cancellarla e sostituirla con la copia del codice qui sotto riportato.

Per garantirne il funzionamento, il codice deve essere copiato, anche grazie all'apposito tasto, assieme alle assegnazioni di costanti, ed alla dichiarazione di variabile globale, che sono poste prima dell'inizio della funzione.

Const
FINESTRA_INSERIMENTO = "Inserisci Funzione 1", ; nome della finestra per l'inserimento delle funzioni
CLASSE_INSERIMENTO = "#32770", ; classe della citata finestra
CAMPO_PARAMETRI = "Parametro", ; parte iniziale del titolo nei campi omonimi
CAMPO_DESCRIZIONE = 6037, ; ID dei campi descrizione nell'Editor di Script
CAMPO_SELEZIONE = 6022; ID del campo Selezione nell'Editor di Script

Globals String gsVoce; imposta la variabile globale

void function ScreenStabilizedEvent()
If GetWindowName (GetRealWindow (GetFocus ())) != FINESTRA_INSERIMENTO ; se è il nome della finestra a non coincidere,
|| GetWindowClass (GetRealWindow (GetFocus ())) != CLASSE_INSERIMENTO Then; oppure, se è la classe a non essere quella richiesta,
Return; il flusso viene interrotto
EndIf; fine controllo finestra
Var String sNome; dichiara la variabile temporanea
SaveCursor (); salva tipo e posizione del cursore attivo
Let sNome = GetObjectName (TRUE); rileva il dato sul titolo dell'oggetto
If StringStartsWith (sNome, CAMPO_PARAMETRI)Then; se la prima parte del titolo coincide con il testo impostato,
If sNome != gsVoce Then; se quello rilevato è diverso dal titolo registrato,
SayUsingVoice (VCTX_PCCURSOR, sNome, OT_HELP); lo pronuncia,
Let gsVoce = sNome; e lo memorizza nella variabile globale
If MoveToControl (GetParent (GetFocus ()), CAMPO_DESCRIZIONE) Then; se poi ci si sposta alla descrizione del parametro,
SayUsingVoice (VCTX_JAWSCURSOR, GetWindowText (GetCurrentWindow (), FALSE), OT_HELP); ne viene pronunciato il testo
EndIf; fine controllo spostamento
EndIf; fine controllo titolo registrato
ElIf MoveToControl (GetParent (GetFocus ()), CAMPO_SELEZIONE) Then; se invece ci si sposta all'elenco delle funzioni selezionate,
Let sNome = GetObjectValue (); rileva il testo della selezione attiva
If sNome != gsVoce Then; se quella rilevata è diversa dalla voce registrata,
SayUsingVoice (VCTX_JAWSCURSOR, sNome, OT_HELP); la pronuncia,
Let gsVoce = sNome; e la memorizza nella variabile globale
EndIf; fine controllo voce registrata
EndIf; fine controllo elaborazioni
RestoreCursor (); fa tornare il cursore alla situazione iniziale
endFunction

Uno Script al giorno, toglie gli ostacoli di torno!

Questo articolo fa parte dell'iniziativa nel titolo, che qui viene presentata nel dettaglio. Sarà, se non altro, l'occasione per dare spazio a script di vari linguaggi, forniti direttamente dagli utenti, oppure messi a punto sulla base di specifiche richieste da questi pervenuteci.

Per ulteriori informazioni, o inviare materiale, rivolgetevi direttamente a:

abramo.volpato@unoscriptalgiorno.it

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *