Iup Lua callback - что я делаю не так? - PullRequest
0 голосов
/ 16 января 2019

Я использую 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: 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, которые обрабатывают одинаковые наборы данных, но из разных интерфейсов.

Ответы [ 3 ]

0 голосов
/ 16 января 2019

Если вы не хотите встраивать функцию обратного вызова в вашу функцию, вы можете определить ее до, а затем назначить ее указанному получателю.

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
0 голосов
/ 16 января 2019

Опираясь на предложение Антонио Скури, которое не было полностью явным, я решил, что код должен читаться следующим образом:

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
0 голосов
/ 16 января 2019

Проблема в использовании Lua.

В первом случае помните, что это:

function ih:action(text, item, state)

переводится так:

function action(ih, text, item, state)

Так что отсутствует параметр ih.

Во втором случае listCase существует только после вызова MakeAnIupBox. Вы можете решить это, объявив функцию внутри области действия MakeAnIupBox.

...