【问题标题】:Populating an iup list from a lua table从 lua 表填充 iup 列表
【发布时间】:2019-01-06 12:59:57
【问题描述】:

我正在构建一组 IUP 对话框“帮助器”函数——我可以将其包含在我的 Lua 代码中的样板,以便以一致的方式快速实现常用的接口功能。

我有一个函数可以创建一个带有回调的“标准”iup 列表:

function MakeList(funcSelect)
    return iup.list{
        valuechanged_cb = function(self)
            funcSelect()
        end,
        sort = "YES", dropdown = "YES", editbox = "NO",
        expand = "YES", visibleitems = "5"}
end

但我现在想对其进行增强,以便有选择地使用静态值列表填充它,以便我可以调用例如mylist = MakeList(myFunction, {"X", "B", "Q"}),其中函数规范为function MakeList(funcSelect, tblVals),并返回填充的列表,如果值表是以

的(等价物)形式给出
iup.list{"X", "B", "Q";
        valuechanged_cb = function(self)
            funcSelect()
        end,
        sort = "YES", dropdown = "YES", editbox = "NO",
        expand = "YES", visibleitems = "5"}

但如果值表未指定或为空,则(最终)不会填充 - 这是问题的第 2 阶段。

列表将在映射之前填充;我知道在使用myList.APPENDITEM 映射后该怎么做,但是对于不需要的静态列表(应该吗?)

我试过了

function MakeStaticList(funcSelect, tblVals)
    return iup.list{table.unpack(tblVals);
        valuechanged_cb = function(self)
            funcSelect()
        end,
        sort = "YES", dropdown = "YES", 
        editbox = "NO", expand = "YES", visibleitems = "5"}
end

但这会导致这种行为:Lua unpack() messing arguments,因此只有表中的第一项被添加到列表中。

我也试过

function MakeStaticList(funcSelect, tblVals)
    l = iup.list{valuechanged_cb = function(self)
            funcSelect()
        end,
        sort = "YES", dropdown = "YES", editbox = "NO", expand = "YES", visibleitems = "5"}
      for i, v in ipairs(tblVals) do
            l[tostring(i)]=v
      end
    return l
end

这行得通,但有没有更简洁的方法?

我想先解决填充问题,然后再讨论值表的可选性。

环境是 Lua 5.1 和 compat-5.3 模块。

【问题讨论】:

  • table.unpack(tblVals) 如果它是表文字中的最后一件事,应该可以工作。否则,它会被截断为一个值。

标签: lua iup


【解决方案1】:

如果它对任何人都有帮助,我最终所做的是(满足索引列表和非索引列表):

    local function PopulateList(l, tblVals)
        local is_indexed = (rawget( tblVals, 1 ) ~= nil)
        if not is_indexed then
            local i=1
            for k, _ in pairs(tblVals) do
                l[tostring(i)]=k
                i=i+1
            end
        else
            for i, v in ipairs(tblVals) do
                l[tostring(i)]=v
            end 
        end
    end

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-08
    • 2018-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-28
    相关资源
    最近更新 更多