PDA

Visualizza la versione completa : [delphi] exception


123delphi321
16-04-2004, 13:31
Ciao a tutti, ciao Alka,

ho fatto un programma al quale vorrei attivare una gestione delle EXception, vorrei almeno fare in modo che quando viene sollevata un'eccezione qualsiasi venga visualizato un mio messaggio invece che quello di sistema.

in pratica alcune eccezioni (dove possibile) le riesco a gestire con try..except, ma vorrei ruiscire ad intercettare quelle particolari quali "invalid input value".

ho cercato su internet ed ho trovato qualcosa....ma non sono riuscito a capire come scrivere una procedura unica che visualizza la stessa MiaformExcepition in tutto il programma.

mi potete aiutare?
grazie
fulvio

web ces
16-04-2004, 17:55
"giustappunto..."
interessa anche a me! :D
:ciauz:

alka
16-04-2004, 19:06
Dalla pagina "Additional" della Palette dei Componenti di Delphi puoi trascinare su un form o su un DataModule il componente TApplicationEvents.

Questo componente ti permette di intercettare alcuni eventi che riguardano l'applicazione nella sua interezza, tra i quali la generazione di un'eccezione che non viene gestita nella procedura o nel metodo in cui avviene attraverso un costrutto try...except.

L'evento OnException viene generato quando un'eccezione si verifica e non viene gestita: l'eccezione (oggetto Exception) viene passata come parametro al metodo di gestione dell'evento.

Questo evento è utile per attività di logging degli errori e altre necessità, come quella di visualizzare un messaggio di errore personalizzato.

Fai qualche prova...

123delphi321
17-04-2004, 11:30
Fai qualche prova... :confused:

non c'e' stato niente da provare!!! :D

ha funzionato perfettamente subito!

ho inserito l'oggetto da te suggerito sul mio FrmMain e nell'evento OnException


procedure TFrmMenu.ApplicationEvents1Exception(Sender: TObject;
E: Exception);
begin
ShowMessage(E.ClassName+' errore genetato, messaggio: '+E.Message);
end;

e cosi visualizzo il mio messaggio ad ogni eccezzione.

grazie!!!!

ciao :ciauz:

alka
17-04-2004, 11:36
Un'ultima indicazione: se tu dovessi un giorno rimuovere quel componente dal progetto perchè decidi di non utilizzarlo più, ricordati di rimuovere anche i riferimenti alla unit che lo contiene (AppEvnts) poichè tale unit provede ad installare dei "gestori alternativi di eccezioni" che vengono poi utilizzati per catturare gli errori e indirizzarli verso il componente ApplicationEvents.

In presenza di riferimenti alla unit, questi gestori vengono installati, ma senza un componente ApplicationEvents non è possibile ricevere notifiche da questi, pertanto l'effetto che si nota è la mancanza di messaggi visualizzati a fronte di un errore.

Ciao! :ciauz:

123delphi321
17-04-2004, 18:14
scusa,....ho un dbedit collegato ad un campo date,...nel quale utilizzo una editmask x l'input del campo.

viene controllato tutto, ma viene generata una eccezzione che non capisco:

se immetto una data esatta nel campo es: 17/04/2004 e' ok. nel momento in cui cancello questi numeri (restano solo ' / / ')...viene generata la solita eccezione 'invalid input value.

come devo fare per poter annullare questo valore?...x lasciare il campo vuoto....


grazie
fulvio

alka
17-04-2004, 20:21
Non è possibile: quando abbandoni un controllo sul quale è stata impostata una maschera per l'input, tale maschera deve essere rispettata affinchè sia possibile abbandonare il controllo.

Potresti tentare con un "workaround". Supponiamo che il controllo DBEdit contenga inizialmente un valore nullo: se l'utente modifica il campo, allora il valore deve essere valido, in caso contrario *deve* premere ESC per annullare le modifiche e ritornare al valore nullo o al valore valido precedentemente; per rimuovere il contenuto di un campo già inizializzato, manualmente o dall'utente, senza dover modificare quello che appare nella casella di testo, potresti introdurre un pulsante di piccole dimensioni da affiancare alla casella che, una volta premuto, imposti il campo data/ora a NULL con il metodo Clear:


...
MyDataSet.FieldByName('DATAORA').Clear;
...


Non ho provato questa soluzione, quindi non ne garantisco la buona riuscita, ma tentare non nuoce.

Ciao! :ciauz:

123delphi321
18-04-2004, 11:41
in questa maniera riesco ad azzerare il campo di input e quindi a non fare verificare l'eccezzione.

stavo pensando di mettere un controllo nella funzione che gestisce le eccezioni, in pratica vorrei effetuare automaticamente questa operazione
MyDataSet.FieldByName('DATAORA').Clear;
al verificarsi dell'eccezione.

quindi;

procedure TFrmMenu.ApplicationEvents1Exception(Sender: TObject;
E: Exception);
begin
if e.message = ' / / ' then
begin
....
.....clear
....
end;

end;

mi manca conoscere il nome del campo su cui avviene l'eccezzione.
forse lo si puo passare come parametro alla procedura?

mi sai dire come lo devo leggere o perlomeno come posso effetuare la clear dall'intero della funzione che gestisce l'eccezzione?

grazie
fulvio

alka
18-04-2004, 15:47
Mmm...comprendo benissimo il tuo problema, ma non credo che "globabizzare" e generalizzare il codice di gestione dell'eccezione in modo che faccia la Clear di un campo che magari risiede in un componente appartenente ad un DataModule che potrebbe non essere nemmeno caricato sia una soluzione sicura.

Insomma, mi sembra che questo approccio complichi molto la struttura del programma e potrebbe produrre degli effetti collaterali in futuro.

Secondo me, la soluzione che può risolvere in modo elegante il tuo problema è quella di cercare in rete un controllo data aware che permetta di gestire un campo di tipo data/ora, così l'input risulta più intuitivo per l'utente e i controlli sono facilitati.

Esiste un controllo di questo tipo nella JEDI Visual Component Library (http://homepages.borland.com/jedi/jvcl/).

123delphi321
18-04-2004, 18:42
scusami Alka,

mi trovo un attimo in difficolta.

premetto che nn ho mai installato componenti di terze parti.

mi sono collegato alla pagina da te linkata (http://homepages.borland.com/jedi/jvcl/) ed ho trovato varie cose di cui poter effettuare il download.

ma cosa devo scaricare in particolare?

JVCL300BETA1Complete.zip questo file?

e poi dopo averlo scaricato lo devo installare,...credo che verra creata una ulteriore cartella nel menu palette nel quale avro i nuovi componenti?!

Tu mi consigli di installarli e utilizzarli tranquillamente?


grazie
fulvio

Loading