我正在使用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文档将列表的操作回调描述为
ih:操作(文本:字符串,项目,状态:数字)->(ret:数字)[在Lua]中
然而,当我运行此代码时,我得到:
- text--看起来像某种元表
- 项,state--均为零
我也尝试过将回调编码为
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。
如果您不想在函数中嵌入回调函数,您可以在将其分配给指定目标之前对其进行定义。
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
问题出在Lua的使用上。
在第一种情况下,请记住:
function ih:action(text, item, state)
翻译为:
function action(ih, text, item, state)
因此它缺少ih参数。
在第二种情况下,listCase仅在调用MakeAnIupBox之后才存在。您可以通过在MakeAnIupBox范围内声明函数来解决这个问题。
根据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