关闭在GMS 2.x和GMS 1.x的一个模式对话框?(Closing a modal dialog

2019-10-22 03:14发布

我有一个需要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,但是,我得到一个错误:脚本对象没有close方法。

相反,我想我会尝试关闭窗口。 替换上面self.close:

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

这既崩溃DM1和DM2。 有没有更好的办法? 做单选按钮,而不是一个模式对话框?

Answer 1:

想必你的目标是具有多种作用的模式“选择”。 这将做一个代码会

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() )
}



Answer 2:

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

self.GetFrameWindow().WindowClose(0)
代替
self.close(0)
在上面的代码中。

然而,这将在GMS 2+崩溃DM。

该UIframe对象的方法close( object self )大湄公河次区域中加入在某些时候脚本语言2开发,因为这个问题。 (窗口管理GMS 1和GMS 2之间改变)



Answer 3:

如果你的主要脚本实际上是在后台线程运行,那么也有使用的信号,等待像下面的脚本信号的选项:

// $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)
}


文章来源: Closing a modal dialog in GMS 2.x and GMS 1.x?