【问题标题】:How to create a spin box in dm-script?如何在 dm-script 中创建旋转框?
【发布时间】:2018-03-02 17:34:12
【问题描述】:

我想在 dm-script 中的模态/非模态对话框上创建一个旋转框,使用户能够通过单击向上或向下箭头按钮(即旋转按钮)来增加或减少文本字段中的数值。

有没有合适的方法来创建这样一个旋转框?如果您分享一些智慧,将不胜感激。非常感谢您。

【问题讨论】:

    标签: user-interface dialog dm-script


    【解决方案1】:

    脚本对话框不存在“旋转控制”。

    但是,您可以通过创建和排列相应的按钮来构建代理旋转控件。这有点粗糙,但下面的代码创建了这个:

    Class CMySpin : UIFrame
    {
        TagGroup CreateDLGTgs( object self )
        {
            TagGroup DLGtgs, DLGItems
            DLGtgs = DLGCreateDialog( "Test", DLGItems )
            TagGroup upButton = DLGCreatePushButton( "U", "OnPushUp" ).DLGExternalPadding(0,-5).DLGInternalPadding(-2,-3)
            TagGroup downButton = DLGCreatePushButton( "D", "OnPushDown" ).DLGInternalPadding(-2,-3)
            TagGroup field = DLGCreateIntegerField( 10, 10 ).DLGIdentifier( "field" )
            
            TagGroup SpinGroup = DLGGroupItems( upButton, downButton ).DLGTableLayout(1,2,0)
            TagGroup fieldWithSpin = DLGGroupItems( field, SpinGroup ).DLGTableLayout(2,1,0)
            DLGItems.DLGAddElement( fieldWithSpin )
            return DLGtgs
        }
    
        void OnPushUp( object self )
        {
            taggroup fieldTG = self.LookupElement( "field" )
            number value =  fieldTG.DLGGetValue()
            value++
            fieldTG.DLGValue( value )
        }
        
        void OnPushDown( object self )
        {
            taggroup fieldTG = self.LookupElement( "field" )
            number value =  fieldTG.DLGGetValue()
            value--
            fieldTG.DLGValue( value )
        }
        
        void CreateAndPose( object self )
        {
            self.Init( self.CreateDLGTgs() )
            self.Pose()
        }
    }
    
    Alloc(CMySpin).CreateAndPose()
    

    然后,您可以通过使用位图按钮而不是简单的按钮来调整外观,并进行设置,直到它们看起来更有吸引力。

    f.e.我创建了这个变体:

    使用此代码:

    Class CMySpin : UIFrame
    {
        
        TagGroup CreateDLGTgs( object self )
        {
            image arrowImg := [7,5]:
                    {   { 0, 0, 0, 0, 0, 0, 0 },
                        { 0, 0, 0, 1, 0, 0, 0 },
                        { 0, 0, 1, 1, 1, 0, 0 },
                        { 0, 1, 1, 1, 1, 1, 0 },
                        { 0, 0, 0, 0, 0, 0, 0 } }
    
    
            number factor = 2
            image upArrow := RealImage("",4,factor*7,factor*5)
            upArrow=arrowImg.warp( icol / factor, irow / factor ) 
            image downArrow = upArrow
            downArrow.FlipVertical()
            
            rgbImage upArrowUp = RGB( upArrow * 100, upArrow * 100, upArrow * 100 )
            rgbImage upArrowDown = RGB( upArrow * 200, upArrow * 200, upArrow * 200 )
            rgbImage downArrowUp = RGB( downArrow * 100, downArrow * 100, downArrow * 100 )
            rgbImage downArrowDown = RGB( downArrow * 200, downArrow * 200, downArrow * 200 )
                
            TagGroup DLGtgs, DLGItems
            DLGtgs = DLGCreateDialog( "Test", DLGItems )
            TagGroup upButton = DLGCreateBevelButton( upArrowUp, upArrowDown, "OnPushUp" ).DLGExternalPadding(0,-3).DLGInternalPadding(-2,-3)
            TagGroup downButton = DLGCreateBevelButton( downArrowUp, downArrowDown, "OnPushDown" ).DLGExternalPadding(0,-3).DLGInternalPadding(-2,-3)
            TagGroup field = DLGCreateIntegerField( 10, 10 ).DLGIdentifier( "field" )
            
            TagGroup SpinGroup = DLGGroupItems( upButton, downButton ).DLGTableLayout(1,2,0)
            TagGroup fieldWithSpin = DLGGroupItems( field, SpinGroup ).DLGTableLayout(2,1,0)
            DLGItems.DLGAddElement( fieldWithSpin )
            
            return DLGtgs
        }
    
        void OnPushUp( object self )
        {
            taggroup fieldTG = self.LookupElement( "field" )
            number value =  fieldTG.DLGGetValue()
            value++
            fieldTG.DLGValue( value )
        }
        
        void OnPushDown( object self )
        {
            taggroup fieldTG = self.LookupElement( "field" )
            number value =  fieldTG.DLGGetValue()
            value--
            fieldTG.DLGValue( value )
        }
        
        void CreateAndPose( object self )
        {
            self.Init( self.CreateDLGTgs() )
            self.Pose()
        }
    }
    
    Alloc(CMySpin).CreateAndPose()
    

    【讨论】:

    • 非常感谢您的快速响应和展示示例脚本。他们为我的目的工作得很好。我真的很感谢你的建议。顺便说一句,当字段处于活动状态时,我们可以通过按向上/向下箭头键来增加或减少值,而不是按向上/向下按钮吗?如果实现不是那么困难,我想在我的脚本中实现这个附加功能。
    • @kachigusa 这将是一个单独的问题,但作为一个简短的回答:只有将“keylistener”附加到图像显示并且将这样的图像“放在最前面”时,您才能这样做,或者如果您有一些后台线程运行脚本不断检查关键事件。第二个完全不建议。第一个很简单,但只对特定情况有用。不幸的是,您可以在对话框元素上没有键侦听器。
    • 我非常感谢您的有用建议,尽管我的附加问题应该是一个单独的问题。我想知道 dm-script 中是否有对话框元素的键侦听器。尽管缺少此类关键列表对我来说是不幸的消息,但您建议的替代方法是非常有用的想法。非常感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多