1

我有 2 个 Lua 文件,即mydialog.lu a 和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了一个 userdata 类型,它应该通过引用传递来rangetextcontrol跟踪选择,但似乎wb_responses永远不会改变,因为它总是在 Obj1 上打印信息。因此,我假设它总是指向第一个在mydialog.lua中初始化的对象。我在做什么/想错了什么?

4

1 回答 1

0
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初始化后立即打印。它应该如何改变它的价值?这两行代码之间不会有任何事件处理。

于 2016-12-09T10:27:28.087 回答