Newsgroup: it.comp.lang.delphi
Titolo: Intercettazione errori

Salve a tutti,
scusate l'ardire:-)   ma ho ancora un altro problema:-(
intercettazione degli errori in I/O
in VB suona cosě:
on Error goto errori
........
errori:
exit sub
in Delphi quali sono le parole magiche?
ho scritto questo codice, ma non trovando l'archivio
mi appare la finestra di errore.......File not found e si blocca lě
In pratica se non trova l'archivio mi deve dare un avviso,
uscire dalla procedura e chiudere il form.
Cosa/come debbo fare?
Grazie
Enrico
--------------------------------------------------
//Legge il totale delle tabelle
  {$I+}
  AssignFile(DataTabelle,'Tabelle.dat');
  Try
    reset(DataTabelle);
   try
    ultima:=FileSize(DataTabelle);
   Finally
    closeFile(DataTabelle);
   end;
  Except
   begin
    on EInOutError do
    begin
       showMessage ('Archivio assente');
       close;
    end;
   end;
 {$I-}
end;

try..except
try..finally
Bye
A.

Sono sempre io...
Mi fa molto pensare che in vb6 si usi ancora On Error goto.
Risale al gwbasic....... :)))
A.

 ha scritto nel messaggio
news:b75un7$1605$1...@newsreader1.mclink.it...
Ciao,
perdona l'ignoranza, ma cosa si dovrebbe usare?
c'è anche
On error resume.....
tornando al Delhi scusa ancora la mia ignoranza, ma è da
pochissimo che lo uso, cosa vuol dire
try..except
try..finally
cioè dovrei invertire except ..finally?
Ti dispiacerebbe riscrivere il codice esatto che ho inviato?
Grazie
Enrico


 end;
non so bene quale sia il tuo problema ...
poiche io ho copiato ed incollato questo codice e funziona bene
ricordati che se testi i programmi con il debugger di Delphi le eccezzioni
interne
te le torna lo stesso... poi fai di nuovo play e vedi l'eccezzione che
darebbe all'utente.
se non vuoi vedere le eccezzioni interne devi avviare il programma
dall'eseguibile direttamente
e non dal play di delphi
  spero ti sia utile ciao
  Mak

cioč dovrei invertire except ..finally?
Per capire la gestione degli errori (fa molto vb, in realta' si dovrebbe dire
"gestione delle eccezioni") nulla c'e' di meglio che leggersi le guide o anche
l'help di delphi. (F1 e' il tasto piu' conosciuto al mondo).
Ad ogni modo, c'e' una metafora che ti puo' aiutare a capire il concetto.
Se fai jeet kune do (o street fight), una delle cose che ti insegnano sin
dall'inizio e' il "trapping", l'intrappolamento: ti mettono davanti al partner
e ti spiegano che in presenza di attacco sulla corta distanza, puoi *evitare i
danni* afferrando e bloccando (=intrappolando) l'arma. Essendo bloccata,
l'arma non puo' piu' arrecare danno, diventando cosi' inoffensiva.
Questo e' quello che devi fargli fare a delphi quando capitano gli errori:
intrappolarli per renderli inoffensivi. come fai? semplicemente mettendo il
codice che puo' scatenare l'errore tra la parola TRY e la parola EXCEPT.
TRY
   [tuo codice che puo' scatenare errori]
   [...]
EXCEPT DO BEGIN
   [gestione dell'errore intrappolato]
   END;
END;
E questo sarebbe il famoso "on error goto..."
il TRY ..FINALLY, invece, e' come il "resume" del basic: ti garantisce cioe'
che in presenza di errore, la parte compresa nel FINALLY verra' SICURAMENTE
eseguita.
Combinando le due tecniche di autodifesa dagli errori :-D, eccoti uno schema
di utilizzo generico (copiato da un post di laforgia):
// allocazione risorse
try
  try
    // elaborazione
  except
    // elaborazione eccezione
  end;
finally
  // liberazione risorse
end;
Prova quindi a rielaborare il tuo sorgente sulla falsariga di queste
spiegazioni, poi facci sapere!
Ciao... e buon combattimento ;-)
-- 
Morde. 
morde[at]programmer[.]net

 spiegazioni, poi facci sapere!
Ho rielaborato ed eccolo:
//Legge il totale delle tabelle
  {$I+}
  AssignFile(DataTabelle,'TabelleP.cfg');
  Try
   reset(DataTabelle);
   try
    ultima:=FileSize(DataTabelle);
   except
    closeFile(DataTabelle);
   end;
  finally
   MessageDlg('Mancano le tabelle',mtWarning,[mbOk],0);
   close;
  end;
  {$I-}
Il problema però rimane, mi fa vedere il msg  > Mancano le tabelle <
cliccando su OK, il prg prosegne, non esce.
forse non è la gestione delle eccezioni ad essere incriminata ma bensì,
forse dirò una cavolata la parola > close <, debbo aggiungerci
qualcos'altro?
tipo close >nome programma< o <exit<?
Ci ho provato ma non me l'accetta.
Come ho detto nel mio precedente msg, ho bisogno che non trovando
l'archivio, dopo il msg di errore, ops dell'eccezione, cliccando su ok
il form deve chiudersi, scusa, ma mi rifaccio al VB:
Unload Tabelle
Set Tabelle = Nothing
esiste un <unloadPackage<, ma non credo c'entri.
Grazie ancora
Enrico

 il form deve chiudersi,
il problema non č in come hai gestito l'eccezione
ma dove chiami il close
per esempio il metodo close di un TForm non puň essere
chiamato nel metodo create della form stessa credo
quindi se mi dici in che evento o metodo sistemi il codice che hai postato
ti potro dare una risposta piů esauriente
  ciao
  Mak

ti potro dare una risposta piů esauriente 
Sottoscrivo.


 chiamato nel metodo create della form stessa credo
Lo chiamo proprio da lě, per meglio capire ti invio la procedure
procedure Tabelle.FormCreate(Sender: TObject);
var
  ultima : integer;
  DatiTab, DataTabelle : textFile;
begin
   //Legge ultimo aggiornamento delle tabelle
   {$I+}
  AssignFile(DatiTab,'DataTutA.dat');
 try
   reset(DatiTab);
   try
    readln(DatiTab,finale);
    readln(DatiTab,dataScritta);
  except
   closeFile(DatiTab);
  end;
  finally
     showMessage('Data aggiornamento assente');
  end;
  {$I-}
   //Legge il totale delle tabelle
  NumTabella:=0;
  {$I+}
AssignFile(DataTabelle,'TabelleP.cfg');
Try
  reset(DataTabelle);
  try
    NumTabella:=FileSize(DataTabelle);
   except
     closeFile(DataTabelle);
   end;
   finally
    MessageDlg('Mancano le tabelle',mtWarning,[mbOk],0);
  end;
 {$I-}
 Label2.Caption :='Totale tabelle = ' + intTostr(NumTabella);
  if NumTabella=0 then
       BitBtn1.Visible := True;
end;
//-------------------------------------------------------------
procedure TAggTabTt.BitBtn1Click(Sender: TObject);
begin
close;
end;
//--------------------------------------------------------------
Come potete vedere ho cercato di inserire un button che uno volta cliccato
dovrebbe farmi uscire/scaricare il form.
Niente, francamente se non mi date una mano, ritorno al VB, almeno fintanto
che non trovo un manuale in italiano, come quelli del VB:-(
Grazie per la pazienza
Enrico


 //--------------------------------------------------------------
non so se è un errore di scrittura ma TAggTabTt è un form? o cosa?
se usi il close in un metodo del tipo procedure TAggTabTt.BitBtn1Click
il compilatore sottointende Self.Close ... tradotto dsarebbe TAggTabTt.Close
però dai post precedenti mi sembra che quello che vuoi fare è tabelle.close
...
anche se poi nel metodo create di tabelle chiami BitBtn1 come se
appartenesse al form "tabelle" ...
secondo me il metodo scritto corrrettamente dovrebbe essere
procedure tabelle.BitBtn1Click(Sender: TObject);
begin
 Self.Close;
end;
fammi sapere meglio ....
  ciao
  Mak

 fammi sapere meglio ....
Ci siamo quasi:-)
Cosě come riscritto, all'avvio del prg mi dice, giustamente che non ci sono
le tabelle,  va avanti e mi da un errore di I/O > File not Found e quindi
mi apre il form, questa volta perň con il pulsante Chiudi visibile e quindi
cliccandoci, chiudo/esco il prg.
Domanda, perchč mi appare il msg di errore di I/O File not found? se con
CloseFile(DataTabelle) l'ho chiuso?
Alla prossima e ancora grazie.
Enrico

 procedure Tabelle.BitBtn1Click(Sender: TObject);
poi implementi un metodo BitBtn1Click della classe Tabelle
(ma, ancora, tabelle non è di tipo TTabelle e quindi un record????)
dove e come è definito BitBtn1Click???
Ho fatto scrivere da Delphi una Unit standard
con un form con nome FormTabelle di tipo TFormTabelle ereditato da TForm
che ha un BitBtn di nome BitBtn1 che chiude il form ...
il codice segue dopo i saluti
  Ciao
  Mak
unit UnitTabelle;
interface
uses
  Windows, Messages, SysUtils, Variants,
  Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Buttons;
type
  TFormTabelle = class(TForm)
    BitBtn1: TBitBtn;
    procedure FormCreate(Sender: TObject);
    procedure BitBtn1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
var
  FormTabelle: TFormTabelle;
  //dichiari tutte le tue variabili globali (o quasi)
implementation
{$R *.dfm}
procedure TFormTabelle.FormCreate(Sender: TObject);
//Var
//   dichiari tutte le variabili di creazione
//   che potranno essere (e verranno) distrutte alla fine
//   della creazione del form
begin
        //Qui crei tutti gli oggetti che ti servono
        //verifichi l'esistenza del file o altro
        //leggi i dati
        //prepari i componenti per la visualizzazione
        BitBtn1.Visible := true;
end;
procedure TFormTabelle.FormClose(Sender: TObject;
  var Action: TCloseAction);
Var
  Check: Boolean;
begin
    //il metodo close viene chiamato
    //quanlsiasi volta si toglie la visibilità del form stesso
   //quindi verifica di che tipo di chiusura si tratta
   //mediante la var Action
    If Action = caFree Then
      Begin
        //Qui distruggi tutti gli oggetti
        //creati alla creazione del form
        //verifichi l'esistenza del file
        //salvi i dati
        Check= true; //esegui i controlli di chiusura
        If Not Check Then
          Begin
           Action := caNone;
           //Messaggio per l'utente che lo avvisa
           //che non ci sono le condizioni per chiudere il form
           //occhio che se queste condizioni
           //non si possono ristabilire il form non lo chiude più ;)
          End;
      End;
end;
procedure TFormTabelle.BitBtn1Click(Sender: TObject);
begin
        Self.Close; //chiusura del form
        //se la form è la form principale del progetto
        //il tipo di chiusura sarà di distruzione della form stessa
        //mentre se è una form secondaria sarà di Hide
end;

ops errorino ...
il metodo formClose l'ho scritto a mano nel post
e mi sono scordato di definirlo come metodo del TFormTabelle
Che risulta cosě
type
  TFormTabelle = class(TForm)
    BitBtn1: TBitBtn;
    procedure FormCreate(Sender: TObject);
    procedure FormClose(Sender: TObject;
                                         var Action: TCloseAction);
    procedure BitBtn1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
il resto credo vada bene ;)
sorry
  ciao
  Mak

ab1.per   Fogli carta bianca A4                               Ta<
Domanda, il formato del record VB è evidentemente diverso da Delphi, quale
potrebbe essere il rimedio?
Ho provato a cambiare string[12] e string[40] con altri numeri di campo
ma niente.
Sono certo che hai la soluzione:-))
Grazie
Enrico

>ab1.per   Fogli carta bianca A4                               Ta<
  ciao
  Mak

 penso sia proprio il tuo caso ...
peccato perché vorrei riscrivere alcuni prg di VB in Delphi, avendone
constatato la velocità di esecuzione.
Potrei riscrivere il suddetto file in Delphi, ma dato che altri prg (in VB)
lo
richiamano, non so se VB legge quelli in Delphi.
Dalle premesse non credo, quindi......ciccia.
Ti ringrazio per la tua disponibilità.
Enrico