I need to create a WebMessageDialog (Web 2.0) but I can’t get it to display. Where is the Showmodal method in Web 2.0?.
This is the code I use:
Var dialog As New WebMessageDialog
dialog.Message = “¿Estás seguro de qué quieres crear un nuevo experimento?”
dialog.ActionButton.Caption = “Aceptar”
dialog.CancelButton.Visible = True
dialog.CancelButton.Caption = “Cancelar”
Var dialogButton As WebMessageDialogButton
** dialogButton = dialog.Show //No ShowModal or ShowModalWithin option
Select Case dialogButton
Case dialog.ActionButton //Aceptar
MethodOK()
Case dialog.CancelButton //Cancelar
Self.Close
End Select
The line with a ** is the one that gives me an error.
The easiest way to do this is to place a WebMessageDialog instance on your WebPage or WebContainer, say with the name dialog, then use this code to show the message:
dialog.Message = "¿Estás seguro de qué quieres crear un nuevo experimento?"
dialog.ActionButton.Caption = "Aceptar"
dialog.CancelButton.Visible = True
dialog.CancelButton.Caption = "Cancelar"
dialog.Show
Then, add the Event Handler ButtonPressed to dialog with the following code:
Select Case button
Case me.ActionButton //Aceptar
MethodOK()
Case me.CancelButton //Cancelar
// We don't need to do anything here as the dialog is already closed.
End Select
It’s important to remember that Web is asynchronous, so you have to think asynchronously. If the Xojo app stopped to wait for a return value the way Desktop apps do, that could create all sorts of problems like locking up the application or failing to communicate with other Sessions.
Thank you very much for your recommendation. I find it the easiest option but I can’t get it to work. I get the error message: This item does not exist
There were curly quotes in my code block above (from where I copied your code from the first post). I fixed those in the example project – and my previous post – and it works. Your last line in the Button action was also:
I wrote a generic Method that works for both Desktop and Web. You pass the parameters you want and, on Desktop, it returns a String immediately showing the button pressed. In Desktop you just run the Method and use the returning String. For Web, it requires a few lines of setup and runs via Call, runs different Methods within a Delegate in Session, depending on the Button pressed. Normally I just use the Session.myDelegateActionButton and ignore the Session.myDelegateAlternateActionButton and Session.myDelegateCancelButton.
This is what I copy into many locations within my WebApp. You need to substitute the Action Method XXXXXX and any question description.
Session.myWebMessageDialog = New WebMessageDialog
Session.myDelegateActionButton = AddressOf Self.XXXXXX
Session.myDelegateAlternateActionButton = Nil
Session.myDelegateCancelButton = Nil
AddHandler Session.myWebMessageDialog.ButtonPressed, WeakAddressOf Session.WebMessageDialogButtonPressed
Call CommonWindow.getMessageDialog(Session.myWebMessageDialog, Self, "Are you sure you want to XXXXXX?")
Here is the generic Method it runs:
Protected Function getMessageDialog(myWebMessageDialog As Object, ShowModalWithinWindow As Object, Message As String, ActionButtonCaption As String = "OK", Explanation As String = "", Title As String = "", MessageDialogIcon As String = "Caution", isCancelButtonVisible As Boolean = True, isCancelButtonDefault As Boolean = True, isAlternateActionButtonVisible As Boolean = False, AlternateActionButtonCaption As String = "") as String
#If TargetDesktop Or TargetWeb Then 'not for Console
#If TargetDesktop Then
Var tempMessageDialog As New MessageDialog // declare the MessageDialog object
Var tempMessageDialogButton As MessageDialogButton // for handling the result
#ElseIf TargetWeb Then
'Var tempMessageDialog As New WebMessageDialog // declare the MessageDialog object
Var tempMessageDialog As WebMessageDialog = WebMessageDialog(myWebMessageDialog) // declare the MessageDialog object
Var tempMessageDialogButton As WebMessageDialogButton // for handling the result
#EndIf
tempMessageDialog.Message = Message
tempMessageDialog.ActionButton.Caption = ActionButtonCaption
#If TargetDesktop Then
Select Case MessageDialogIcon
Case "Caution"
tempMessageDialog.IconType = MessageDialog.IconTypes.Caution
Case "Note"
tempMessageDialog.IconType = MessageDialog.IconTypes.Note
Case "Question"
tempMessageDialog.IconType = MessageDialog.IconTypes.Question
Case "Stop"
tempMessageDialog.IconType = MessageDialog.IconTypes.Stop
Case Else
tempMessageDialog.IconType = MessageDialog.IconTypes.Caution
End Select
#EndIf
tempMessageDialog.Explanation = Explanation 'on macOS smaller text below Message, on others it is same size.
tempMessageDialog.Title = Title
tempMessageDialog.CancelButton.Visible = isCancelButtonVisible
If isCancelButtonVisible Then
If isCancelButtonDefault Then
tempMessageDialog.CancelButton.Default = True
tempMessageDialog.ActionButton.Default = False 'we can't have two default buttons!
Else
tempMessageDialog.ActionButton.Default = True 'Default?
tempMessageDialog.CancelButton.Default = False
End If
End If
tempMessageDialog.AlternateActionButton.Visible = isAlternateActionButtonVisible
tempMessageDialog.AlternateActionButton.Caption = AlternateActionButtonCaption
#If TargetDesktop Then
If ShowModalWithinWindow = Nil Then 'check if we need to link it to a specific window
tempMessageDialogButton = tempMessageDialog.ShowModal 'display the dialog
ElseIf ShowModalWithinWindow IsA Window Then 'ensure the object is a Window!
Var tempWindow As Window = Window(ShowModalWithinWindow)
If tempWindow = Nil Then
tempMessageDialogButton = tempMessageDialog.ShowModal 'display the dialog
Else
tempMessageDialogButton = tempMessageDialog.ShowModalWithin(tempWindow) 'display the dialog within the provided Window
End If
Else
tempMessageDialogButton = tempMessageDialog.ShowModal 'display the dialog
End If
Select Case tempMessageDialogButton 'determine which button was pressed.
Case tempMessageDialog.ActionButton
Return "Action"
Case tempMessageDialog.AlternateActionButton
Return "AlternateAction"
Case tempMessageDialog.CancelButton
Return "Cancel"
Case Else
Return "Cancel"
End Select
#ElseIf TargetWeb Then
tempMessageDialog.Show 'display the dialog, the button clicked is already set as Delegates
#EndIf
#EndIf
End Function