【问题标题】:Lua userdata pass by reference - local functions in different filesLua userdata 通过引用传递 - 不同文件中的本地函数
【发布时间】:2016-12-09 02:46:56
【问题描述】:

我有 2 个 Lua 文件,分别是 mydialog.lua 和 rangecontrol.lua。 mydialog.lua 中的代码如下:

local function mydialog()
    --omitted
    local wb_responses=activeobj() --wb_responses points to the current activeobj(), say Obj1
    UI.m_txt=sys.rangetextcontrol(UI.sbSizerInput:GetStaticBox() ,wb_responses) --wb_responses is passed by reference
    --Selection event happened
    --Omitted
    --If clicked on a checkbox execute the following line
    print(wb_responses) --Still prints Obj1 instead of Obj2
end
sys.tools.mydialog=mydialog

rangecontrol.lua 中的代码:

local function rangetextcontrol(parent, wb_txtBox) 

    local  m_txtBox=nil
    m_txtBox=wx.wxTextCtrl( parent, wx.wxID_ANY, "", wx.wxDefaultPosition, wx.wxDefaultSize, 0 )

    local function GetRange()
        wb_txtBox=activeobj()
        local ws=activeobj():cur()
        local rng=ws:selection()
        if (rng==nil)  then return end
        m_txtBox:SetValue(rng:tostring()) -- Here wb_txtBox correctly refers to Obj2
    end

    m_txtBox:Connect( wx.wxEVT_LEFT_DOWN, function(event)
        wb_txtBox=activeobj() --Current activeobj() changed, say Obj2
        local ws=wb_txtBox:cur()
        ws:connect(GetRange) --There is a selection event, call GetRange

        event:Skip()
    end)
    return m_txtBox
end
sys.rangetextcontrol=rangetextcontrol

简要说明会发生什么:

1) 一个对话框开始,它有一个文本控件(可能有几个文本控件)

2) 当用户从一个对象中进行选择时,会填充文本框。

3) 我的目标是跟踪从哪个对象进行选择。

我的困惑:虽然我传递了wb_responses 一个用户数据类型,它应该通过引用来传递rangetextcontrol 来跟踪选择,但似乎wb_responses 从未改变过它总是在 Obj1 上打印信息。因此,我假设它总是指向在 mydialog.lua 中初始化的第一个对象。我做错了什么/想错了什么?

【问题讨论】:

  • 我认为您应该提供 activeobj() 的代码来完成您的问题
  • @Piglet: activeobj() 函数工作正常,因为选择在m_txtBox:Connect 中显示了正确的字符串值。只是当我通过wb_responses时,它的值没有改变。

标签: lua wxlua


【解决方案1】:
local function mydialog()
    --omitted
    local wb_responses=activeobj() --wb_responses points to the current activeobj(), say Obj1
    UI.m_txt=sys.rangetextcontrol(UI.sbSizerInput:GetStaticBox() ,wb_responses) --wb_responses is passed by reference
    --Selection event happened
    print(wb_responses) --Still prints Obj1 instead of Obj2
end

您在初始化后立即打印wbresponses。它应该如何改变它的价值?这两行代码之间不会有任何事件处理。

【讨论】:

  • 你是对的,我已经编辑了这个问题。 print(wb_response) 实际上是在一个复选框事件中。所以在做出选择后,我点击复选框print(wb_responses)
猜你喜欢
  • 1970-01-01
  • 2022-01-11
  • 1970-01-01
  • 2010-09-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-05
  • 2014-09-25
相关资源
最近更新 更多