Sincronizza Indice |
Scarica il progetto |
Testo dell'articolo |
Stampa l'articolo |
Ho bisogno di scrivere un programmino che, dopo aver analizzato dei files contenenti dei particolari tracciati, estragga dei dati da un foglio di Excel e tramite questi generi dei files di testo con una particolare struttura determinata dal file del tracciato.
Nel momento in cui l'utente clicca sul nome di una sezione dalla ListBox ListaSezioni saranno mostrati i dati che tale sezione contiene.
Il click sopra un elemento estrarrà la sezione corrispondente dalla Collection SEZIONI (riga 54). Da tale sezione saranno letti, uno per uno, i valori al fine di impostare i controlli dell'interfaccia in modo da farli corrispondere con i dati della sezione (righe 55-61).
Non avrebbe molto senso dare all'utente la possibilità di inserire nuove sezioni ma non poterle eliminare dalla Collection delle sezioni. Così, nel momento del click sul pulsante PulsanteEliminaSezione viene, innanzitutto, ricliccata la sezione dalla ListBox ListaSezioni (riga 68), in modo da ottenere la sezione evidenziata sulla RichTextBox FileTracciato. Ottenuto questo sarà ripristinato il colore nero originario (riga 69), sarà eliminata la sezione dalla Collection (riga 70) e saranno nuovamente mostrate le sezioni tramite la Sub MostraSezioni (riga 71).
Quella che vediamo è la parte più difficile e delicata del progetto. Nel momento in cui viene spostato il cursore del testo sopra la RichTextBoxFileTracciato o viene effettuata una selezione del testo tramite mouse o tastiera, scatta l'evento SelChange.
Una particolare cura deve essere data a questa routine poiché il posizionamento del cursore attraverso d'essa può richiamare nuovamente questa routine, generando un ciclo continuo fino all'esaurimento dell'area di stack. Il controllo della posizione si basa su due parametri: la coordinata del cursore ed il colore del testo selezionato. Infatti, un testo già colorato in rosso indica che il cursore si trova all'interno di una sezione o il testo selezionato è intersecato con una sezione.
A questo scopo utilizzeremo una variabile di nome CONTROLLA, che inizialmente sarà impostata a True. Nel momento in cui viene controllato il colore del testo selezionato, se esso è nero la variabile sarà impostata a False (riga 86). Cosa fa esattamente questa variabile?
Alla riga 87 viene verificato se la variabile CONTROLLA è True (ovvero il cursore si trova all'interno di una sezione oppure il testo selezionato copre una sezione. Altresì viene controllato che la variabile TROVAPOSIZIONE sia False (ovvero il cursore è stato spostato dall'utente e non dal codice). Quando questa situazione si verifica sarà necessario controllare tutte le sezioni per vedere quale sezione si trova a quelle coordinate. Saranno memorizzate le coordinate iniziali e finali della selezione nelle variabili INIZIADA e FINEA (righe 88 e 89). Dopodiché inizierà la scansione di tutte le sezioni mediante l'estrazione di una sezione per volta dall'array SEZIONI (riga 91). Se la selezione è all'interno della sezione analizzata (riga 92) oppure la parte finale della selezione si trova all'interno della sezione (riga 93), oppure la parte iniziale delle selezione si trova all'interno del testo selezionato (riga 94), viene interrotto il ciclo di scansione delle sezioni. L'interruzione del ciclo fa sì che la variabile CONTA contenga l'indice della sezione che si interseca con il testo selezionato. Se il ciclo non è stato interrotto, alla sua uscita, la variabile CONTA avrà un valore superiore al numero complessivo di sezioni. In quest'ultimo caso non è stata trovata la sezione corrispondente e la routine termina qui, senza evidenziare alcuna sezione.
Il raggiungimento della riga 97 presuppone che sia stata trovata la sezione intersecata con il testo selezionato.
A tale scopo possiamo effettuare la lettura dei parametri della sezione TMPSEZIONE. Poiché ci occorrerà spostare il cursore per mostrare all'utente la posizione e l'ampiezza della sezione, impostiamo la variabile TROVAPOSIZIONE a True e alla riga successiva spostiamo il cursore all'inizio della sezione ed impostiamo la selezione fino alla fine della sezione. Questo fa sì che scatti nuovamente l'evento SelChange. Se non avessimo impostato la variabile globale TROVAPOSIZIONE
a True, si sarebbe innescato un circolo vizioso che richiama continuamente
questo evento per posizionare il cursore, fino a generare un errore di
stack esaurito. Evidenziata la sezione sarà possibile visualizzare anche tutte le altre proprietà della sezione (righe 98-105), prima di ripristinare lo stato di TROVAPOSIZIONE a False.
Il click sopra il pulsante CreaDefinizione effettua il salvataggio della definizione in un file FDF. Alla riga 121 viene richiesto il nome del file in cui salvare; di tale fiile sarà controllata l'esistenza. Se l'utente ha premuto il tasto Annulla la routine terminerà (riga 122). Nel caso che il file inserito non esistesse sarà possibile salvare poiché la variabile FILEOK conterrà il valore True. Appurato che il file non esiste, verrà tentata la creazione (riga 126); nel caso che il disco sia protetto o pieno, si genererà un errore che verrà intercettato dalla riga successiva (riga 127) la quale imposterà il valore di FILEOK a False. Il ciclo While (righe 118-129) durerà fintanto che FILEOK non conterrà il valore True, ovvero il file non esiste e la scrittura sul disco è permessa. Alla riga 130 viene scritta l'intestazione "Fibia Data Stripper"
che contraddistinguerà i files FDF.
Il click sopra il pulsante CaricaDefinizione richiede l'inserimento del nome del file FDF da caricare (riga 142). Ovviamente tale file deve necessariamente esistere. Se esso non esiste la routine terminerà qui. Avendo la sicurezza che tale file esiste possiamo leggere l'intestazione del file per verificare che esso sia un file valido (riga 146). Un'intestazione valida fa sì che la funzione termini qui. Il file richiesto è valido! È possibile caricarlo, ma prima sarà necessario svuotare la Collection SEZIONI e la ListBoxListaSezioni (righe 149-152) per riempirle nuovamente. Ma prima di riempirle nuovamente togliamo tutte le parti in rosso del testo (righe 153-156) tenendo la variabile di blocco TROVAPOSIZIONE impostata a True. Alle righe 157-164 vengono lette le sezioni dal file FDF, sono scritte nella Collection SEZIONI e man mano viene colorato il testo in rosso dove abbiamo una sezione. Prima di uscire dalla routine ripristiniamo lo stato normale del form reimpostando la variabile TROVAPOSIZIONE a False e ridisegnando le sezioni mediante la Sub MostraSezioni.
Lo studio del form si conclude con il pulsante PulsanteChiudi
che azzera la Collection SEZIONI e nasconde il form, ritornando il controllo
al form chiamante (MainForm). |
Fibia
FBI
|
Torna all'introduzione delle Richieste dei lettori |