Iup Lua回调-我在做什么错?

时间:2019-01-16 12:45:57

标签: lua iup

我正在将Lua 5.1与IUP 3.5配合使用,并尝试使用列表回调根据所选择的位置来填充地址列表。 (该列表是一个编辑框,因此我将在适当的时候进行处理,但让我们首先处理基础知识)。我显然对如何执行此操作有基本的误解。

代码:

function MakeAnIupBox
    --make some more elements here
    listPlace = iup.list{}
    listPlace.sort = "YES"
    listPlace.dropdown = "YES" 
    --populate the list here
    --now handle callbacks
    listPlace.action = function(self) PlaceAction(text, item,  state) end
end

function PlaceAction(text, item, state)
    listAddress.REMOVEITEM = "ALL"
    if state == 1 then -- a place has been selected
    --code here to populate the Addresses list
    end
end

iup documentation将列表的操作回调描述为

  

ih:action(文本:字符串,项目,状态:数字)->(ret:数字)[在Lua中]

但是,当我运行此代码时,我得到:

  • 文本-看起来有点像元表
  • 项目,状态-均为零

我也尝试将回调编码为

function MakeAnIupBox
    --make some more elements here
    listPlace = iup.list{}
    listPlace.sort = "YES"
    listPlace.dropdown = "YES" 
    --populate the list here
end
function listPlace:action (text, item, state)
    listAddress.REMOVEITEM = "ALL"
    if state == 1 then -- a place has been selected
        --code here to populate the Addresses list
    end
end 

但是无法运行:错误为attempt to index global 'listPlace' (a nil value)

我不希望将回调函数嵌入“ MakeAnIupBox”中,因为我希望使它(以及其他相关的回调函数)在多个Lua程序中成为可重用的组件,这些程序都处理相似的数据集,但来自不同的UI。

3 个答案:

答案 0 :(得分:1)

如果您不想在函数中嵌入回调函数,则可以先定义它,然后再将其分配给指定的目的地。

function Callback(self, a, b)
   -- do your work ...
end

function CallbackUser1()
    targetTable = { }
    targetTable.entry = Callback
end

function CallbackUser2()
    otherTargetTable = { }
    otherTargetTable.entry = Callback
end

此解决方案需要参数始终相同。

注意:以下所有定义均相同

function Table:func(a, b) ... end
function Table.func(self, a, b) ... end
Table.func = function(self, a, b) ... end

答案 1 :(得分:0)

问题出在Lua使用上。

在第一种情况下,请记住以下几点:

function ih:action(text, item, state)

翻译成这样:

function action(ih, text, item, state)

因此它缺少ih参数。

在第二种情况下,listCase仅在调用MakeAnIupBox之后存在。您可以通过在MakeAnIupBox范围内声明函数来解决该问题。

答案 2 :(得分:0)

基于安东尼奥·斯库里(Antonio Scuri)的建议(并非完全明确),我得出了代码需要阅读:

function MakeAnIupBox
    --make some more elements here
    listPlace = iup.list{}
    listPlace.sort = "YES"
    listPlace.dropdown = "YES" 
    --populate the list here
    --now handle callbacks
    listPlace.action = function(self, text, item, state) PlaceAction(listPlace, text, item,  state) end
end

function PlaceAction(ih, text, item, state)
    listAddress.REMOVEITEM = "ALL"
    if state == 1 then -- a place has been selected
    --code here to populate the Addresses list
    end
end