Trappola per Eccezioni

{progetto 3}


Sicuramente avrete già constatato il fatto che, inserendo caratteri diversi dai numeri, il programma mostra un messaggio di errore premendo il pulsante Calcola. Se non lo avete già fatto, provate. Per evitare che succeda questo Delphi mette a disposizione delle strutture entro cui scrivere il codice, in modo da intrappolare gli errori e farli gestire al programmatore. La forma più semplice di una struttura di rilevamento errore è questa:


Try espressione

...

Except

espressione

...

End;


Al posto della scritta espressione tra “Try” ed “Except” va messo il codice che intendiamo monitorare per eventuali errori, mentre dopo “Except” va scritto quello che si desidera eseguire se occorre un errore. Pertanto la nostra procedura si trasformerà in questa:


PROCEDURE TForm1.GetNumeri;

BEGIN

Try ValInt1 := StrToInt(Edit1.Text);

ValInt2 := StrToInt(Edit2.Text);

Except

Beep;

End;

END;


Vediamo come il nostro codice è stato spostato dentro il blocco Try... End, e se una delle due conversioni non va a buon fine viene emesso un incognito “beep”. Provate e osservate quello che succede. Il compilatore comunque ci fa notare che è successo qualcosa, ma il messaggio non compare più, se lanciate l’eseguibile invece di lanciare il progetto, vedrete che si udirà solo un suono in presenza di un errore.

Sarebbe utili anche, oltre al suono, mostrare un messaggio che indica il tipo di errore così l’utente capisce come correggersi. Per fare questo usiamo la funzione MessageDlg che ci fornisce Delphi, i parametri da passare sono:


MessageDlg(messaggio,tipo,pulsanti,pagina help) : Word;


Dove per “messaggio” si intende la stringa che deve comparire nella box, “tipo” è il tipo di messaggio che si intende mostrare, “pulsanti” è la lista di quali pulsanti mostrare e “pagina help” è il numero della pagina del file help associato a questa finestra (lo vedremo in seguito).

Le scelte per il tipo di messaggio sono queste:

Le prime quattro voci mostrano una immagine di sistema e il titolo della finestra che rispecchia il tipo di messaggio, l’ultima non mostra niente e il titolo risulta il nome del programma.

Le scelte possibili per i pulsanti sono queste:

e devono essere racchiusi in parentesi quadre. E’ possibile mostrare anche più di un pulsante, basta indicare il segno “+” (mbYes+mbNo). Tutto questo lo trovate anche nel file di help allegato a Delphi, basta posizionare il cursore sul nome e premere “F1”.

Useremo spesso questa funzione quindi non vi preoccupate se sembra complicata, ora implementiamola per quello che ci riguarda, ecco come apparirà la procedura:


PROCEDURE TForm1.GetNumeri;

BEGIN

Try ValInt1 := StrToInt(Edit1.Text);

ValInt2 := StrToInt(Edit2.Text);

Except

Beep;

MessageDlg('Uno dei due numeri inseriti non è corretto',mtError,[mbOk],0);

End;

END;


Possiamo anche scrivere un blocco per ogni singola operazione, così da restringere ancora di più le capacità di verifica del nostro programma:


PROCEDURE TForm1.GetNumeri;

BEGIN

Try ValInt1 := StrToInt(Edit1.Text);

Except

Beep;

MessageDlg('Il primo numero inserito non è corretto',mtError,[mbOk],0);

Exit;

End;

Try ValInt2 := StrToInt(Edit2.Text);

Except

Beep;

MessageDlg('Il secondo numero inserito non è corretto',mtError,[mbOk],0);

End;

END;


Nel primo blocco dopo la chiamata alla funzione MessageDlg ho scritto “Exit;”, questo è un comando che permette di uscire da una procedura o una funzione, e tornare al flusso che ha chiamato il costrutto. Perché questo? Perché altrimenti se ci sono entrambi i campi con testo non numerico, verrebbero mostrate in sequenza due messaggi, brutto direi. In questo modo dopo il primo si esce dalla procedura e il secondo controllo non viene nemmeno eseguito.

Focus

Indietro  Guide