Numero 06 del 2021
Titolo: Gli script di Jaws 11. Le serie di Script e il nuovo Aiuto in Linea, seconda parte.
Autore: Abramo Volpato.
Articolo:
Gli script di Jaws 11. Le serie di Script e il nuovo Aiuto in Linea, seconda parte.
Di Abramo Volpato.
Seconda parte.
Collaudo.
1. Segnaliamo l'ultimo parametro come opzionale, invitando quindi a renderlo subito tale, modificando manualmente la scheda della funzione "SceltaValore", nel file di documentazione predefinito.
Esercizio 11.2.16. La funzione RigaCorrente.
FileScript. Default.JSS
Nome. RigaCorrente
Descrizione. Rileva il contenuto della riga in cui è posizionato il cursore, o intero, oppure dal cursore a fine riga o dall'inizio al cursore, sulla base dei valori indicati come parametro.
Ritorni. Di tipo String. Testo della riga corrente, senza ritorni a capo o caratteri di Nuova Linea, e spazi dopo questi.
Parametri.
1. iTipo. L'eventuale tipo di testo da prelevare: 0, per tutta la riga; 1, per la porzione dal cursore sino a fine riga; 2, per quella dal cursore fino all'inizio. Di tipo Int. Parametro Opzionale.
Novità.
1. La funzione integrata "GetToEndOfLine", (OttieniVersoFineRiga); Rileva il testo dalla posizione del cursore sino a fine riga corrente. Senza parametri.
2. La funzione integrata "GetFromStartOfLine", (OttieniDaInizioRiga); Rileva il testo dalla posizione del cursore fino all'inizio della riga corrente. Senza parametri.
Fasi.
1. La struttura di controllo determina quale parte della riga sarà restituita, sulla base del valore eventualmente specificato come parametro, servendosi anche delle funzioni native "GetToEndOfLine ()" e "GetFromStartOfLine ()".
2. Il testo viene poi restituito, dopo averne eliminato spazi inutili, caratteri di ritorno e nuova linea.
Codice.
String Function RigaCorrente (int iTipo)
Var String s; variabile temporanea
If !iTipo Then; se non si è indicato nulla, o il valore 0,
Let s = GetLine (); rileva l'intera riga
ElIf iTipo == 1 Then; se invece si è indicato il valore 1,
Let s = GetToEndOfLine (); rileva il testo dal cursore a fine riga
Else; altrimenti, se si è indicato il valore 2,
Let s = GetFromStartOfLine (); rileva il testo dal cursore sino ad inizio riga
EndIf; fine controllo tipo di testo
; restituisce il testo rilevato, senza caratteri di ritorno o nuova linea, e spazi inutili
Return TagliaSpazi (StringReplaceSubstrings (StringReplaceSubstrings (s, CR, NULLO), LF, NULLO))
EndFunction
Collaudo.
1. Invitiamo subito a rendere opzionale l'unico parametro, andando ad aggiornare il file documentazione predefinito.
Esercizio 11.2.17. La funzione CambiaControllo.
FileScript. Default.JSS
Nome. CambiaControllo
Descrizione. Consente di interagire con una finestra dotata di controlli tra i quali spostarsi, dovendo indicare un comando da premere per muoversi tra i campi, e casomai specificare anche un testo da inserire in quello attivo.
Ritorni. Di tipo Void. Nessuno.
Parametri.
1. sComando. Nome esteso del tasto o della combinazione di cui simulare la pressione. Di tipo String.
2. sTesto. L'eventuale stringa da inserire nel campo in cui ci si è portati. Di tipo String. Parametro Opzionale.
Novità.
1. La funzione integrata "SetLastScriptKey", (ImpostaUltimiTastiScript); Simula la pressione dei tasti indicati, come se fossero stati gli ultimi premuti dall'utente. Come unico parametro, vanno inseriti i tasti da impostare.
2. Le costanti numeriche "TASTIERA" e "EDITABILE", ,corrispondenti ai valori 1 e 3, i quali rappresentano, nell'ordine, un numero identificativo della tastiera e il codice di tipo per i campi di editazione nelle finestre secondarie.
Fasi.
1. Una prima struttura di controllo verifica se sia stato indicato il parametro iniziale; se così è, usa la stringa immessa per simulare la pressione dei relativi tasti, registrandoli inoltre come se fossero stati gli ultimi, in ordine di tempo , premuti sulla tastiera, tramite la funzione nativa "SetLastScriptKey ()".
2. Nella seconda struttura di controllo, il testo eventualmente immesso come secondo parametro viene inserito alla posizione del cursore, qualora il tipo di oggetto del controllo confermi che si tratta di un campo editabile.
Note.
1. Come si potrà notare più avanti, tale funzione può essere usata anche solo per spostarsi da un campo all'altro con il tasto Tab, così come si farebbe utilizzando i relativi comandi di Jaws; anche nel caso di un utilizzo così minimale, tuttavia, servirsi della funzione consente di utilizzare una sola riga di codice per svolgere almeno due funzioni, come detto uno spostamento al campo successivo o precedente, e l'attesa tramite l'istruzione "Pause ()", che in questo tipo di procedura con molti comandi in sequenza è assolutamente indispensabile.
2. Formalmente sarebbe solo il secondo parametro ad essere opzionale, in quanto l'utilizzo più logico prevede comunque il comando per spostarsi al controllo desiderato, e poi casomai inserirvi un testo nel caso in cui ne esistano le condizioni; le due strutture di controllo indipendenti tra loro consentono, tuttavia, di poter anche non specificare un comando di spostamento, usando la funzione anche solo per poter immettere del testo sfruttando il controllo del campo editabile.
Codice.
Void Function CambiaControllo (string sComando, string sTesto)
If sComando Then; se un comando è stato specificato,
TypeKey (sComando, TASTIERA); simula l'esecuzione di una combinazione dalla tastiera del pc
Pause ()
SetLastScriptKey (sComando); imposta il comando specificato come l'ultimo digitato
EndIf; fine controllo comando
If sTesto Then; se un testo è stato specificato,
TypeString (sTesto); simula l'immissione di una stringa testuale
Pause ()
EndIf; fine controllo testo
EndFunction
Collaudo.
1. Anche in questo caso, dopo aver compilato, si consiglia di indicare subito il secondo come parametro opzionale , andando alla scheda della funzione ed inserendo la dicitura apposita tra i due parametri nel file "Default.JSD".
Esercizio 11.2.18. Lo script CreaSerie.
FileScript. Default.JSS
Nome. CreaSerie
Sommario. Crea una serie di script da quello corrente.
Descrizione. Carica nome e contenuto dello script su cui è posizionato il cursore, per crearne le copie indicate, aggiornandone il suffisso numerico, ed aggiungendo i relativi tasti nell'apposito file.
TastiAttivazione. Shift+Control+Windows+P
Novità.
1. Le nostre funzioni "CaricaScript ()", "TrovaSezione ()", "ElencoNumeri ()", "SceltaValore ()", "RigaCorrente ()" e "CambiaControllo ()".
2. La funzione integrata "GetScriptDescription", (OttieniDescrizioneScript); Rileva la descrizione dello script indicato, immessa nell'omonimo campo durante la procedura di creazione.
3. La funzione integrata "IniWriteStringEx", (ScriviDatoTestualeFileIniUlteriore); Scrive un dato testuale in un archivio in formato "INI", collocandolo nella cartella indicata dal valore identificativo specificato. Ha cinque parametri obbligatori:
- La sezione del file INI da trattare.
- La chiave del dato.
- Il dato testuale da scrivere.
- Un codice numerico che indica in quale cartella cercare il file.
- L'archivio da elaborare.
4. Le costanti "SEGNO_PIU", "BACKSPACE", "CONTROL_E", "TAB", "BARRA_SPAZIO", "ALT_D", "INVIO", "DELETE" e "CONTROL_S", che equivalgono alle rispettive combinazioni di tasti o caratteri.
5. La costante "JSS", che rappresenta l'omonima estensione, incluso il carattere Punto iniziale.
Fasi.
1. Si effettuano in sequenza tre controlli dove il flusso prosegue solo in caso positivo, nell'ordine controllando se: sia stato rilevato il nome del file script corrente; si siano raccolti il nome ed il codice dello script, tramite la nostra funzione "CaricaScript ()"; il nome dello script abbia un suffisso numerico.
2. Nel quarto controllo si verifica se sia stato rilevato il nome della sezione in cui trascrivere le combinazioni che attivano gli script, grazie alla nostra "TrovaSezione ()";poiché questo dato non è sempre indispensabile, anche se tale nome non sia stato rilevato viene comunque fornita la possibilità di continuare ugualmente la procedura.
3. Se il flusso continua, viene quindi proposta la scelta del numero di copie da fare dello script interessato, utilizzando le nostre funzioni "ElencoNumeri ()" e "SceltaValore ()". Se si interrompe la scelta, viene proposta una conferma dell'abbandono; altrimenti, si propone la conferma del numero di copie impostate, la quale è a sua volta da confermare o annullare.
4. Se si conferma la scelta effettuata, la procedura copia lo script sul cursore, si porta a fine file ed inizia ad eseguire la duplicazione degli script, copiando il codice ed aggiornando solo il suffisso numerico; in questa fase, tra le altre, sono chiamate anche le nostre funzioni "RigaCorrente ()" e "CambiaControllo ()", nonché quelle integrate "GetScriptDescription ()" e "IniWriteStringEx ()".
Note.
1. Se l'apposita sezione del file tasti è stata rilevata, durante la trascrizione del codice saranno riportati anche i tasti di attivazione degli script.
Codice.
Script CreaSerie ()
Var
String sNomeFile, ; nome del file script
String sFileTasti, ; nome del file tasti
String sNome, ; nome dello script da duplicare
String sCodice, ; contenuto dello script
String sCifra, ; suffisso numerico al nome
String sNomeBase, ; nome script senza suffisso
String sSezione, ; sezione del file tasti dove è registrata la combinazione abbinata allo script
String sTasti, ; stringa base per le combinazioni da formattare
Int iNoTasti, ; indicatore della scrittura dei tasti di attivazione
Int iPartenza, ; valore iniziale
String sElenco, ; lista di valori testuali
String sTitolo, ; titolo nelle finestre di dialogo
Int iScelta, ; valore della scelta effettuata
Int iValore, ; variabile temporanea
String sNuovo, ; nome aggiornato dello script
String sNuoviTasti, ; nuova combinazione tasti
String sSommario, ; stringa base per il Sommario
String sDescrizione, ; stringa base per la Descrizione
Int i; contatore del ciclo
If !DocumentoCorrente (sNomeFile) Then; se non si è rilevato il nome del file script,
SayMessage (OT_ERROR, hlpNoNomeFile, hlpNoNomeFile_corto); avvisa dell'errore,
Return; e interrompe il flusso
EndIf; fine controllo nome file
Let sFileTasti = StringReplaceSubstrings (sNomeFile, JSS, JKM); compone il nome del file tasti
If !CaricaScript (sNome, sCodice) Then; se non si è rilevato alcuno script sul cursore,
Return; interrompe il flusso
EndIf; fine controllo presenza script
Let sCifra = EstraeNumero (sNomeBase, sNome); individua e toglie dal nome dello script l'eventuale suffisso numerico
If !sCifra Then; se nel nome non è presente alcun suffisso,
SayFormattedMessage (OT_ERROR, hlpNoSuffisso, hlpNoSuffisso_corto, sNome); formatta l'avviso,
Return; e interrompe il flusso
EndIf; fine controllo suffisso
If !TrovaSezione (sFileTasti, sNome, sSezione, sTasti) Then; se i dati non sono stati rilevati,
If !ChiedeConferma (FormatString (ttlNoTasti, sNome), msgNoTasti) Then; se non si vuole continuare,
Return; interrompe il flusso
EndIf; fine conferma prosecuzione
EndIf; fine controllo rilevamento dati
If sTasti Then; se i tasti di attivazione sono stati trovati,
EstraeNumero (sTasti); rimuove dalla combinazione tasti il suffisso numerico
If StringRight (sTasti, 1) != SEGNO_PIU Then; se la base dei tasti non finisce con un Più,
Let sTasti = sTasti + SEGNO_PIU; lo aggiunge
EndIf; fine controllo tasti
Let sTasti = sTasti + msg1; aggiunge il carattere segnaposto alla base per i tasti
Else; altrimenti, se non si vogliono trascrivere i tasti di attivazione,
Let iNoTasti = TRUE; annota il valore
EndIf; fine controllo presenza tasti
Let iPartenza = StringToInt (sCifra); converte la cifra testuale come valore iniziale
Let sElenco = ElencoNumeri (iPartenza); genera un elenco di valori in forma testuale
Let sTitolo = FormatString (ttlSelezione, msgUltimoScript); compone il titolo della finestra
; imposta la voce selezionata all'ingresso nella finestra di dialogo
Let iValore = StringSegmentIndex (sElenco, PIPE, IntToString (MAX_SEGNI), TRUE)
Let iScelta = SceltaValore (sElenco, sTitolo, iValore); imposta il suffisso dell'ultimo script
If !iScelta Then; se nessun valore è stato impostato,
Return; interrompe il flusso
EndIf; fine controllo scelta
Let iValore = iScelta + iPartenza; aggiunge al valore scelto quello iniziale
If !ChiedeConferma (FormatString (ttlCreaScript, sNome, iValore), msgConfermaScelta) Then; se non si è confermata la prosecuzione,
Return; interrompe il flusso
EndIf; fine controllo conferma
; compone dei messaggi base da formattare per Sommario e Descrizione degli script
Let sSommario = StringReplaceSubstrings (GetScriptSynopsis (sNome), sCifra, msg1);
Let sDescrizione = StringReplaceSubstrings (GetScriptDescription (sNome), sCifra, msg1);
For i = iPartenza + 1 To iValore; scorre gli script da duplicare
SayFormattedMessage (OT_ERROR, msg1, NULLO, i); pronuncia il numero del suffisso elaborato
SpeechOff (); spegne la sintesi
JAWSBottomOfFile (); si porta alla fine del documento
If TagliaSpazi (ToglieTab (RigaCorrente ())) Then; se la riga non è vuota,
EnterKey (); crea una nuova riga
Else; altrimenti,
CambiaControllo (BACKSPACE); cancella il carattere precedente
If TagliaSpazi (RigaCorrente ()) Then; se nemmeno ora la riga è vuota,
EnterKey (); crea una nuova riga
EndIf; fine controllo riga precedente
EndIf; fine controllo ultima riga
Let sNuovo = FormatString (msg2, sNomeBase, i); compone il nuovo nome dello script
If !iNoTasti Then; se la scrittura dei tasti di attivazione non è stata disattivata,
Let sNuoviTasti = FormatString (sTasti, i); formatta la nuova combinazione
IniWriteStringEx (sSezione, sNuoviTasti, sNuovo, UTENTE, sFileTasti); trascrive i tasti
EndIf; fine controllo scrittura tasti
Pause ()
; avvia la procedura di creazione script, e ne immette il nome aggiornato
CambiaControllo (CONTROL_E, sNuovo)
CambiaControllo (TAB); preme il tasto Tab
CambiaControllo (BARRA_SPAZIO); imposta di creare uno script
; si porta nel campo sommario, e ne immette il contenuto aggiornato
CambiaControllo (ALT_S, FormatString (sSommario, i))
; si porta al campo Descrizione, e ne aggiorna il contenuto
CambiaControllo (ALT_D, FormatString (sDescrizione, i))
; avanza di tre controlli, passando per:
CambiaControllo (TAB); il campo Categoria
CambiaControllo (TAB); il campo Assegna A
CambiaControllo (TAB); il pulsante Ok
CambiaControllo (INVIO); chiude la procedura guidata
PriorLine (); si sposta alla riga sopra
CambiaControllo (DELETE); cancella la riga vuota sul cursore
CambiaControllo (DELETE); ne cancella un'altra
MetteTesto (sCodice, TRUE); trascrive il contenuto dello script
Pause ()
EndFor; fine scorrimento script
SpeechOn (); riattiva la sintesi
SayMessage (OT_ERROR, msgAttesa); pronuncia un avviso
Refresh ()
TypeKey (CONTROL_S); salva e compila gli script creati
EndScript
Collaudo.
1. Se la compilazione dello script riesce, si potrà completare il collaudo solo dopo aver realizzato gli script prototipo, quelli da duplicare. Per il momento, provate lo stesso a posizionarvi all'interno dello script appena salvato, "CreaSerie ()", e premete i tasti di attivazione scelti, oppure quelli consigliati "Shift+Control+Windows+P".
2. Se tutto va bene, sarete avvisati che lo script sul quale siete posizionati non ha un suffisso numerico, e per questo il flusso si concluderà senza avviare la procedura di copia.
Esercizio 11.2.19. Lo script SalvaContrassegno1.
FileScript. Default.JSS
Nome. SalvaContrassegno1
Sommario. Registra il contrassegno denominato 1.
Descrizione. Chiama la funzione di gestione dati per salvare la posizione del cursore nel documento corrente, registrandola come contrassegno numero 1.
TastiAttivazione. Control+Windows+1
Note.
1. Uno script base, per poter essere duplicato, deve avere lo stesso suffisso numerico sia nel nome, sia nella combinazione tasti che lo attiva, il quale in questo caso è il numero 1.
2. Come si può notare, i tasti di attivazione corrispondono, ad eccezione del suffisso numerico, alla combinazione usata per lo script "SalvaContrassegno ()",la quale se vi ricordate era "Control+Windows+K". Questo per facilitare la possibilità di ricordarsi, ed associare la combinazione base, "Control+Windows", proprio al salvataggio dei contrassegni.
3. Il contenuto dello script, per questo e per quello che lo segue, è quello che abbiamo già esaminato più volte, con il solo richiamo della nostra funzione di gestione dati.
Codice.
Script SalvaContrassegno1 ()
GestisceDato (); richiama la funzione generica
EndScript
11.2.20. Il collaudo della creazione delle serie di script.
Se il salvataggio va a buon fine, siamo finalmente in grado di collaudare la duplicazione in serie degli script, e grazie ad essa realizzare la prima parte degli script per gestire i contrassegni numerati.
1. posizionatevi in un punto qualsiasi del codice all'interno dello script appena salvato, "SalvaContrassegno1 ()", e premete i tasti di attivazione dello script "CreaSerie ()", "Shift+Control+Windows+P".
2. Se tutto riesce, dovrebbe proporsi una finestra di dialogo in cui si chiede di confermare fino a che numero di suffisso lo script attuale vada duplicato. Per questo, la serie di voci numeriche partirà dal numero successivo a quello del suffisso dello script base, in questo caso il numero 2.
3. All'ingresso il cursore sarà posizionato sulla voce col numero 9, anche se si potrebbe andare sino al limite impostato , che è 99. In ogni caso, cogliete l'occasione della voce selezionata per confermarla premendo Invio.
4. Sarà allora proposta un'ulteriore schermata dove confermare fino a che numero sarà duplicato lo script base, partendo dal numero 1, quello dello script base, al numero 9, quello della scelta operata . Anche in questo caso, limitatevi a confermare la scelta effettuata.
5. Se per qualche motivo voleste interrompere la procedura, sia nella prima schermata di scelta, sia nella successiva richiesta di conferma, sarà sufficiente premere il tasto Escape, o cliccare su Annulla.
6. Nel caso in cui confermiate di andare avanti, sarà avviata la procedura di copia, con il cursore che all'inizio si sposterà al termine del file script aperto, e da lì comincerà a trascrivere il codice.
7. L'avanzamento del lavoro sarà confermato dal numero progressivo degli script duplicati, che sarà pronunciato ad ogni inizio copia. dati i molti passaggi da compiere, ciascuno con le necessarie pause per non creare malfunzionamenti, la scrittura di ciascuna copia potrebbe impiegare anche circa un paio di secondi a script.
8. Al termine, sarà pronunciato un messaggio di attesa, dopo del quale sarà avviato il salvataggio e la compilazione del file script. Se tutto va bene, dovreste sentire almeno il segnale acustico di riuscita, se non il messaggio di conferma.
9. Ora, per collaudare il salvataggio dei contrassegni numerati, usate la combinazione "Windows+FrecciaSu" per tornare all'inizio dell'ultimo script creato, "SalvaContrassegno9 ()". Qui, premete la combinazione "Control+Windows+9", e dovrete essere avvisati del fatto che un contrassegno identificato con il numero 9 sia stato salvato.
10. Se volete, per completare appieno il collaudo, muovetevi all'indietro per tornare all'inizio di ciascuno script della serie appena creata, premendo di volta in volta la combinazione"Control+Windows" seguita dal numero che è presente nel suffisso numerico dello script su cui vi trovate. In ciascun caso, Jaws dovrebbe confermarvi con un messaggio il salvataggio del contrassegno numerato.
Esercizio 11.2.21. Lo script TornaContrassegno1.
FileScript. Default.JSS
Nome. TornaContrassegno1
Sommario. Torna al contrassegno denominato 1.
Descrizione. Chiama la funzione di gestione dati, per tornare al contrassegno numero 1.
TastiAttivazione. Alt+Windows+1
Note.
1. Questo script ci fornirà la base per creare l'altra serie di script, quella per tornare ai contrassegni numerati, la quale ci consentirà quindi di completare la gestione di tale tipo di contrassegni.
2. In modo analogo allo script precedente, i tasti di attivazione corrispondono, ad eccezione del suffisso numerico, alla combinazione usata per lo script "TornaContrassegno ()",la quale se vi ricordate era "Alt+Windows+K". Questo per facilitare la possibilità di ricordarsi, ed associare la combinazione base, "Alt+Windows", proprio al ritorno ai contrassegni salvati.
Codice.
Script TornaContrassegno1 ()
GestisceDato (); richiama la funzione generica
EndScript
Collaudo.
1. Se il salvataggio va a buon fine, attiviamo nuovamente la procedura per le serie di script. posizionatevi in un punto qualsiasi del codice all'interno dello script appena salvato, "TornaContrassegno1 ()", e premete i tasti di attivazione dello script "CreaSerie ()", "Shift+Control+Windows+P".
2. Confermate dapprima il 9 come suffisso finale per gli script, quindi premete Invio quando sarà proposta la conferma della scelta effettuata, ed Attendete infine il concludersi della procedura di copia degli script.
3. Se questa va a buon fine, premete i comandi di ritorno ai contrassegni di cui prima avete salvato le posizioni, premendo "Alt+Windows+9", e tutti gli altri eventuali numeri di contrassegno che sono disponibili. Se tutto riesce, dovreste tornare di volta in volta alla posizione del relativo contrassegno numerato.
4. Ora, questa gestione dei contrassegni numerati è disponibile non solo nell'Editor di Script, dove avete fatto le prove sinora, bensì in ogni altro applicativo dove abbiate collaudato il salvataggio dei contrassegni, che dovrebbero essere almeno Microsoft word e Wordpad, nonché il Blocco Note.
11.3. Il nuovo Aiuto in linea.
Un Aiuto in linea è tanto più efficace quanto riesce ad adattarsi in modo automatico al contesto in cui viene chiamato. Per questo , dopo averne realizzato una versione base nell'ottavo capitolo, ora cogliamo l'occasione di questo aggiornamento, resosi necessario dalle serie di script, per produrne la versione definitiva.
In particolare, dopo aver effettuato quest'ultima revisione, il nostro aiuto si potrà usare in tre diversi ambiti:
1. le normali applicazioni, dove produrrà informazioni sugli script da noi creati.
2. Le nostre procedure guidate, dove fornirà informazioni su funzioni, e tasti disponibili, delle singole schermate.
3. Altre schermate di conferma o inserimento, dove avrà comportamenti diversi da caso a caso.
Nel dettaglio, per quel che riguarda il suo funzionamento da dentro le normali applicazioni, come potrebbero essere l'Editor di Script, il Blocco Note o Microsoft Word e Wordpad, la nuova versione dell'Aiuto in linea ci fornirà informazioni su:
- gli script da noi creati nel modo tradizionale, con una riga ed un link ciascuno per poterli eseguire da dentro l'Aiuto stesso.
- Le serie di script, con una sola riga per ciascuna serie, nella quale sono presenti il nome base ed i numeri iniziale e finale, sia degli script, sia delle combinazioni tasti abbinate.
- Gli script a gestione personale, di cui parleremo più avanti, e che avranno l'aspetto e le funzioni di quelli creati con metodo tradizionale.
Parlando invece del secondo dei tre ambiti citati prima, quello che riguarda le procedure guidate, ne sapremo di più man mano che acquisiremo le informazioni necessarie nel corso di questo e dei prossimi due capitoli. Appare tuttavia necessario anticipare almeno un tema, che poi introdurrà il primo blocco di funzioni della sezione.
11.3.1. I pulsanti opzionali nella funzione DlgSelectItemInList ().
Nel sesto capitolo avevamo incontrato per la prima volta la funzione "DlgSelectItemInList ()",anticipando fin da allora che essa aveva sei parametri. Dopo aver utilizzato anche il quarto di questi nella nostra recente funzione "SceltaValore ()", come anticipato in quell'occasione, è giunto ora il momento di completare la conoscenza anche degli ultimi due possibili parametri opzionali.
Per evitare errori, riportiamo in sintesi le note riguardanti i primi quattro parametri di questa speciale funzione, seguite più in dettaglio da quelle che riguardano l'ultima coppia di parametri inediti:
1. L'elenco delle voci testuali da selezionare.
2. Il titolo della finestra di dialogo.
3. Il valore che indica l'ordine alfabetico.
4. Il numero della voce selezionata, sulla quale sarà posizionato il cursore, all'ingresso nella finestra di dialogo.
5. Un elenco testuale, composto da un massimo di cinque voci separate tra loro da il carattere Pipe, che rappresentano le etichette visualizzate di altrettanti pulsanti opzionali, da proporre a video assieme a quelli predefiniti, "Ok" e "Annulla".
6. Una variabile di tipo Integer, che trasmette per riferimento un valore che indica l'eventuale pulsante opzionale premuto; in questo caso, il valore assegnato alla variabile sarà positivo, e restituirà il numero del pulsante nell'ordine della sua etichetta nell'elenco; nel caso siano premuti i tasti predefiniti, tale variabile restituirà 0 per "Annulla", -1 per "Ok".
Evitando di parlare ancora del quarto parametro, che abbiamo peraltro già utilizzato, sui restanti due possiamo subito dire che sono complementari tra loro. Se il quinto parametro fornisce un elenco di pulsanti da premere, infatti, il sesto consente di capire quali di questi si sia casomai premuto, e quindi il loro utilizzo deve essere per forza contemporaneo.
Una interessante peculiarità di questi pulsanti è il modo in cui si possono attivare, il quale dipende da come ne specifichiamo il nome. Per capire meglio, facciamo subito un esempio, mettendo di seguito un elenco con le etichette di quattro pulsanti opzionali che, per maggiore chiarezza, poniamo ciascuno su una diversa riga:
modifica|
campo successivo|
campo precedente|
torna all'inizio
Se noi usassimo questo elenco, meglio se assegnato ad una variabile e comunque con i caratteri Pipe al posto dei ritorni a capo, avremmo nella nostra finestra di dialogo questi quattro pulsanti in più. Per poterli azionare, tuttavia, dovremo per forza spostarci con i tasti di movimento, Tab o Shift+Tab, ed una volta sopra al pulsante desiderato, premere Invio.
Se invece ai nomi dei pulsanti si aggiunge il carattere "&", la E Commerciale, nota anche con il termine inglese di "Ampersand", la lettera, o il carattere, che segue immediatamente questo segno speciale, diventa il tasto da premere assieme al tasto "Alt" per attivare il pulsante stesso. Creeremo così una "scelta rapida" che, se riusciamo a non usare lettere uguali per la stessa finestra di dialogo, ci consentono con un solo gesto di simulare la pressione diretta del pulsante.
Riprendendo l'elenco precedente, poniamo di seguito le etichette da porre nell'elenco con il carattere E Commerciale, seguito da un segno di Uguale e dalla scelta rapida così creata:
&modifica = Alt+M
Campo s&uccessivo = Alt+U
Campo p&recedente Alt+R
&Torna all'inizio = Alt+T
Per finire, un'importante avvertenza: Proprio per evitare di creare più pulsanti con la stessa scelta rapida, bisogna sempre tener conto che i due pulsanti predefiniti, "Ok" e "Annulla", si attivano rispettivamente con le scelte "Alt+O" e "Alt+A".
11.3.2. Le variabili globali per le procedure.
Sinora ci siamo occupati di brevi procedure, dove il dialogo tra i vari elementi di codice era garantito dal passaggio di parametri, oppure di sistemi integrati, dove i dati comuni ai diversi elementi erano trascritti sui file in formato "INI". Da qui in avanti, invece, pur continuando ad usare sia il primo sia il secondo dei sistemi citati, faremo sempre più largo uso delle variabili globali per trasmettere i dati da un elemento di codice all'altro.
Questo sistema ha il grande vantaggio di limitare al minimo l'uso dei parametri nelle funzioni, oltre a rendere sempre disponibili delle variabili senza doverle dichiarare a livello locale. Di contro, entrambi questi aspetti fanno sì che il flusso degli elementi di codice sia molto meno intuitivo, dovendo quindi conoscere l'assieme delle procedure su cui si sta lavorando per capire bene l'utilizzo di tali variabili globali.
Potrà perciò capitare, come già dalle prossime funzioni, d'imbattersi in una variabile globale di cui si controlla il contenuto, senza che in nessun altro elemento di codice si sia incontrata un'assegnazione di un valore a quella variabile. Quando ciò capiterà, cercheremo di dare qualche spiegazione in più tra le note delle schede, nella speranza di poter rendere più comprensibile il flusso del codice.
11.3.3. Creare il testo dell'aiuto nelle finestre di dialogo.
Il primo blocco di questa sezione riguarda tre funzioni, una principale e due secondarie, che si occupano di creare le informazioni d'aiuto sui tasti disponibili nelle finestre di dialogo. Tali informazioni sono prese direttamente dalle etichette dei pulsanti, quelle che abbiamo esaminato devono essere poste nel quinto parametro della funzione "DlgSelectItemInList ()", e che sono nella circostanza registrate in una variabile globale. In particolare, la prima funzione è un'altra di quelle create solo per semplificare la sintassi delle sostituzioni di testo, mentre la seconda serve a sua volta solo per facilitare la formattazione di una stringa.
Esercizio 11.3.4. La funzione NoAmpersand.
FileScript. Default.JSS
Nome. NoAmpersand
Descrizione. Rimuove i caratteri E Commerciale eventualmente presenti nella stringa passata come parametro.
Ritorni. Di tipo String. La stringa eventualmente ripulita dai caratteri E Commerciale.
Parametri.
1. sTesto. Il testo da ripulire. Di tipo String.
Novità.
1. La costante "AMPERSAND", che contiene l'omonimo carattere.
Codice.
String Function NoAmpersand (string sTesto)
Return StringReplaceSubstrings (sTesto, AMPERSAND, NULLO); rimuove il carattere
EndFunction
Esercizio 11.3.5. La funzione PremeTasto.
FileScript. Default.JSS
Nome. PremeTasto
Descrizione. Formatta una stringa con il comando che simula la pressione del tasto specificato come parametro.
Ritorni. Di tipo String. Il comando formattato.
Parametri.
1. sNome. Il nome del tasto, o della combinazione, da formattare. Di tipo String.
Codice.
String Function PremeTasto (string sNome)
Return FormatString (lstPremiTasto, sNome); restituisce il testo formattato con il nome dei tasti
EndFunction
Esercizio 11.3.6. La funzione ComponeAiuto.
FileScript. Default.JSS
Nome. ComponeAiuto
Descrizione. Raccoglie i dati in memoria per comporre le informazioni dell'Aiuto in linea.
Ritorni. Di tipo Void. Nessuno.
Novità.
1. Le nostre funzioni "NoAmpersand ()" e "PremeTasto ()".
2. La funzione integrata "StringUpper", (DatoTestualeMaiuscolo); Converte in caratteri maiuscoli il testo specificato nel suo unico parametro.
3. La funzione integrata "UserBufferAddLink", (AggiungiLinkBufferUtente); Aggiorna il contenuto dell'ambiente virtuale, ponendovi solo i primi tre dati per il collegamento che esegue il comando abbinato. A differenza dell'analoga funzione utilizzata nell'ottavo capitolo, mantiene soltanto i primi tre parametri, di cui anche in questo caso solamente il primo obbligatorio:
- Il testo da inviare al Visualizzatore Virtuale.
- Il comando che si vuole venga eseguito quando si clicca sul testo presente nel primo parametro.
- La voce che si vuole appaia nell'elenco dei link, la quale attiverebbe il comando inserito nel secondo parametro.
4. Le costanti "ALT" e "ALT_O", che corrispondono alle omonime combinazioni tasti.
Fasi.
1. Dopo aver inizializzato il Visualizzatore Virtuale, un ciclo scorre i pulsanti memorizzati nella variabile globale "gsEtichette".
2. il nome della scelta rapida che attiva ciascun pulsante sarà acquisita sommando il prefisso "Alt" alla lettera che segue il carattere E Commerciale, mentre la spiegazione del pulsante sarà la stessa etichetta, ripulita dall'E Commerciale, cui si aggiunge un termine predefinito registrato in un'altra variabile globale, "gsTermine"; in questa fase, tra le altre, saranno utilizzate le nostre funzioni "NoAmpersand ()" e "PremeTasto ()", oltre a quelle native "StringUpper ()" e "UserBufferAddLink ()".
3. Dopo aver concluso la porzione variabile delle informazioni con la seconda parte del titolo, registrato nella corrispondente variabile globale, le informazioni saranno concluse con i messaggi predefiniti che contraddistinguono anche le informazioni espresse dall'aiuto in linea tradizionale.
Codice.
Void Function ComponeAiuto ()
Var
String sInfo, ; il testo delle informazioni in linea
Int i, ; contatore dei cicli
String sNome, ; dati del singolo pulsante
String sCaldo, ; nome del tasto caldo che attiva il pulsante
String sTesto; descrizione della funzione svolta dal pulsante
EnsureNoUserBufferActive (); chiude eventuali schermate del Visualizzatore Virtuale
; Inizializza le informazioni, inviando al buffer la prima parte del titolo memorizzato
UserBufferAddText (FormatString (ttlInfoDialogo, StringSegment (gsTitolo, PIPE, PRIMA)))
For i = 1 To StringSegmentCount (gsEtichette, PIPE); scorre i pulsanti opzionali impostati
Let sNome = StringSegment (gsEtichette, PIPE, i); estrae l'etichetta sul pulsante
; rileva anche la lettera della scelta rapida, formattandola assieme al prefisso del tasto
Let sCaldo = FormatString (msg2Piu, ALT, StringUpper (SubString (sNome, StringContains (sNome, AMPERSAND) + 1, 1)))
Let sNome = NoAmpersand (sNome); rimuove il carattere E Commerciale dall'etichetta
If !StringContains (sNome, SPACE) Then; se l'etichetta del pulsante è di una sola parola,
Let sTesto = FormatString (msg2Spazi, sNome, gsTermine); vi formatta anche il soggetto
Else; altrimenti, se vi sono già due o più parole,
Let sTesto = sNome; utilizza la forma originale
EndIf; fine controllo parole etichetta
; aggiorna il contenuto del buffer, aggiungendo il comando ed il contenuto del link
UserBufferAddLink (FormatString (msg2Punto, sTesto, sCaldo), PremeTasto (sCaldo), sTesto)
EndFor; fine scansione tasti
Let sTesto = StringSegment (gsTitolo, PIPE, SECONDA); estrae anche la seconda parte del titolo,
UserBufferAddLink (sTesto, PremeTasto (ALT_O), TroncaTesto (sTesto, PUNTO)); e la aggiunge al buffer
; Chiude la serie di comandi nel buffer con il testo predefinito per il tasto Escape
UserBufferAddLink (lstEscape, PremeTasto (ALT_A), TroncaTesto (lstEscape, PUNTO))
UserBufferActivate (); visualizza il contenuto del visualizzatore virtuale
; formatta infine le righe conclusive, citando il comando d'ingresso e di uscita dalle informazioni,
Let sInfo = FormatString (hlpUltimaInfo, GetCurrentScriptKeyName (), hlpFineInfo);
; poi, le trasmette al Buffer, avviandone la lettura.
RedirectToUserBuffer (sInfo)
EndFunction
Collaudo.
1. Malgrado l'elemento sia l'ultimo del gruppo, per un vero e proprio collaudo bisognerà attendere lo script a fine sezione.
11.3.7. Le nuove versioni di NomeArchivio () e ComprimeDati ().
Due su tre delle funzioni che compongono questo blocco saranno le versioni definitive degli elementi di codice già proposti negli scorsi capitoli. Il sistema da rinnovare è l'acquisizione dell'elenco degli script di cui visualizzare le informazioni, prelevandoli dalla cartella con le impostazioni per l'Utente.
L'aspetto da aggiornare, nei confronti in particolare della versione dell'Aiuto in linea dell'ottavo capitolo, è far comprendere a Jaws se ci si trovi nel file script predefinito. Tale esigenza viene soddisfatta dalla prima funzione delle tre, che è quindi l'unico elemento davvero inedito del blocco.
Esercizio 11.3.8. La funzione ApplicativoCorrente.
FileScript. Default.JSS
Nome. ApplicativoCorrente
Descrizione. Determina il nome dell'applicativo corrente, convertendolo in quello predefinito di Jaws qualora ci si trovi nell'Editor di Script.
Ritorni. Di tipo String. Il nome dell'applicativo corrente, eventualmente convertito.
Novità.
1. Le costanti "EDITOR_ITA" e "EDITOR_ENU", le quali corrispondono al nome reale dell'Editor di Script, così come lo rileva Jaws, dapprima nella versione italiana, poi in quelle per Jaws 18, Jaws 2021 ed in lingua inglese.
Codice.
String Function ApplicativoCorrente ()
Var String sNome = GetActiveConfiguration (); dichiara e rileva il nome dell'applicazione attiva
If sNome == EDITOR_ITA ; se il nome corrisponde alla versione italiana dell'Editor di Jaws,
|| sNome == EDITOR_ENU Then; oppure se corrisponde a quella standard inglese,
Return JAWS_FILE; restituisce il nome dei file standard di Jaws
Else; altrimenti,
Return sNome; restituisce il nome rilevato
EndIf; fine controllo nome
EndFunction
Esercizio 11.3.9. La versione aggiornata di NomeArchivio ().
FileScript. Default.JSS
Nome. NomeArchivio
Novità.
1. La nostra funzione "ApplicativoCorrente ()".
Note.
1. Le modifiche rispetto alla precedente versione consistono soltanto nel sostituire la funzione integrata "GetActiveConfiguration ()", con quella appena realizzata "ApplicativoCorrente ()", quando si chiede il nome del file tasti attivo.
In questo caso, se ci si trova nell'Editor di Script, viene restituito il nome del file tasti predefinito, "Default.JKM".
Codice.
String Function NomeArchivio (int iTipo)
If iTipo == CORRENTE Then; se l'archivio da elaborare è quello dell'applicazione attiva,
Return GetActiveConfiguration () + JCF; ne restituisce il nome aggiungendo l'estensione
ElIf iTipo == PERSONALE Then; se invece l'archivio da elaborare è quello personale,
Return PS_FILE + JCF; ne restituisce il nome aggiungendo l'estensione
ElIf iTipo == APP Then; per il file Tasti dell'applicazione attiva,
Return ApplicativoCorrente () + JKM; restituisce il file tasti dell'applicazione
ElIf iTipo == JAWS Then; per il file Tasti Predefinito,
Return JAWS_FILE + JKM; utilizza l'altra costante impostata
ElIf iTipo == SEGNI Then; se l'archivio da elaborare è quello per i contrassegni,
; rimuove i riferimenti ai suffissi inglesi dei nomi, ed aggiunge etichetta ed estensione
Return FormatString ( ; restituisce il nome formattato,
msg2, ; messaggio base,
StringReplaceSubstrings (GetActiveConfiguration (), CLASSIC, NULLO), ; rimuove un suffisso,
SUFFISSO_JSI); e ne aggiunge un altro, comprensivo d'estensione
ElIf iTipo == TEMPORANEO Then; se infine è richiesto un archivio solo per la sessione,
Return FormatString ( ; restituisce nome e percorso dell'archivio temporaneo
msg3Controbarra, ; messaggio base,
GetUserSettingsDirectory (), ; percorso completo delle Impostazioni personali,
CARTELLA_SESSIONE, ; nome della sottocartella dove salvare le annotazioni,
GetActiveConfiguration () + TMP); etichetta dell'applicativo corrente
EndIf; fine controllo tipo archivio
EndFunction
Esercizio 11.3.10. La versione aggiornata di ComprimeDati ().
FileScript. Default.JSS
Nome. ComprimeDati
Ritorni. Di tipo Int. TRUE per il rilevamento di tasti, FALSE per nessun tasto.
Note.
1. La modifica più importante alla versione precedente viene dalla definizione di un tipo di ritorno "Integer", al posto di quello vuoto precedente, e quindi con la relativa descrizione che indica il restituirsi di un risultato "TRUE" o "FALSE". Tale modifica comporta anche alla fine, dopo la conclusione del ciclo di scansione degli script, una struttura di controllo per restituire un valore positivo o nullo tramite l'istruzione "Return".
2. L'altra modifica riguarda l'aggiunta di due assegnazioni che svuotano il contenuto di altrettanti parametri da trasmettere per riferimento , "sChiavi" e "sDati", che con più chiamate dalla stessa funzione finivano per rimanere in memoria anche quando gli script erano assenti.
3. Le altre modifiche sono i vari richiami alle nostre funzioni, "ChiaviUtente ()", "CambiaCampo ()" e "LeggeUtente ()", che abbiamo prodotto nel frattempo e che possiamo implementare ora per rendere più semplice il codice.
Codice.
Int Function ComprimeDati (string sFile, string sSezioni, ; intestazione con i primi due parametri,
string ByRef sChiavi, string ByRef sDati); seconda riga, con gli altri due
Var
Int j, ; contatore del ciclo primario
Int k, ; contatore del secondo ciclo
String sSezione, ; sezione del file da leggere
String sElenco, ; elenco temporaneo delle chiavi
String sChiave, ; chiave del dato
String sDato; singolo dato da leggere
Let sChiavi = NULLO; resetta l'elenco dei tasti,
Let sDati = NULLO; ed anche dei nomi di script
For j = 1 To StringSegmentCount (sSezioni, PIPE); scorre le sezioni da leggere
Let sSezione = StringSegment (sSezioni, PIPE, j); estrae una singola sezione
Let sElenco = ChiaviUtente (sFile, sSezione); rileva le chiavi dei dati dell'Utente
For k = 1 To StringSegmentCount (sElenco,PIPE); scorre l'eventuale elenco rilevato
Let sChiave = StringSegment (sElenco, PIPE, k); ne estrae la singola chiave
If !StringSegmentIndex (sChiavi, PIPE, sChiave, TRUE) Then; se la chiave non c'è,
Let sChiavi = CambiaCampo (sChiavi, sChiave, ULTIMA); la aggiunge all'elenco esistente
Let sDato = LeggeUtente (sFile, sSezione, sChiave); poi rileva il nome di script,
Let sDati = CambiaCampo (sDati, sDato, ULTIMA); e lo aggiunge al relativo elenco
EndIf; fine controllo chiavi registrate
EndFor; fine scorrimento chiavi
EndFor; fine scorrimento sezioni
If sChiavi Then; se, alla fine, dei tasti sono stati rilevati,
Return TRUE; restituisce l'esito positivo
Else; altrimenti,
Return FALSE; restituisce un risultato nullo
EndIf; fine controllo esito
EndFunction
Collaudo.
1. Anche in questo caso, per il collaudo rinviamo al primo script utile, alla fine della sezione.
11.3.11. Un accenno sugli script a gestione personale.
Come promesso, la prossima funzione ci obbliga ad anticipare qualcosa sugli script a gestione personale, che tratteremo man mano nella predisposizione dei vari elementi di codice, ma che saranno diffusamente trattati solo al termine della nostra trattazione.
Per far capire meglio di cosa stiamo parlando, iniziamo con ricordare le caratteristiche degli script tradizionali, quelli che abbiamo trattato sinora, che possiamo così sintetizzare:
1. Sono realizzati e compilati dentro all'Editor di Script, dove si assegna ad essi tutti i dati descrittivi ed i tasti di attivazione.
2. Ad essi si assegna un nome che ricorda il più possibile il compito svolto.
3. L'abbinamento tra i tasti che li attivano ed il loro nome si può verificare all'interno dei file tasti, quelli con estensione ".JKM".
Diversamente, gli script a gestione personale, che andremo più avanti a realizzare, hanno le seguenti caratteristiche:
1. Sono realizzati solo all'inizio dentro all'Editor di Script, stabilendo un gran numero di script predefiniti che poi saranno usati nei diversi applicativi, con un nome che avrà sempre la stessa base, "EseguePersonali", seguita da un suffisso numerico.
2. Il nome virtuale, quello che ci servirà per riconoscerli, i dati descrittivi e le mansioni svolte saranno invece registrati nei nostri archivi di configurazione, ed inseriti tramite una nostra procedura guidata, la quale potrà essere avviata direttamente da dentro ciascun applicativo in cui gli script personali andranno ad agire.
3. Per quanto detto al punto 1, i tasti che attivano gli script a gestione personale risulteranno abbinati ai nomi reali degli script, quelli che contengono la base predefinita ed il suffisso numerico.
Esaminandoli così in tre punti, si può far fatica anche a capire quale sia il vantaggio di questo sistema. Quello che si può anticipare è che, a pieno regime, esso consentirà una gestione molto più semplice e rapida dei file script per le varie applicazioni , permettendoci di non dover più entrare ed uscire dall'Editor di Jaws.
Inoltre, le copie di tutti gli script a gestione personale saranno memorizzate in un unico archivio. Questo permetterà di inserirne una versione nell'applicativo corrente grazie ad un solo comando, avendo poi l'opportunità anche di modificarne l'azione compiuta, o i tasti di attivazione, sempre agendo in una nostra procedura direttamente da dentro l'applicativo stesso.
A prescindere dai dettagli, per completare i prossimi elementi di codice è importante che voi sappiate che gli script a gestione personale hanno un nome reale, facilmente riconoscibile perché differisce solo tramite un suffisso numerico, ed uno virtuale, che nel codice chiameremo "alias". Questo nome virtuale ci consente comunque di identificare gli script sulla base della funzione che svolgono, in modo del tutto analogo a quello che si fa con i normali script.
Esercizio 11.3.12. La funzione ScriptPersonale.
FileScript. Default.JSS
Nome. ScriptPersonale
Descrizione. Controlla che il nome di script indicato sia uno di quelli a gestione personale.
Ritorni. Di tipo Int. TRUE, per la conferma dello script personale; FALSE, se non lo è.
Parametri.
1. sNome. Il nome dello script da controllare. Di tipo String.
2. sSuffisso. Per Riferimento. L'eventuale suffisso rilevato, qualora sia una cifra in forma testuale. Di tipo String. Parametro Opzionale.
Novità.
1. La funzione integrata "StringDiff", (DifferenzeDatiTestuali); Restituisce la parte iniziale o finale della stringa principale, indicata come primo parametro, che non sia contenuta nella stringa posta come secondo parametro; ad esempio, se come prima stringa abbiamo i due termini "Ciao Pippo", e nella seconda abbiamo invece solo "Ciao", la funzione restituirà "Pippo"; se le due stringhe indicate sono uguali, oppure non vi è alcuna uguaglianza nelle parti finali o iniziali, sarà restituita una stringa vuota.
Note.
1. Sulla base di quanto anticipato nella breve premessa, il controllo sul fatto che siano o meno degli script a gestione personale avviene confrontando il nome indicato con quello predefinito come base degli script stessi, e verificando se nel nome vi sia il suffisso numerico.
2. Se tale suffisso esiste, esso sarà usato come chiave del record dove acquisire gli altri dati relativi allo script, compreso il nome virtuale, l'"alias", che sarà casomai trasmesso per riferimento dalla funzione.
3. Nel codice, per estrapolare l'eventuale suffisso, non ci si limita solo a controllare che una stringa possa essere convertita in numero, ma viene controllato anche se il numero convertito abbia tante cifre quanti siano i caratteri che compongono la stringa. Questo perché la funzione "StringToInt ()" restituisce un numero anche se, nella stringa, dopo la cifra numerica vi si trovino anche degli altri caratteri, cosa che creerebbe dei malfunzionamenti nella procedura.
Codice.
Int Function ScriptPersonale (string sNome, string ByRef sSuffisso)
Var
Int iValore, ; valore temporaneo
Int iLungo; lunghezza dell'eventuale suffisso rilevato
; estrae le differenze del nome rispetto a quello base degli script personali
Let sSuffisso = StringDiff (sNome, FormatString (msgPersonalScript))
Let iValore = StringToInt (sSuffisso); verifica l'eventuale valore numerico della stringa,
Let iLungo = StringLength (sSuffisso); e ne misura comunque la lunghezza
If (iValore && iLungo == 1) ; se la differenza è una cifra con una lunghezza di un carattere,
|| (iValore > 9 && iLungo == 2) ; oppure, il valore è superiore a nove e una lunghezza di 2,
Return TRUE; restituisce l'esito positivo
Else; altrimenti,
Let sSuffisso = NULLO; resetta il dato,
Return FALSE; e restituisce un risultato nullo
EndIf; fine controllo suffisso
EndFunction
Collaudo.
1. Anche in questo caso, segnaliamo il secondo come un parametro opzionale, per il quale s'invita a modificare la scheda della funzione "ScriptPersonale", nel file documentazione predefinito.
Esercizio 11.3.13. La funzione CampoGlobale.
FileScript. Default.JSS
Nome. CampoGlobale
Descrizione. Controlla la registrazione di un numero di campo, casomai impostandone il valore iniziale.
Ritorni. Di tipo Int. Il numero del campo attivo.
Per ulteriori spiegazioni, scrivere a:
Abramo Volpato, oppure, a: Nunziante Esposito