Come sostituire la finestra di dialogo MsgBox in Microsoft Access

Per interagire con l’utente, per esempio quando chiediamo conferma prima di eseguire un’operazione, si usa la MsgBox e si cattura il pulsante premuto dall’utente e poi si esegue il codice di conseguenza. Esempio:

Dim intRisposta As Integer
intRisposta = MsgBox("Vuoi inserire i dati?", vbOKCancel)
If intRisposta = vbCancel Then
   ' qui inserirò il codice eseguito se ha premuto Annulla 
Else
   ' qui inserirò il codice eseguito se ha premuto OK
End If

Creo la variabile intRisposta di tipo Integer perché la funzione MsgBox restituisce un valore Integer.

Poi assegno alla variabile ciò che restituisce la funzione MsgBox. Il primo argomento della MsgBox è il prompt, il messaggio che legge l’utente; il secondo argomento stabilisce quali pulsanti sono visualizzati nella finestra di dialogo.

Poi in base al pulsante premuto, scriverò il mio codice.

Sto sviluppando un’applicazione che viene utilizzata su tablet industriale con penna ottica. Quando l’operatore ha visto la prima beta, ha sottolineato l’esigua dimensione delle finestre di dialogo che si aprono con la funzione MsgBox.

Mi sono chiesto allora come sostituire la finestra di dialogo MsgBox in Microsoft Access.

La mia maschera d’inserimento dati è questa:

InserimentoDati

Quando si preme il pulsante Inserisci, viene aperta la maschera che funge da MsgBox.

Private Sub cmdInserisci_Click()
' apro la maschera che funge da MsgBox
DoCmd.OpenForm "myMsgBox"
End Sub

La maschera myMsgBox è questa: myMsgBox struttura

ho impostato nelle categoria di proprietà Altro:

  • Popup = Sì
  • A scelta obbligatoria = Sì

Con Popup sono sicuro che sia sempre in primo piano e non venga nascosta da altre.

Con A scelta obbligatoria riproduco esattamente il comportamento della finestra di dialogo aperta dalla funzione MsgBox: finché non viene chiusa, l’utente non può fare altro.

Il pulsante OK e il pulsante Annulla richiamano due procedure che ho creato nella maschera Inserimento dati:

Private Sub cmdAnnulla_Click()
' chiudo la maschera myMsgBox
DoCmd.Close
' eseguo la procedura sAnnulla che si trova nella maschera d'inserimento dati
Form_InserimentoDati.sAnnulla
End Sub

Private Sub cmdOk_Click()
' chiudo la maschera myMsgBox
DoCmd.Close
' eseguo la procedura sOk che si trova nella maschera d'inserimento dati
Form_InserimentoDati.sOk
End Sub

Solitamente le procedure scritte in una maschera sono richiamabili solo all’interno della maschera stessa. Infatti sono automaticamente dichiarate come Private.

Per esempio nella maschera myMsgBox la procedura legata all’evento Click del pulsante cmdAnnulla è Private:

Private Sub cmdAnnulla_Click()

 

Perciò può essere richiamata solo dalla maschera myMsgBox.

Le procedure sOk e sAnnulla che ho scritto nella maschera Inserimento dati, invece, sono pubbliche e quindi richiamabili anche da altre maschere:

Public Sub sOk()

' qui eseguo il codice relativo all'inserimento

End Sub
Public Sub sAnnulla()
' qui eseguo il codice se l'utente ha premuto Annulla
' per es. potrei svuotare le due caselle di testo
txtCognome = Null
txtNome = Null
' e poi spostare il focus sulla casella del Cognome
txtCognome.SetFocus

End Sub

Naturalmente sulla maschera myMsgBox potrei visualizzare anche altri dati, per esempio riepilogare i valori immessi dall’utente o qualunque altro dato sia importante verificare prima che si proceda con il salvataggio per esempio.