Home > Enterprise >  Custom function like msgbox function
Custom function like msgbox function

Time:10-20

I use ms access vba to create my program and I don't like default msgbox design , so I create a form named "frm_msg"

look like this >>>

enter image description here

and I make a simple function with arguments to call this form

Public Function custom_msg(msg_title, msg_txt, msg_icon, msg_button As String)

DoCmd.OpenForm "frm_msg"

Form_frm_msg.lbl_msg_title.Caption = msg_title

Form_frm_msg.lbl_msg_txt.Caption = msg_txt

If msg_icon = "success_icon" Then
Form_frm_msg.success_icon.Visible = 1
Form_frm_msg.error_icon.Visible = 0
Form_frm_msg.warning_icon.Visible = 0
Form_frm_msg.question_icon.Visible = 0

ElseIf msg_icon = "error_icon" Then
Form_frm_msg.success_icon.Visible = 0
Form_frm_msg.error_icon.Visible = 1
Form_frm_msg.warning_icon.Visible = 0
Form_frm_msg.question_icon.Visible = 0

ElseIf msg_icon = "warning_icon" Then
Form_frm_msg.success_icon.Visible = 0
Form_frm_msg.error_icon.Visible = 0
Form_frm_msg.warning_icon.Visible = 1
Form_frm_msg.question_icon.Visible = 0

ElseIf msg_icon = "question_icon" Then
Form_frm_msg.success_icon.Visible = 0
Form_frm_msg.error_icon.Visible = 0
Form_frm_msg.warning_icon.Visible = 0
Form_frm_msg.question_icon.Visible = 1

End If


If msg_button = "ok" Then
Form_frm_msg.btn_ok.Visible = 1
Form_frm_msg.btn_yes.Visible = 0
Form_frm_msg.btn_no.Visible = 0

ElseIf msg_button = "yes_no" Then
Form_frm_msg.btn_ok.Visible = 0
Form_frm_msg.btn_yes.Visible = 1
Form_frm_msg.btn_no.Visible = 1

End If

End Function

now my problem is how do I make it return a value depending on the button that I click?

and use it like default msgbox in if statement

if msgbox("Hallo world",vbInformation  vbYesNo ,"Hallo") = vbYes Then
'do something ...
end if

CodePudding user response:

The easiest way I found to do this reliably is to place a hidden text box on the form to hold your 'return' value. (I found this more reliable as you can control default value, type etc and draw conclusions from NULL etc which you can't from using a TempVar)

Now write yourself a simple wrapper function which opens the form in dialog mode. In the OnClick event of your buttons, set the hidden text control value to the return value you want, and then hide (don't close) the form. Because it was dialog, it will still be open but not visible, and control flow returns to your wrapper function.

Obtain the value from the hidden text field on the form using a fully qualified reference to the text control, store it in a variable in the wrapper function and do something with it if required, or just return it as is (like the example), then close the form programmatically using DoCmd.Close.

Something simple like this;

Form_Name is the full name of your form NameOfTextControl is the name of the hidden control set by your onClick event

Function customBox(msg_title, msg_txt, msg_icon, msg_button) as string

   'I would usually pass a delimited string of values in the OpenArgs
   'or set TempVars if necessary, then use your function code inside
   'the form Open event to configure the form dynamically before displaying
    
   DoCmd.OpenForm "Form_Name", acNormal, , , , acDialog
   ' When we get back here, the form is invisible, not closed
    customBox = Forms!Form_Name!NameOfTextControl
    DoCmd.Close acForm, "Form_Name", acSaveNo

End Function

So all you then do is replace msgbox with your customBox function and adjust the vbYes / vbNo constant to check for whatever value you set in the form

if customBox(msg_title, msg_txt, msg_icon, msg_button) = "Yes" Then
   'do something ...
end if

CodePudding user response:

You can use a module and global/public variables to interact with the form.

Here is a snippet from my project:

' Opens a message box, using form ModernBox, similar to VBA.MsgBox.
'
' Syntax. As for MsgBox with an added parameter, TimeOut:
' MsgMox(Prompt, [Buttons As VbMsgBoxStyle = vbOKOnly], [Title], [HelpFile], [Context], [TimeOut]) As VbMsgBoxResult
'
' If TimeOut is negative, zero, or missing:
'   MsgMox waits forever as MsgBox.
' If TimeOut is positive:
'   MsgMox exits after TimeOut milliseconds, returning the result of the current default button.
'
' 2018-04-26. Gustav Brock, Cactus Data ApS, CPH.
'
Public Function MsgMox( _
    Prompt As String, _
    Optional Buttons As VbMsgBoxStyle = vbOkOnly, _
    Optional Title As Variant = Null, _
    Optional HelpFile As String, _
    Optional Context As Long, _
    Optional TimeOut As Long) _
    As VbMsgBoxResult
    
    ' Set global variables to be read by form ModernBox.
    mbButtons = Buttons
    mbPrompt = Prompt
    mbTitle = Title
    mbHelpFile = HelpFile
    mbContext = Context
    
    Call OpenFormDialog(ModernBoxName, TimeOut)
    
    ' Return result value set by form ModernBoxName.
    MsgMox = mbResult

End Function

The full code is way too much to post here, so feel free to browse VBA.ModernBox for all the details.

  • Related