Newsgroup: it.comp.lang.visual-basic
Titolo: [?] On Error.... End Mhhhhh!

Dopo una sequenza ON ERROR inserisco il comando
---cut
ON ERROR GOTO FINE
[...]
EXIT SUB
FINE:
MSGBOX "ERRORE - FINE PROGRAMMA"
END
END SUB
---cut---
Purtroppo dopo l'esecuzione del comando END parti di programma restano
ancora attivi e con CTRL-ALT-DEL me li rivedo e devo chiuderli manualmente.
Dato che non vengono eseguiti correttamente i UNLOAD e QUERY_UNLOAD come
posso evitare questo l'inconveniente?
grazie come sempre per il vostro "INSEPARABILE"
aiuto!
Frank

 Dato che non vengono eseguiti correttamente i UNLOAD e
QUERY_UNLOAD
Diciamo che "End" ne impedirebbe l'esecuzione. Quindi
togliendo "End" potrebbero essere eseguiti. Ma perche' possano
essere eseguiti bisogna che qualcuno scateni tali eventi. In
quel momento l'unico interessato a chiudere baracca sei tu,
quindi sarai tu che in quel momento "ordinerai" di chiudere.
Il come dipende da cosa e` caricato. Facciamo qualche ipotesi:
1. Il progetto e` costituito unicamente dal modulo "Modulo1;
MODULO1.BAS", e non ci sono "lavori in corso" (oggetti aperti,
chiamate in sospeso, ...):
In questo caso il tuo codice e` perfetto. Anche se sarebbe
preferibile una chiamata ad una routine di chiusura del tipo:
    FINE:
      Call FineProgramma(True)
    End Sub
in cui protrai xEs gestire la chiusura "naturale" e quella a
seguito di errore:
    Sub FineProgramma( _
      Optional NumErrore& = 0
    )
      Select Case NumErrore
      Case -1
        Call MsgBox("ERRORE - FINE PROGRAMMA")
      Case Else
      End Select
      End
    End Sub
2. Il progetto e` costituito unicamente dal form "Form1;
FORM1.FRM" e, come nel caso 1, non ci sono "lavori in corso":
    On Error GoTo FINE
    ' [...]
    Exit Sub
    FINE:
      Unload
    End Sub
In questo caso la routine "FineProgramma", che abbiamo usato
nel caso precedente pur senza averne l'obbligo, e` invece
prevista dalla logica degli eventi:
    Private Sub Form_Unload( _
      Cancel As Integer _
    )
    End Sub
Volendo ottenere un risultato analogo, cioe` un messaggio
"centralizzato" che ci informi sulla modalita` di chiusura,
potremmo usare una variabile a livello di modulo:
    Dim m_lngErr
che, opportunamente valorizzata:
    FINE:
      Let m_lngErr = Err.Number
      Unload
    End Sub
possiamo usare nell'evento che precede lo scaricamento del
form:
    Private Sub Form_QueryUnload( _
      Cancel As Integer _
    , UnloadMode As Integer _
    )
      Select Case UloadMode
      Case vbFormCode
        Select Case m_lngErr
        Case <...>
        Case Else
        End Select
      Case Else
      End Select
    End Sub
oppure nella stessa Form_Unload, se non ci interessa gestire
le altre modalita` di chiusura:
    Private Sub Form_Unload( _
      Cancel As Integer _
    )
      Select Case m_lngErr
      Case <...>
      Case Else
      End Select
    End Sub
E in questo caso l'uso di "End" non e` piu` necessario. Anzi
e` sicuramente da evitare.
3. e succ.: la miriade di altri casi...
--
Ciao.
Maurizio
--------
?SPQR(C)
 X


questo l'inconconveniente potresti risolverlo cosě ...
For Each frm in forms
    unload frm
Next frm
ma se l'istruzione Unload non scarica effettivamente i form ... allora mi
farei sostituire il pacchetto VisualBasic dal rivenditore
Davide


Immagino tu abbia un Form Main di cui tu possa richiamare l'unload.
L'end termina brutalmente l'applicazione e non è consigliato.
--
 
federic...@planet.it
Eliminare NOSPAM dall'indirizzo! Delete NOSPAM from address!

GRAZIE MILLE!
unload al momento mi ha risolto il problema...
grazie ancora!
Franco

Se implementi anche delle classi ricordati di settarle a Nothing; e non
dimentirti di un eventuale subclassing... magari di messaggi.
Ciao!