Sincronizza Indice |
Scarica il progetto |
Testo dell'articolo |
Stampa l'articolo |
Difficoltà: 1 / 5 Nei progetti che utilizzano più form un errore molto comune è quello di trovare riferimenti al secondo form senza un esplicito caricamento. Questo quindi provoca il caricamento automatico del form a cui si fa riferimento; tuttavia questa maniera di lavorare può portare ad errori involontari che, inaspettatamente, lasciano il form in memoria ma in maniera invisibile. Il significato letterale del termine Forms Untiding significa disordinamento dei forms e si applica in genere su quei forms secondari che al momento dell'avvio sono nascosti, ad esempio per inizializzarne i dati dall'esterno.
Sviluppiamo un brevissimo esempio esplicativo composto da due forms: il primo conterrà un solo pulsante di nome cmdLoadForm2 mentre il secondo form non necessita di alcun controllo. Il codice del pulsante fa uso esplicito di alcune proprietà del secondo form, senza tuttavia utilizzare un'istruzione Load che avrebbe piuttosto evidenziato meglio l'errore.
Le righe 4 e 5 modificano due proprietà del secondo form forzando il caricamento automatico dello stesso. La riga 6 invece pone una domanda all'utente: "Faccio apparire il form?". Naturalmente al suo posto avrebbe potuto esserci qualunque istruzione di controllo il cui risultato decidesse se visualizzare o meno il secondo form. Se alla domanda l'utente risponde con SI, il secondo form è mostato sullo schermo tramite Form2.Show e l'elaborazione procede regolarmente. Sarà quindi compito del secondo form scaricarsi quando non serve più oppure lasciare all'utente la possibilità di chiuderlo tramite il pulsante di chiusura sulla barra del titolo. Se invece l'utente risponde con un NO, il secondo form non sarà mostrato e la routine terminerà normalmente, non avendo altro codice da eseguire. L'utente neanche si accorge del problema in quanto il secondo form è nascosto (e non è stato mostrato); tuttavia questo genera una situtazione di Forms Untiding. Uno o più forms non sono stati scaricati dalla memoria, complice anche l'assenza di un'esplicita istruzione Load che avrebbe ricordato o fatto risaltare l'eventuale necessità di un'istruzione Unload.
In una situazione di Forms Untiding se l'utente chiude il form principale, nonché l'unico visibile, il processo non termina ma rimane sospeso. Se il progetto è eseguito all'interno dell'IDE di VB ci si accorge del problema per il fatto che l'esecuzione non ritorna alla fase di progettazione; il codice del progetto è visibile ma non modificabile e l'esecuzione risulta ancora in atto. Se invece il progetto fosse stato compilato ed avviato dal file eseguibile risulta impossibile accorgersi della situazione sospesa. Nascosto ogni form il progetto sembra non esistere e non presenta alcuna icona sulla barra delle applicazioni; ci si può accorgere del processo sospeso soltanto premendo ad esempio i tasti CTRL+ALT+CANC.
Risolvere una situazione di Forms Untiding è relativamente semplice. Basta applicare un po' di attenzione durante l'utilizzo di form secondari:
Lo stesso progetto poteva essere scritto nel seguente modo:
Questa operazione applica le prime due regole precedenti: il caricamento del form è eseguito soltanto quando è necessario farlo (l'utente ha risposto di voler mostrare il form) ed è esplicitata l'istruzione Load. Se il form fosse stato visualizzato in maniera modale sarebbe stato necessario aggiungere un'istruzione Unload subito dopo la visualizzazione. Alla riga 4 viene verificata la condizione che determina se mostrare o meno il secondo form. Soltanto se l'utente decide di voler mostrare il form questo sarà caricato e mostrato. Non così avviene se l'utente decide di non mostrare il form.
Inoltre la chiusura del form principale deve essere eseguita come segue:
Sarà verificato il numero di forms caricati e scaricati i forms
non necessari. |
Questa è una possibile soluzione. In certi casi anche questo controllo può fallire, ad esempio quando uno dei forms secondari rifiuta la chiusura nell'evento Unload. Fibia
FBI
|
Torna all'indice delle Stranezze |