如何用DM Script安全检查GMS UI中子菜单是否存在?
问题:GMS UI开发中安全检查子菜单是否存在
我正在使用GMS UI进行开发,主菜单下可能存在或不存在某个特定子菜单。我的目标是检查该子菜单是否存在,且在不存在时不触发报错。
当前实现代码:
Object MB = GetMenuBar() Object Menu = MB.FindMenuItemByName("Menu") Object SubMenu = Menu.FindMenuItemByName("SubMenu") Result(SubMenu.GetName())
问题在于,当子菜单不存在时,调用Menu.FindMenuItemByName("SubMenu")会触发报错,即使尝试用try-catch块包裹代码也无法解决。
疑问:
- DM Script中是否有内置或推荐的方法,可在访问子菜单属性前验证其是否存在?
- 如何修改脚本,安全检查子菜单是否存在并处理不存在的情况,且不触发报错?
解决方案
关于内置检查方法
DM Script没有直接的Exists类方法,但可以通过验证对象有效性来判断。GMS的UI对象查找失败时,会返回一个内部引用为空的无效Object,使用IsValid()函数检测对象有效性是官方推荐的验证方式。
修改后的安全检查脚本
核心思路是每一步查找后都验证对象有效性,避免调用无效对象的方法触发报错:
Object MB = GetMenuBar() if (!IsValid(MB)) { Result("主菜单对象无效") exit() } Object Menu = MB.FindMenuItemByName("Menu") if (!IsValid(Menu)) { Result("未找到指定主菜单") exit() } Object SubMenu = Menu.FindMenuItemByName("SubMenu") if (IsValid(SubMenu)) { Result("子菜单存在,名称:" + SubMenu.GetName()) } else { Result("子菜单不存在") }
补充说明
IsValid()函数可检测所有GMS对象的有效性,包括菜单、对话框、控件等,是DM Script处理UI对象空引用的标准方案。- 不建议用try-catch处理这类场景,因为GMS部分UI操作的报错无法被常规try-catch捕获,前置
IsValid()检查更可靠。
内容的提问来源于stack exchange,提问作者ChenZX
相关产品推荐
相关产品推荐

