关闭 GMS 2.x 和 GMS 1.x 中的模态对话框?

Closing a modal dialog in GMS 2.x and GMS 1.x?

我有一个需要 3 个选项的对话框,我已将其实现为按钮。它最好由模式对话框提供。我有这样的代码:

class testDialog : uiframe
{
    void OnOne( object self )
    {
        Result( "Doing one\n" )
        self.close()
    }
    void OnTwo( object self )
    {
        Result( "Two.\n" )
        self.close()
    }
    void OnThree( object self )
    {
        Result( "Three.\n" )
        self.close()
    }
}

void ThreeButtonDialog(String description)
{
    TagGroup dialog_items
    TagGroup dialog_tags = DLGCreateDialog( "Test Dialog", dialog_items )
    dialog_items.DLGAddElement( DLGCreateLabel( description ).DLGAnchor( "North" ) ).dlgexternalpadding(5,5)
    TagGroup button_items
    TagGroup button_fields = DLGCreateGroup( button_items )
    DLGLayout( button_fields, DLGCreateTableLayout( 3, 1, 0 ) )
    TagGroup one_button = DLGCreatePushButton("Option1", "OnOne")
    TagGroup two_button = DLGCreatePushButton("Option2", "OnTwo")
    TagGroup three_button = DLGCreatePushButton("Option3", "OnThree")
    button_items.DLGAddElement(one_button)
    button_items.DLGAddElement(two_button)
    button_items.DLGAddElement(three_button)
    dialog_items.DLGAddElement( button_fields )

    Object dialog = alloc( testDialog ).init(dialog_tags)
    dialog.Display("Test...")
    DocumentWindow dialogwin=getdocumentwindow(0)
    WindowSetFrameposition(dialogwin, 300, 200)
}

ThreeButtonDialog("test")

这在 DM2 中工作正常。然而,在 DM1 中,我得到一个错误:脚本对象没有关闭方法。

相反,我想我会尝试关闭 window。将上面的 self.close 替换为:

DocumentWindow dialogwin=getdocumentwindow(0)
dialogwin.WindowClose(0)

这会使 DM1 和 DM2 崩溃。有没有更好的办法?改为使用单选按钮进行模态对话框?

对于 GMS 1.x 从 UIframe 关闭对话框的正确方法是使用

self.GetFrameWindow().WindowClose(0)
而不是
self.close(0)
在你上面的代码中。

但是,这会导致 GMS 2+ 中的 DM 崩溃。

由于这个问题,UIframe 对象的方法 close( object self ) 在 GMS 2 开发期间的某个时候被添加到脚本语言中。 (Window GMS 1 和 GMS 2 之间的管理发生了变化。)

大概您的目标是拥有多个动作的模态'choice'。这样做的代码是

class CThreeButtonDialog:UIFrame
{
    TagGroup DLG,DLGitems
    TagGroup radio,radioItems

    object Init( object self, string title, string prompt, string s1, string s2, string s3 )
    {

        DLG = DLGCreateDialog(title,DLGitems)
        DLGitems.DLGAddElement( DLGCreateLabel(prompt) )
        radio = DLGCreateRadioList( radioItems, 1 )
        radioItems.DLGAddRadioItem(s1,1)
        radioItems.DLGAddRadioItem(s2,2)
        radioItems.DLGAddRadioItem(s3,3)
        DLGitems.DLGAddElement(radio)
        return self.super.init(DLG)
    }

    number GetChoice( object self )
    {
        return radio.DLGGetValue()
    }
}


{
    object myChoice = Alloc(CThreeButtonDialog).Init("Choose","Chose your action","One","Two","Three")
    myChoice.Pose()
    OKDialog( "Chosen action:" + myChoice.GetChoice() )
}

如果您的主脚本实际上 运行 在后台线程上,那么还可以选择使用信号并等待该信号,如以下脚本所示:

// $BACKGROUND$
Class CModal3Options : UIFrame
{
    object waitSignal 
    TagGroup DLG,DLGitems
    number choice

    object Init(object self, string title, string prompt, string s1, string s2, string s3 )
    {
        choice = 0
        DLG = DLGCreateDialog(title,DLGitems)
        DLGitems.DLGAddElement( DLGCreateLabel(prompt) )
        TagGroup but1 = DLGCreatePushButton( s1, "Action1" );
        TagGroup but2 = DLGCreatePushButton( s2, "Action2" );
        TagGroup but3 = DLGCreatePushButton( s3, "Action3" );
        DLGitems.DLGAddElement( DLGGroupItems(but1,but2,but3).DLGTableLayout(3,1,0) )
        self.super.init(DLG)
        waitSignal = NewSignal(0)    
        return self
    }
    void Action1(object self) { choice=1;waitSignal.SetSignal(); }
    void Action2(object self) { choice=2;waitSignal.SetSignal(); }
    void Action3(object self) { choice=3;waitSignal.SetSignal(); }
    number GetChoice(object self) { return choice; }

    number PoseForTime(object self, number timeOutSec )
    {
        self.Display("Test")
        waitSignal.WaitOnSignal(timeOutSec,NULL)
        self.close()
        return choice
    }
}

{
    object dlg = Alloc(CModal3Options).Init("title","Prompt text","one","two","three")
    number choice = dlg.PoseForTime(2)

    if ( 0 == choice )
    {
        OKDialog("Timeout")
    }
    else
        OKDialog("Your choice: "+choice)
}