Iup-Lua回调--我做错了什么

  • 本文关键字:错了 回调 Iup-Lua 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文档将列表的操作回调描述为

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

相关内容

  • 没有找到相关文章

最新更新