Logo dell'UIC Logo TUV

Unione Italiana dei Ciechi e degli Ipovedenti ETS - APS

 

Uiciechi.it

torna alla visualizzazione del numero 11 del Uiciechi.it

Numero 11 del 2021

Titolo: gli script di jaws 14b. Le procedure guidate: gestione dei pulsanti ed elementi base.

Autore: Abramo Volpato.


Articolo:
gli script di jaws 14b. Le procedure guidate: gestione dei pulsanti ed elementi base.

Di Abramo Volpato.

Novità.

1. La costante "GIU", che corrisponde all'omonimo termine.

Fasi.

1. Una prima struttura di controllo imposta un valore, positivo o negativo di un'unità, per incrementare o diminuire il valore della voce corrente, sulla base del parametro specificato.

2. Dopo aver eseguito le necessarie impostazioni, una seconda struttura tenta di eseguire la scrittura del record da spostare nella nuova posizione; se tale scrittura riesce, allora viene aggiornata la posizione del record appena sovrascritto, copiandolo con la chiave di quello elaborato, e restituendo l'esito positivo.

3. Se invece la scrittura dei record non riesce, viene restituito un risultato nullo.

Note.

1. Ecco qui un'altra delle funzioni per la gestione dei tasti premuti, in questo caso "sposta giù" e "Sposta su".

Codice.

Int Function ScambiaVoci (string sCorrente, string sVerso)
Var
Int iCambia, ; il valore da applicare al puntatore della voce corrente
String sChiave, ; l'ordine progressivo della voce da scambiare in forma testuale
String sRecord; i dati relativi alla voce selezionata.

If sVerso == GIU Then; se si indica la costante omonima,
Let iCambia = 1; imposta un valore positivo, per elaborare la voce successiva
Else; altrimenti, se si specifica qualsiasi altro dato testuale,
Let iCambia = -1; imposta un valore negativo, per elaborare la voce precedente
EndIf; fine controllo valore relativo
; compone la chiave della voce da rendere attiva,
Let sChiave = ChiaveCorrente (gnValore + iCambia)
Let sRecord = LeggeRecord (gsArchivio, gsSezione, sChiave); e ne rileva il dato
; se la voce da spostare, quella corrente, viene salvata nella nuova posizione,
If ScriveRecord (gsArchivio, gsSezione, sChiave, sCorrente) Then
; la voce sovrascritta viene copiata nella posizione precedente,
ScriveRecord (gsArchivio, gsSezione, ChiaveCorrente (gnValore), sRecord)
Let gnVoce = gnValore + iCambia; quindi, viene aggiornato il puntatore delle voci,
Return TRUE; e restituito l'esito positivo
Else; altrimenti, in caso di errore nella scrittura,
Return FALSE; restituisce un risultato nullo
EndIf; fine controllo scrittura
EndFunction

Esercizio 14.2.10. La funzione CancellaRecord.

FileScript. Default.JSS

Nome. CancellaRecord

Descrizione. Rimuove la chiave indicata dell'archivio di configurazione di cui si è specificato il nome, senza l'estensione .JCF, presente nella cartella delle Impostazioni personali.

Ritorni. Di tipo Int. L'esito della cancellazione, TRUE o FALSE.

Parametri.

1. sArchivio. Il nome, senza estensione, dell'archivio da elaborare. Di tipo String.

2. sSezione. La sezione dell'archivio in cui operare. Di tipo String.

3. sChiave. La chiave da rimuovere. Di tipo String.

Note.

1. Nella struttura di controllo che compone la funzione, la prima via è dedicata alla cancellazione della chiave , qualora quest'ultima sia stata specificata; se questo dato invece non c'è, viene interrotto il flusso, restituendo un risultato nullo, in quanto l'istruzione nativa, priva di una chiave, rimuoverebbe tutto il contenuto della sezione elaborata.

Codice.

Int Function CancellaRecord (string sArchivio, string sSezione, string sChiave)
If sChiave Then; se una chiave da cancellare è specificata,
ImpostaConfigurazione (sArchivio); controlla il nome, casomai aggiungendovi l'estensione,
Return IniRemoveKey (sSezione, sChiave, sArchivio); e ne restituisce l'esito
Else; altrimenti, se una chiave non c'è,
Return FALSE; restituisce un risultato nullo
EndIf; fine controllo chiave
EndFunction

Esercizio 14.2.11. La funzione EliminaVoce.

FileScript. Default.JSS

Nome. EliminaVoce

Descrizione. Gestisce la cancellazione di una voce nelle finestre di scelta.

Ritorni. Di tipo Int. L'esito della cancellazione, TRUE o FALSE.

Novità.

1. La nostra funzione "CancellaRecord ()".

Fasi.

1. Il primo controllo è una richiesta di conferma alla cancellazione al quale, se si risponde in modo negativo, il flusso sarà interrotto.

2. Nella seconda struttura si tenta invece di cancellare il record indicato, tramite la nostra funzione "CancellaRecord ()"; anche in questo caso, se tale azione fallisse, il flusso verrebbe interrotto.

3. Una volta cancellato il record, un'ultima ed articolata struttura di controllo regola le impostazioni sulla base del tipo di procedura che si sta elaborando; Nel caso dei primi due tipi, qualora non si sia nell'ultima voce visualizzata, si tenta di far scorrere le altre voci, casomai restituendo un risultato nullo qualora tale aggiornamento non riesca.

Note.

1. Questa è un'altra funzione di gestione, dove anche qui il pulsante che la chiama è quello che compone la prima parte del nome, "Elimina".

Codice.

Int Function EliminaVoce ()
Var
String sPrefisso, ; parte iniziale del titolo
String sTitolo; titolo per la conferma alla cancellazione

; mantiene gli ultimi tre caratteri del prefisso per il tipo di procedura
Let sPrefisso = StringRight (StringSegment (lstPrefissiTesto, PIPE, gnTipo), 3)
; formatta il titolo da proporre nella finestra di dialogo
Let sTitolo = FormatString (msgCancella, sPrefisso, gsCategoria, ComponeTermine ())
If !ChiedeConferma (sTitolo) Then; se tale cancellazione non viene confermata,
Return FALSE; restituisce un risultato nullo
EndIf; fine controllo conferma
Delay (ATTESA); sospende temporaneamente il flusso
; salva i tasti memorizzati nel record per l'eventuale cancellazione
Let gsRimuoviTasti = LeggeCampo (gsArchivio, gsSezione, gsChiave, SECONDA)
If !CancellaRecord (gsArchivio, gsSezione, gsChiave) Then; se la rimozione fallisce,
Let gsRimuoviTasti = NULLO; resetta il dato,
Return FALSE; e restituisce un risultato nullo
EndIf; fine controllo cancellazione
Let gsAvviso = msgOkCancella; memorizza il messaggio
If gnTipo == TERZA Then; se si sta elaborando il terzo tipo di procedura,
AggiornaTasti (CANCELLA, gsChiave); rimuove le eventuali assegnazioni tasti dello script,
; cancella la chiave anche dall'elenco, per la successiva sincronizzazione
Let gsElenco = CambiaCampo (gsElenco, NULLO, gnVoce)
Delay (ATTESA); sospende temporaneamente il flusso
If gnVoce == gnTotali Then; se ci si trovava sull'ultima voce,
Let gnVoce = gnVoce - 1; sposta la voce corrente a quella precedente
EndIf; fine controllo aggiornamento posizione
Else; altrimenti, se si è in uno dei primi due tipi,
If gnValore < gnTotali Then; se esiste almeno un valore dopo quello corrente,
If AggiornaElenco (gnValore) Then; se è stato aggiornato l'elenco dei dati registrati,
CancellaRecord (gsArchivio,gsSezione, ChiaveCorrente (gnTotali)); cancella l'ultimo dato
Else; altrimenti, in caso di errore,
Return FALSE; restituisce un risultato nullo
EndIf; fine controllo rimozione dato
Else; altrimenti, se ci si trovava sull'ultima voce,
Let gnVoce = gnValore - 1; aggiorna il puntatore delle voci
EndIf; fine controllo numero voci
Let gsElenco = CambiaCampo (ChiaviUtente (gsArchivio, gsSezione), ZERO); aggiorna l'elenco delle voci
EndIf; fine controllo tipo procedura
Let gnTotali = StringSegmentCount (gsElenco, PIPE); conta le voci in elenco
If !gnTotali Then; se non esiste più alcuna voce,
Let gnVoce = FALSE; azzera il valore
EndIf; fine controllo voci totali
Let gsChiave = ChiaveCorrente (gnVoce); allinea anche la chiave attiva
Return TRUE; restituisce l'esito positivo
EndFunction

14.2.12. Un archivio con gli script realizzati.

Uno dei vantaggi che si hanno con gli script a gestione personale è quello di avere un vero e proprio archivio di tutti gli script di questo tipo da noi elaborati, che quindi possono essere usati per essere inseriti in tutte le applicazioni dove possono servire. Tutti i dati necessari ad uno script a gestione personale, infatti, stanno in un solo record con cinque campi, che corrisponde al numero di schermate in cui dovremo operare per realizzarne uno.

La funzione che proponiamo di seguito è quella che serve proprio per inserire uno script, proveniente dall'archivio personale, tra quelli a disposizione per le singole applicazioni. Una volta attivato il pulsante di duplicazione, basterà scegliere dall'elenco a video il nome reale dello script da inserire, casomai esaminando i tasti per attivarlo o la prima parte della descrizione, poi premere Invio. Una volta aggiunto all'elenco, lo script duplicato potrà comunque essere anche rinominato, modificato o adattato all'applicazione attiva, oppure lasciato così com'è, se la sua forma risulta già corretta.

Proprio questa funzionalità sarà quella, alla fine del capitolo, che useremo per testare la procedura guidata sugli script a gestione personale.

Esercizio 14.2.13. La funzione DuplicaDati.

FileScript. Default.JSS

Nome. DuplicaDati

Descrizione. Consente di inserire tra gli script a gestione personale dell'applicativo corrente i dati relativi ad uno di tali script, registrati nel file di configurazione personale.

Ritorni. Di tipo Int. Il valore numerico della scelta effettuata.

Novità.

1. La costante numerica "MAX_LUNGO", equivalente al valore 120, che corrisponde al numero massimo di caratteri provenienti dal sommario, da utilizzare come voce a video per gli script a gestione personale di cui inserire una copia.

Fasi.

1. La prima struttura di controllo verifica se vi siano degli script a gestione personale registrati nell'archivio; qualora non ce ne siano, sarà impostato un messaggio d'avviso ed il flusso sarà interrotto.

2. Dopo aver raccolto le voci già presenti a video, un ciclo scorre gli script registrati, dapprima non aggiungendo all'elenco quelli con un nome già presente, poi formattando lo stesso nome, i tasti di attivazione e la prima parte del sommario per comporre le varie voci di scelta.

3. Dopo aver riattivato la sintesi, viene proposta una schermata dove scegliere con i tasti di movimento lo script da inserire, da confermare poi con Invio; qualora si premesse invece il tasto Escape, si tornerebbe direttamente alla procedura principale.

4. Se una scelta viene operata, il nome dello script confermato, ed i suoi dati, sono formattati assieme in un record con chiave numerica, tentando di scriverli nell'archivio per l'applicazione corrente; Se la scrittura riesce, sono aggiornati tutti gli indicatori per inserire e selezionare lo script aggiunto, restituendo l'esito positivo; se infine la scrittura non riuscisse, si tornerebbe alla procedura, senza modificare l'elenco degli script e quello su cui sarà posizionato il cursore.

Note.

1. Questa invece è l'ultima funzione di gestione, dove la prima parte del nome corrisponde al pulsante da premere per chiamarla, "Duplica".

Codice.

Int Function DuplicaDati ()
Var
String sChiavi, ; elenco dei nomi di script
String sPresenti, ; nomi degli script già attivi
Int i, ; contatore del ciclo
String sRecord, ; dati relativi ad uno script
String sNome, ; chiave dei dati sugli script
String sVoce, ; testo della voce a video
String sElenco, ; lista degli script da duplicare
Int iScelta, ; valore della scelta operata
String sSommario, ; sommario dello script
String sChiave; chiave dello script nell'archivio corrente

Let sChiavi = LeggeChiavi (PERSONALE, gsSezione); rileva l'elenco delle chiavi
If !sChiavi Then; se nessuno script è presente nell'archivio di quelli a gestione personale,
Suona (ERRORE1); emette un segnale acustico
Let gsAvviso = hlpNoArchivioScript; imposta un messaggio d'avviso,
Return; e interrompe il flusso
EndIf; fine controllo presenza script
; rileva i nomi degli script già attivi nell'applicazione, portandoli in caratteri minuscoli
Let sPresenti = StringLower (CreaElenco (gsArchivio, gsSezione, PRIMA, PIPE))
; scorre le chiavi relative agli script personali
For i = 1 To StringSegmentCount (sChiavi, PIPE)
; estrae il nome dello script, che funge da chiave del record
Let sNome = StringSegment (sChiavi, PIPE, i)
; se lo script non è già presente,
If !StringSegmentIndex (sPresenti, PIPE, StringLower (sNome), TRUE) Then
Let sRecord = LeggeDato (PERSONALE, gsSezione, sNome); memorizza il record dei dati
; estrae il sommario, togliendo l'eventuale Punto alla fine, e riducendolo in lunghezza
Let sSommario = StringLeft (TogliePunto (StringSegment (sRecord, PIPE, SECONDA)), MAX_LUNGO)
; compone la voce, formattando nome, tasti e sommario in una stringa separata da punti
Let sVoce = FormatString (msg3Punto, sNome, TroncaTesto (sRecord), sSommario)
Let sElenco = CambiaCampo (sElenco, sVoce, ULTIMA); aggiunge la voce all'elenco
EndIf; fine controllo script attivi
EndFor; fine scansione nomi
If !sElenco Then; se nessun script da duplicare è stato rilevato,
Suona (ERRORE1); emette un segnale acustico
Let gsAvviso = hlpNoArchivioScript; imposta un messaggio d'avviso,
Return; e interrompe il flusso
EndIf; fine controllo script validi
SpeechOn (TRUE); riattiva la sintesi
; consente la selezione di uno script di cui inserire copia
Let iScelta = DlgSelectItemInList (sElenco, ttlDuplicaScript, TRUE)
SpeechOff (TRUE); torna a spegnere la sintesi
If !iScelta Then; se nessuna scelta è stata effettuata,
Return FALSE; restituisce un risultato nullo
EndIf; fine controllo scelta
; ricava il nome dello script, che funge da chiave del record
Let sNome = TroncaTesto (StringSegment (sElenco, PIPE, iScelta), PUNTO)
; rileva anche il record dall'archivio personale
Let sRecord = LeggeDato (PERSONALE, gsSezione, sNome)
; pone i dati estratti in un nuovo record
Let sRecord =FormatString (msg2Pipe, sNome, sRecord)
Let sChiave = PrimaLibera (); individua la prima chiave libera tra quelle possibili
If ScriveRecord (NULLO, gsSezione, sChiave, sRecord) Then; se la scrittura riesce,
Let gsElenco = CambiaCampo (gsElenco, sChiave, ULTIMA); aggiorna l'elenco delle voci
Delay (ATTESA); sospende temporaneamente il flusso
Let gsNuoviTasti = CambiaCampo (gsNuoviTasti, sChiave, ULTIMA) ; annota i tasti cambiati
Let gsChiave = sChiave; rende globale la chiave definita
Let gnVoce = StringSegmentCount (gsElenco, PIPE);adegua la posizione della voce attiva,
Let gnTotali = gnVoce; ed allinea anche il totale delle voci presenti
Let gnAggiorna = TRUE; imposta il valore per l'uscita dal primo ciclo
Let gsAvviso = msgCopiaScript; imposta anche il messaggio,
Return TRUE; e restituisce l'esito positivo
Else; altrimenti, se la scrittura fallisce,
Let gsAvviso = msgErroreCopia; imposta il messaggio,
Return FALSE; e restituisce un risultato nullo
EndIf; fine controllo scrittura
EndFunction

Esercizio 14.2.14. La funzione EsitoPulsanti.

FileScript. Default.JSS

Nome. EsitoPulsanti

Descrizione. Svolge le azioni previste sulla base dei tasti premuti, casomai impostando un avviso che sarà pronunciato al ritorno nella finestra di dialogo.

Ritorni. Di tipo Int. TRUE, per un'azione eseguita correttamente; FALSE, per un pulsante non valido, o per un'azione interrotta.

Novità.

1. Le nostre funzioni "PulsanteValido ()", "AggiungeVoce ()", "EstraeCampo ()", "EliminaVoce ()", "ScambiaVoci ()" e "DuplicaDati ()".

2. Le costanti testuali "MODIFICA", "ELIMINA" e "DUPLICA", che corrispondono ciascuna al termine omonimo.

Fasi.

1. Una prima breve struttura di controllo verifica la validità del tasto premuto, grazie alla nostra funzione "PulsanteValido ()"; se la pressione non fosse corretta, sarebbe impostato un messaggio, emesso un segnale acustico, e interrotto il flusso.

2. All'interno della restante struttura, che analizza la pressione dei singoli tasti validi, la prima via viene intrapresa quando si vuole aggiungere una voce a quelle già presenti, tramite la quasi omonima nostra funzione "AggiungeVoce ()"; in questa, come in tutte le altre vie di questo tipo, se l'azione collegata al pulsante premuto non riesce, o viene interrotta, si imposta un messaggio d'avviso e s'interrompe il flusso restituendo un risultato nullo.

3. Le successive tre vie della struttura causano delle azioni solo di spostamento, rispettivamente, alla schermata precedente, successiva, o la prima; in questo caso, sono modificati solo dei valori per il cambio schermata, e non sono previsti risultati nulli.

4. La via alternativa alle prime quattro è quella che gestisce tutti gli altri tasti, iniziando subito col rilevare il contenuto del campo corrente; poi, ciascuna via della struttura interna a questa mantiene lo schema di quella iniziale; nel dettaglio, una funzione è sempre chiamata a compiere l'azione prevista dal pulsante, con il flusso che s'interrompe solo nel caso di errori o interruzioni provocate dall'utente; in queste fasi sono di volta in volta chiamate, a seconda del pulsante premuto, le nostre funzioni"EstraeCampo ()", "EliminaVoce ()", "ScambiaVoci ()" e "DuplicaDati ()".

5. Unica eccezione in tal senso è la pressione del tasto "Modifica" quando ci si trova nella gestione degli script personali, e nel secondo campo; in questo caso, infatti, viene attivata l'attesa dei tasti di attivazione degli script che, se ricordate, si realizza uscendo temporaneamente dalla procedura, e chiamando nel contempo quella con le funzioni hook.

6. Un'altra possibilità di interruzione del flusso con un risultato nullo la si ha nel caso in cui l'etichetta del pulsante premuto, ripulita dagli eventuali caratteri E Commerciale, non sia riconosciuta tra quelle abbinate ad una qualche azione da compiere.

7. In tutti i casi in cui un pulsante valido sia stato premuto, ed il flusso non venga interrotto, al termine della struttura principale si ritorna all'elemento chiamante restituendo un valore positivo.

Codice.

Int Function EsitoPulsanti ()
Var
String sNome, ; nome ripulito del pulsante premuto
String sDato; dato temporaneo

; estrae l'etichetta del pulsante premuto
Let sDato = StringSegment (gsEtichette, PIPE, gnTasto)
; rileva il termine con la E Commerciale, lo memorizza e poi lo ripulisce dal carattere speciale
Let sNome = NoAmpersand (StringSegment (sDato, SPACE, StringSegmentIndex (sDato, SPACE, AMPERSAND)))
Let gnVoce = gnValore; allinea il puntatore delle voci alla posizione corrente
If !PulsanteValido (sNome, gnTasto) Then; se la pressione del pulsante non è valida,
Suona (ERRORE1); emette un suono di avviso,
Return FALSE; e restituisce un risultato nullo
EndIf; fine controllo validità
If sNome == AGGIUNGE Then; se si vuole aggiungere una voce,
If !AggiungeVoce () Then; se l'aggiunta non riesce, imposta l'avviso
Let gsAvviso = FormatString (hlpNessuna, EstraeCampo(lstEseguiteVoci, sNome, lstAzioniVoci))
Return FALSE; restituisce un risultato nullo
EndIf; fine controllo esito aggiunta
ElIf sNome == PRECEDENTE Then; se si vuole tornare ad un livello di scelta precedente,
Let gnCampo = gnCampo -1; sposta indietro il puntatore dei campi,
Let gnAggiorna = TRUE; e imposta il valore per l'uscita dal ciclo nella funzione chiamante
ElIf sNome == SUCCESSIVO Then; se invece si vuole andare al livello successivo,
Let gnTasto = -1; simula la pressione della conferma
ElIf sNome == TORNA Then; se si vuole tornare alla schermata iniziale,
Let gnCampo = PRIMA; imposta il valore relativo
Let gnAggiorna = TRUE; e imposta quello per l'uscita dal ciclo nella funzione chiamante
Else; altrimenti, se si vuole agire sulle voci esistenti,
Let sDato = LeggeCampo(gsArchivio, gsSezione, gsChiave); rileva il dato relativo alla voce
If sNome == MODIFICA Then; se si vuole modificare la voce corrente,
If gsCategoria == SCRIPTS ; se si stanno elaborando gli script a gestione personale,
&& gnCampo == SECONDA Then; e ci si trova nella fase di immissione tasti,
Let gnFerma = CATTURA; imposta di attenderne la pressione,
Return FALSE; e restituisce un risultato nullo
Else; altrimenti, in tutti gli altri casi,
; se l'aggiornamento fallisce, imposta l'avviso
If !AggiornaCampo (sNome, gsSezione, gsChiave, sDato) Then
Let gsAvviso = FormatString (hlpNessuna, EstraeCampo(lstEseguiteVoci, sNome, lstAzioniVoci))
Return FALSE; e restituisce un risultato nullo
Else; altrimenti, se la modifica riesce,
Delay (ATTESA); sospende temporaneamente il flusso
If gsCategoria == SCRIPTS Then; se si stanno elaborando gli script a gestione personale,
Let gnCambiati = TRUE; attiva il controllo nell'archivio
EndIf; fine secondo controllo categoria
EndIf; fine controllo esito aggiunta
EndIf; fine primo controllo categoria
ElIf sNome == ELIMINA Then; se invece la voce corrente s'intende cancellarla,
If !EliminaVoce () Then; se la cancellazione non riesce, imposta l'avviso
Let gsAvviso = FormatString (hlpNessuna, EstraeCampo(lstEseguiteVoci, sNome, lstAzioniVoci))
Return FALSE; e restituisce un risultato nullo
EndIf; fine controllo esito cancellazione
ElIf sNome == GIU ; se si vuole spostare la posizione della voce più in basso,
|| sNome == SU Then; oppure, se la si vuole spostare verso l'alto,
If !ScambiaVoci (sDato, sNome) Then; se lo scambio con la voce richiesta non riesce,
Let gsAvviso = FormatString (hlpErroreDato, SALVA); formatta e memorizza l'avviso
Return FALSE; e restituisce un risultato nullo
EndIf; fine controllo scambio tra le voci
ElIf sNome == DUPLICA Then; se si vuole selezionare uno script archiviato di cui inserire una copia,
If !DuplicaDati () Then; se tale inserimento fallisce, formatta il messaggio
Let gsAvviso = FormatString (hlpNessuna, EstraeCampo(lstEseguiteVoci, sNome, lstAzioniVoci))
Return FALSE; e restituisce un risultato nullo
EndIf; fine controllo duplicazione
Else; altrimenti, se l'etichetta non è stata riconosciuta,
Let gsAvviso = FormatString (hlpNoEtichetta, sNome); formatta e memorizza un avviso
Return FALSE; e restituisce un risultato nullo
EndIf; fine controllo azioni di modifica
EndIf; fine controllo etichette
Return TRUE; restituisce l'esito positivo
EndFunction

Esercizio 14.2.15. La funzione NuovoAmbito.

FileScript. Default.JSS

Nome. NuovoAmbito

Descrizione. Controlla, e casomai aggiorna o imposta, l'ambito su cui si è usciti dalla schermata di scelta.

Ritorni. Di tipo Int. TRUE, per un ambito di funzionamento degli script correttamente aggiornato; FALSE; per nessun aggiornamento.

Fasi.

1. Una prima struttura di controllo verifica che l'ambito da aggiornare non sia uguale a quello già memorizzato; se così è, il flusso s'interrompe restituendo un risultato nullo.

2. Dopo aver rilevato il record corrente, una seconda struttura inizia col controllare che un record sia presente; se così è, dapprima lo si aggiorna con il nuovo ambito, poi si tenta di trascriverlo nell'archivio; se la scrittura riesce, si imposta un avviso e viene restituito l'esito positivo.

3. Se un record non esiste, oppure se la scrittura non riesce, si imposta un messaggio d'errore e viene invece restituito un risultato nullo.

Note.

1. Questa funzione agisce dopo aver selezionato o modificato gli ambiti, nella sola schermata che abbiamo anticipato essere l'ultima nella procedura di elaborazione degli script a gestione personale.

Codice.

Int Function NuovoAmbito ()
Var
String sDato, ; dato temporaneo
String sRecord; elenco di dati

Let sDato = ChiaveCorrente (gnValore); estrae l'ambito selezionato all'uscita
If sDato == gsAmbito Then; se quello estratto è uguale all'ultimo registrato,
Return FALSE; restituisce un risultato nullo
EndIf; fine controllo congruenza ambiti
Let sRecord = LeggeRecord (gsArchivio, gsSezione, gsChiave); rileva l'intero record di dati
If sRecord Then; se i dati sono stati rilevati,
Let sRecord = CambiaCampo (sRecord, sDato, gnCampo); aggiunge o aggiorna l'ambito rilevato
If ScriveRecord (gsArchivio, gsSezione, gsChiave, sRecord) Then; se la scrittura riesce,
Let gsAvviso = hlpOkAmbito; imposta un avviso sull'esito,
Return TRUE; e restituisce l'esito positivo
EndIf; fine controllo scrittura
EndIf; fine controllo record
; se il flusso non è stato interrotto, imposta un messaggio d'errore
Let gsAvviso = FormatString (hlpErroreAmbito, sDato)
Return FALSE; e restituisce un risultato nullo
EndFunction

Esercizio 14.2.16. La funzione ScelteProcedura.

FileScript. Default.JSS

Nome. ScelteProcedura

Descrizione. Analizza le possibili scelte attive nella finestra di dialogo.

Ritorni. Di tipo Int. TRUE, se le scelte confermano il flusso; FALSE, nel caso si attivi l'attesa dell'immissione dei nuovi tasti di attivazione negli script.

Novità.

1. Le nostre funzioni "EsitoPulsanti ()" e "NuovoAmbito ()".

Fasi.

1. Una prima struttura di controllo intercetta il flusso nel caso in cui si stia uscendo dalla schermata iniziale, eseguendo le impostazioni relative.

2. La seconda struttura interviene quando è stato premuto un tasto opzionale; se così è, tramite la nostra funzione "EsitoPulsanti ()", si verifica poi se il controllo sui pulsanti abbia restituito un risultato nullo e, in tal caso, se si sia attivata l'attesa dei tasti di attivazione; se tutte queste condizioni sono rispettate, viene avviata la nostra funzione di cattura tasti.

3. La terza struttura si occupa invece di intercettare la pressione del tasto Invio, quando non si sia nella schermata iniziale e non sia ancora stata chiesta l'uscita dalla procedura; se così è, sono effettuate due serie di impostazioni, la prima valida se ci si trova nell'ultimo campo della procedura, ed in tal caso chiamando anche la nostra funzione "NuovoAmbito ()", mentre l'altra entra in azione in tutti gli altri campi dal secondo al quarto.

4. Se si esce regolarmente dall'ultima struttura, viene restituito alla funzione chiamante un valore positivo.

Note.

1. Questa funzione prevede vari livelli delle strutture di controllo, annidati tra di essi; tale conformazione non può però essere semplificata, in quanto è necessario che il flusso, una volta che si presentino determinate condizioni, sia comunque intercettato, a prescindere dal fatto che poi gli ulteriori livelli di controllo risultino positivi, andando così ancora più in profondità nella struttura.

Codice.

Int Function ScelteProcedura ()
If gnCampo == PRIMA Then; se si sta uscendo dalla prima schermata,
ScriveNumerico (gsArchivio, gsSezione, ZERO, gnValore); annota l'ultima voce selezionata,
Let gsChiave = ChiaveCorrente (gnValore); ne estrae la chiave corrispondente,
Let gsAttiva = LeggeCampo (gsArchivio, gsSezione, gsChiave); ed imposta la voce corrente
EndIf; fine controllo campo

If gnTasto > FALSE Then; se è stato premuto uno dei pulsanti opzionali,
If !EsitoPulsanti () Then; se le azioni sui pulsanti hanno dato esito negativo,
If gnFerma ==CATTURA Then; se si è indicato di specificare i tasti di attivazione,
CatturaDato (); chiama l'apposita funzione,
Let gnFerma = FALSE; annulla il valore per il ritorno alla schermata di scelta,
Return FALSE; e restituisce un risultato nullo
EndIf; fine controllo cattura tasti
EndIf; fine controllo esito elaborazione
ElIf gnCampo == PRIMA ; se invece si è premuta la conferma, provenendo dalla prima schermata,
&& gnTasto != -2 Then; ed il tasto non è stato settato per il cambio campo,
Let gnUscita = TRUE; ne segna la conclusione
EndIf; fine controllo tasti

If gnTasto < FALSE ; se si è premuta la conferma, dalla seconda schermata in poi,
&& !gnUscita Then; e non è stata ancora determinata l'uscita da entrambi i cicli,
If gnCampo == gnMaxCampi Then; se il campo corrente coincide con il massimo possibile,
If gsCategoria == SCRIPTS ; se si stanno elaborando gli script a gestione personale,
&& NuovoAmbito () Then; e l'ambito è stato impostato o aggiornato,
Let gnCambiati = TRUE; attiva il controllo nell'archivio
EndIf; fine controllo categoria
Let gnCampo = PRIMA; torna alla schermata iniziale,
Let gnAggiorna = TRUE; e imposta il valore per consentire l'uscita solo dal primo ciclo
Else; altrimenti, se si stanno elaborando più campi,
Let gnCampo = gnCampo + 1; porta avanti il numero dei campi
Let gnAggiorna = TRUE; e consente l'uscita dal primo ciclo
EndIf; fine controllo tipo conclusione
EndIf; fine controllo tasti premuti
Return TRUE; restituisce l'esito positivo
EndFunction

14.3. La gestione dell'archivio centrale.

Questo breve blocco è composto da una sola funzione, la quale come detto viene chiamata direttamente dall'elemento principale del sistema. Così come in molti altri casi, la funzione che segue faceva parte del codice iniziale, a cui è stata sottratta per semplificarne la comprensione.

Il suo compito è di gestire sia il controllo del numero di dati inseriti per un record, sia la registrazione degli script nell'archivio personale, posto nella cartella con le impostazioni per l'Utente.

Esercizio 14.3.1. La funzione AggiornaArchivio.

FileScript. Default.JSS

Nome. AggiornaArchivio

Descrizione. Controlla, e casomai aggiunge, i dati dei nuovi script nell'archivio personale, consentendo di sovrascrivere un'eventuale registrazione già presente che avesse in comune almeno il nome dello script.

Ritorni. Di tipo Void. Nessuno.

Fasi.

1. Una prima struttura di controllo verifica se i campi del record corrente siano nel numero esatto; se così non è, il flusso viene interrotto.

2. Dopo aver rilevato i dati necessari, una seconda struttura controlla se nell'archivio personale esistano già degli script con il nome di quello appena creato; se così è, viene proposta la conferma all'eventuale sovrascrittura dei dati registrati; se non si conferma la sovrascrittura, il flusso s'interrompe.

3. Se invece il flusso prosegue, viene rimosso il primo campo del record originale, quello che avrebbe il nome dello script come chiave, e si aggiornano i dati nell'archivio; sulla base dell'esito della scrittura, viene impostato un avviso.

Codice.

Void Function AggiornaArchivio ()
Var
String sRecord, ; dati del nuovo script
String sNome, ; nome dello script
String sDati, ; dati dell'eventuale script archiviato
String sTitolo; titolo per la finestra di dialogo

If !NumeroDati (gsChiave, sRecord) Then; se i dati registrati non sono completi,
Return; interrompe il flusso
EndIf; fine controllo numero dati
Let gnCambiati = FALSE; annulla il valore
Let sNome = StringSegment (sRecord, PIPE, PRIMA); estrae il nome dal primo elemento del record
Let sDati = LeggeDato (PERSONALE, gsSezione, sNome); rileva l'eventuale presenza dello script
If sDati Then; se nell'archivio sono già presenti dei dati con lo stesso nome di script,
Let sTitolo = FormatString (ttlScriptPresente, sNome); formatta il titolo per la sovrascrittura
If !ChiedeConferma (sTitolo, msgSovrascrittura, FALSE, SECONDA) Then; se la conferma non c'è,
Return; interrompe il flusso
EndIf; fine controllo sovrascrittura
EndIf; fine controllo presenza dati
Let sRecord = CambiaCampo (sRecord, NULLO, PRIMA); rimuove il primo campo del record
If ScriveRecord (PS_FILE, gsSezione, sNome, sRecord) Then; se la scrittura riesce,
Let gsAvviso = hlpScritturaOk_corto; imposta l'avviso
Else; altrimenti, se i dati non sono stati registrati,
Let gsAvviso = hlpNoScrittura_corto; segnala l'errore
EndIf; fine controllo scrittura
EndFunction

***

Per ulteriori spiegazioni, scrivere a:
Abramo Volpato, oppure, a: Nunziante Esposito



Torna alla pagina iniziale della consultazione delle riviste

Oppure effettua una ricerca per:


Scelta Rapida