1

ボタンとして実装した 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 の両方がクラッシュします。より良い方法はありますか?代わりに、ラジオ ボタンを使用してモーダル ダイアログを行いますか?

4

3 に答える 3

0

メイン スクリプトが実際にバックグラウンド スレッドで実行されている場合は、次のスクリプトのように、シグナルを使用してそのシグナルを待機するオプションもあります。

// $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)
}
于 2015-07-02T11:20:42.337 に答える