大家好:
我想在实场小部件中设置输入值的阈值。下面的代码将创建一个实场小部件,输入值的阈值在 0 到 0.05 之间。
如果您在小部件内输入 0.06,然后单击 GUI 之外的某个位置,它会警告您这不是正确的值,并将该值重置为最后一个值。
但如果你输入0.05,它不会警告你。然后如果您输入任何其他值,它会显示“错误的配置文件”。
我仔细检查了逻辑,没有发现任何错误的代码。有人可以帮我调试吗?多谢。
问候
陈正旭
Number get_tag_as_number(TagGroup tg, String tag_path, String tag_type, Number low_limit, Number high_limit)
{
Number tag_value, tag_is_valid
if (tag_type == "Boolean") tag_is_valid = tg.TagGroupGetTagAsBoolean(tag_path, tag_value)
if (tag_type == "Number") tag_is_valid = tg.TagGroupGetTagAsNumber(tag_path, tag_value)
if (!tag_is_valid)
{
Result("ERROR: Can not get tag value of " + tag_path + "." + "\n")
ShowAlert("Can not get tag value of " + tag_path + ".", 0)
Exit(0)
}
if (tag_value < low_limit || tag_value > high_limit)
{
Result("ERROR: Wrong config file, " + tag_path + "." + "\n")
ShowAlert("Wrong config file, " + tag_path + ".", 0)
Exit(0)
}
return tag_value
}
Class testUI : UIFrame
{
TagGroup ui_config_tg
Void tg_init(Object self)
{
ui_config_tg = NewTagGroup()
ui_config_tg.TagGroupSetTagAsFloat("display_font:init_value", 0.015)
}
TagGroup create_realfield_widget(Object self)
{
Number low_limit = 0
Number high_limit = 0.05
Number init_value = get_tag_as_number(ui_config_tg, "display_font:init_value", "Number", low_limit, high_limit)
TagGroup realfield_widget
realfield_widget = DLGCreateRealField(init_value, 16, 3, "action")
realfield_widget.DLGIdentifier("#realfield_widget")
return realfield_widget
}
Void action(Object self, TagGroup item_tag)
{
Number low_limit = 0
Number high_limit = 0.05
Number curr_value = item_tag.DLGGetValue()
Number init_value
init_value = get_tag_as_number(ui_config_tg, "display_font:init_value", "Number", low_limit, high_limit)
if (curr_value < low_limit || curr_value > high_limit)
{
OKDialog("Font size must between " + low_limit + " to " + high_limit)
self.LookUpElement("#realfield_widget").DLGValue(init_value)
item_tag.DLGValue(init_value)
Exit(0)
}
ui_config_tg.TagGroupSetTagAsFloat("display_font:init_value", curr_value)
Result( curr_value)
}
TagGroup create_dialog(Object self)
{
self.tg_init()
TagGroup realfield_widget = self.create_realfield_widget()
TagGroup tabs = DLGCreateTabList()
tabs.DLGAddElement(realfield_widget)
TagGroup dialog = DLGCreateDialog("test")
dialog.DLGAddElement(tabs)
return dialog
}
testUI(Object self)
{
self.init(self.create_dialog())
self.Display("test")
}
}
Alloc(testUI)
逻辑很好,但是您遇到了舍入问题,这些问题在具有自动数字和字符串转换的脚本语言上特别难以发现。
number
在内部被处理为double(至少在 GMS 3 中)坚持下去
...asNumber
可以避免这些问题。仅在重要的情况下才需要指定类型,例如流式传输到二进制流。请参阅以下示例
或者,您可以通过不完全检查“0”,而是检查解决精度问题的小 epsilon 值来修复脚本: