I use a rich text editor control that I developed myself. I need to create a popup menu shown when the user right clicks the control. The right click event is raised via MouseClickRight after which the code below executes and a popupmenu is displayed with dynamically created items only. There is no ContextualMenuSelected event used so I get the selected menu with the code below. It works, but feels sluggish and I’m getting weird / random crashes from time to time. I’ve simplified the code below… what is wrong with this?
Furthermore, is there no way to use the Tag property of the selected menu. Using the approach below I read in the documentation that only the Text property can be used??
Var popMenu, m As DesktopMenuItem
// Add a menu item to our popup menu
m = New DesktopMenuItem("My custom menu")
m.Tag = "MyTag"
popMenu.AddMenu(m)
// Show a popup menu
var mSelected as DesktopMenuItem
mSelected = popMenu.PopUp(system.MouseX, system.MouseY)
// Handle the selected menu option
if s <> nil then
if s.Text = "SelectedMenuTextvalue" then
// Success code
end if
end if
Why can’t you use the Tag? What is “sluggish”? What crashes do you get? This is just a popupmenu. I have used this type of popupmenu for years. There was no sluggishness and for sure there were no crashes.
There’s nothing conceptually wrong with your code. I do notice that you never initialize the “popup” variable, it should throw a NilObjectException when you try to add the new menu item to it.
Yeah, that’s just a typo in the demo code, but fixed. Glad to hear this is the right approach, but it seems to behave differently than a popupmenu generated within the contextual event provided by xojo, slower in opening submenus etc. (when hovering) and also like mentioned before, causes a crash from time to time.
your demo code looks odd. you get the menu result in mSelected and later you test s <> nil
Var menu As New DesktopMenuItem
menu.AddMenu(New DesktopMenuItem("Text","Tag"))
Var mSelected As DesktopMenuItem = menu.PopUp(System.MouseX, System.MouseY)
If mSelected<>Nil Then
Select Case mSelected.Tag
Case "Tag"
System.DebugLog mSelected.Tag
End Select
End If