You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

UI初始化两种方法差异及子对话框创建问题排查

两种子对话框初始化方法的差异分析

方法1(延迟显示)符合预期的原因

方法1中,MySub类仅通过Init方法完成UI结构的初始化,没有在类内部调用任何显示对话框的方法。子对话框的显示逻辑完全交由主对话框的按钮点击事件触发:

  • 脚本启动时,仅创建MySub对象并初始化UI结构,但不会弹出对话框
  • 只有用户点击主对话框的「Options」按钮时,才调用SubDialog.Pose()触发子对话框显示

关键逻辑代码:

// MySub类仅初始化UI,不主动显示
Object Init(Object self)
{
    TagGroup DLGitems = DLGCreateDialog("Sub")
    TagGroup RadioList=DLGCreateRadioList()
    RadioList.DLGAddRadioItem("option 1",1)
    RadioList.DLGAddRadioItem("option 2",2)
    RadioList.DLGAddRadioItem("option 3",3)
    DLGitems.DLGAddElement(RadioList)
    Return self.super.Init(DLGitems)
}

// 主对话框按钮事件触发子对话框显示
Void CallSubDialog(Object self)
{
    Result("\nOpen sub-dialog.")
    SubDialog.Pose()                                // 点击按钮才执行显示
    self.LookUpElement("Label").DLGTitle("option chosen")
}

方法2(构造函数立即创建)弹窗异常的原因

方法2的核心问题在于MySub的构造函数中直接调用了self.Display("MySubUI"):

  • DM脚本中,调用Alloc(MySub)创建类实例时,会自动执行构造函数(MySub(Object self))
  • 构造函数里的Display方法会立即弹出子对话框,完全跳过了按钮点击的触发条件,导致脚本一运行就弹出子对话框

关键错误逻辑代码:

// 构造函数中直接显示对话框,创建对象时就执行
MySub(Object self)
{
    self.init(self.gen_MySubUI_dlg())
    self.Display("MySubUI") // Alloc时立即触发弹窗
}
第三个示例的异常排查

第三个示例的问题是临时对象被垃圾回收机制立即销毁:

  • 在CallSubDialog方法中,Alloc(MySub)创建了MySub对象,构造函数触发对话框显示,但这个对象没有被任何变量(比如SubDialog成员)持有引用
  • DM的垃圾回收(GC)会自动清理无引用的临时对象,导致子对话框刚显示就被销毁,表现为对话框一闪而过或直接抛出异常

修复方案:将创建的对象赋值给成员变量,保持引用避免被GC回收:

Void CallSubDialog(Object self)
{
    Result("\nOpen sub-dialog.")
    SubDialog = Alloc(MySub) // 将对象赋值给成员变量,持有引用
}

内容的提问来源于stack exchange,提问作者ChenZX

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 08:40:58