-
Feb 25th, 2008, 06:06 PM
#1
Classic VB - How can I show a confirmation message when my form is closing?
Many programs show a confirmation message when you try to exit them (with most of them, only if you haven't saved your work), but how can you do the same?
Well there are two steps, showing the message, and (if apt) knowing whether the work has been saved.
Showing a confirmation message
To show the message, simply add a call to MsgBox in the _QueryUnload event of the form (if you have more than one form, this could be in each form, or just in the 'main' form).
The _QueryUnload event has a "Cancel" parameter which allows you to cancel the unloading, so setting it to True means that the form will stay open. Note that while the _Unload event also has a "Cancel" parameter, it should not be used for this purpose, as that event can occur after other forms in your project have already closed (if more than one is being closed, which is particulary likely for MDI projects).
The code you use could be like this:
Code:
Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
'Show the message, with apt buttons
If MsgBox("Are you sure you want to exit?", vbQuestion + vbYesNo) = vbNo Then
'if "No" was pressed, cancel the unload
Cancel = True
Exit Sub
End If
End Sub
If you only want to show this message when the form is being closed for a particular reason (eg: only if the user pressed the X button), see the article How can I tell why my form is closing?
Only showing the message if there is unsaved work
In most cases you will probably only want to show a message if the user hasn't saved their changes.
Obviously what counts as 'unsaved work' depends on your program, but these guidelines are one way that you can tell if there is unsaved work or not (an alternative, which may be easier, is to check in _QueryUnload if the 'current' data is the same as the 'saved' data - but that is much more specific to each project).
The idea for this method is to have a variable which will keep track of whether there is something that needs to be saved. This should be declared at the top of the form (in the 'General' - 'Declarations' section) so that it can be used throughout the form, eg:
Code:
Option Explicit '(you may not have this line, see this article for why it is a good idea)
Private m_boo_UnsavedWork as Boolean
You could (and arguably should) set this variable to False in Form_Load, but Boolean variables are False by default.
Whenever the work is saved (and if apt, also when a 'Cancel' button is pressed), simply set the variable to False. Assuming you have a Sub called Save which does the saving, the code could be like this:
Code:
Private Sub Save()
** your code to save here
'remember that changes have been saved (so no message is shown when the form closes)
m_boo_UnsavedWork = False
End Sub
Whenever a change is made, simply set the variable to True. Unfortunately this step takes a bit more time, as it needs to be repeated for each kind of change the user can make (which probably means most of the controls on your form). For a textbox called txtFirstName, you would add code like this:
Code:
Private Sub txtFirstName_Change()
'remember that these changes are not saved (so a message is shown when the form closes)
m_boo_UnsavedWork = False
End Sub
Repeat this part for everything the user can do which counts as 'unsaved work' (which will usually be _Change and/or _Click events of your controls).
Finally, you can alter the _QueryUnload to check this variable, and only show the message if it is relevant:
Code:
Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
'if there is unsaved work..
If m_boo_UnsavedWork Then
'Show the message, with apt buttons
If MsgBox("Are you sure you want to exit?", vbQuestion + vbYesNo) = vbNo Then
'if "No" was pressed, cancel the unload
Cancel = True
Exit Sub
End If
End If
End Sub
Or if you want to, you can show 3 buttons (Yes/No/Cancel) like Notepad does, eg:
Code:
Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
'if there is unsaved work..
If m_boo_UnsavedWork Then
'Show the message, with apt buttons
Select Case MsgBox("You have unsaved work, do you want to save your changes?", _
vbQuestion + vbYesNoCancel)
Case vbYes 'the user wants to save before exiting
** call your save routine
'(the form will automatically close afterwards)
Case vbNo 'nothing to do - the user wants to exit without saving
Case vbCancel 'cancel the unload
Cancel = True
Exit Sub
End If
End If
End Sub
Posting Permissions
- You may not post new threads
- You may not post replies
- You may not post attachments
- You may not edit your posts
-
Forum Rules
|
Click Here to Expand Forum to Full Width
|