我正在将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。
答案 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