General

6.19 Come evitare che l'utente chiuda l'applicativo tramite Alt-F4?
  Dario da PD
Per evitare che l'utente chiuda l'applicazione utilizzando il pulsante di chiusura (X) è già presente in questo sito una funzione per disabilitare il relativo tasto ("Rimuovere il pulsante di chiusura (X), il menu e i pulsanti di ridimensionamento di Access.", AntoGal, Tips & Tricks).
Resta però la possibilità da parte dell'utente di chiudere l'applicazione digitando Alt-F4 dalla tastiera.
Il problema può essere così risolto :
1) creare una maschera (con nome, ad esempio, "ENV") che all'avvio dell'applicativo venga aperta in modalità nascosta, tramite il comando
DoCmd.OpenForm "ENV", , , , , acHidden
posto nell'evento Form_Load della maschera di avvio (o, in alternativa, con analogo comando sulla macro Autoexec).
2) All'interno della maschera ENV creare un controllo check box chiamato CanClose con valore predefinito False.
3) Su evento scaricamento della form (Form_Unload) inserire il seguente codice:
If Not Me.CanClose Then 
   MsgBox "Per uscire dall'applicazione è necessario chiudere tutte le finestre" & _
         vbCrLf & "ed utilizzare il tasto 'Uscita'", vbInformation, "Uscita"
   Cancel = True
End If
che annulla la chiusura della maschera ENV nel caso in cui CanClose abbia valore False (ossia il suo valore predefinito).
4) Inserire la seguente funzione all'interno di un modulo:
Function Uscita()
   If FormIsOpen("ENV") Then Forms![ENV]![CanClose] = True
   DoCmd.Quit
End Function
[per la funzione FormIsOpen vedere "Controllare se una maschera è aperta." di Antogal, Tips & Tricks]

A questo punto basterà richiamare tale funzione da un tasto posto sulla form principale o da un menu personalizzato. L'utente potrà chiudere quindi l'applicazione SOLO attraverso questo tasto; ogni altro metodo sarà infruttifero.

Attenzione però : se l'utente ha delle maschere aperte e clicca sulla X (o preme Alt-F4) l'applicazione non viene chiusa ma probabilmente vengono chiuse tutte le maschere aperte.
Per evitare quindi che l'utente lasci "qualcosa a metà", con conseguenti effetti imprevedibili sui dati, consiglierei di inserire il controllo CanClose e il relativo codice su evento Form_Unload anche su tutte le maschere di inserimento dati (tralasciando magari le maschere di 'sola visualizzazione').
Dovrete semplicemente ricordarvi di inserire nella form un tasto di chiusura in cui impostare CanClose a True prima della chiusura :
Private Sub btnChiudi_Click()
   Me.CanClose = True
   DoCmd.Close
End Sub
Noterete inoltre che così facendo inibirete anche la chiusura delle singole maschere con la combinazione tasti Ctrl-F4 o con la X nella barra della form, obbligando quindi l'utente ad utilizzare il tasto di chiusura della form.


Se pensate di avere del materiale freeware interessante e volete pubblicarlo, allora leggete qui.