Thanks,
Milind
On Thu, Feb 16, 2012 at 1:53 PM, Mike Richards <mrichard...@gmx.com> wrote:
> Milind,
> You could also accomplish the same with a little less typing if you want:
>
> module(...)
> local _M = _M -- save the module table
>
> then in your event handler function it's just setfenv(1, _M)
>
> Mike
>
> On 2/16/2012 4:42 PM, Milind Gupta wrote:
>
> Hi Mike,
> I agree a good practice is to declare things local, only for things
> we want to access from outside unrestricted its easier not to declare them
> local. So anyway what I ended up doing is having the first statement in my
> event handler function as setfenv(1,package.loaded[modname]) where modname
> is the name of the module passed by lua to the module. Since require loads
> the module function there so it just picks it up from there.
>
> Thanks,
> Milind
>
> On Thu, Feb 16, 2012 at 12:06 PM, Mike Richards <mrichard...@gmx.com>wrote:
>
>> John and Milind,
>>
>> function test() is declared in the current scope, and globally as
>> filterform.test
>>
>> After fiddling around for a bit, it looks like wx.wxEvtHandler:Connect
>> saves upvalues, but not the current function environment (scope), which was
>> set in the call to module(...)
>> When the event function is called, the function environment is reset to
>> the global scope, so if you want to reference things you declared in the
>> module scope in the event callback, you have a couple of options:
>> 1. Declare everything as local, which to me is just good practice.
>> 2. Use a fully qualified name (e.g. filterform.test())
>> 3. Wrap all your calls to wx.wxEvtHandler:Connect like this:
>>
>> function Connect(evthandler, id, func)
>> local environment = getfenv(1)
>> evthandler:Connect(id,
>> function(event)
>> setfenv(1, environment)
>> func(event)
>> end
>> )
>> end
>>
>> [...]
>>
>> local button = wx.Button([...])
>> Connect(button, wx.wxEVT_COMMAND_BUTTON_CLICKED, function(event) end)
>>
>> John -- It seems like wx.wxEvtHandler:Connect should do this anyways . .
>> . that is, save the current function environment, and then apply it before
>> calling the callback.
>>
>> Mike
>>
>>
>> On 2/16/2012 3:14 AM, Milind Gupta wrote:
>>
>> Hello John,
>> Sorry for the carelessness. Here is a full set with
>> minimal.lua which is the main file to run and the module function is called
>> by the Help->About call back. That is true making test a local function
>> makes it work although I am not totally clear why but if you press the
>> other button 'Clear Task' it will give an error complaining about filter
>> which again is not declared local. Actually declaring local anything in a
>> module only makes it private. Whether it is declared local or not it always
>> resides in the module environment. So even if test or filter are not
>> declared local they should be identified in the module environment. Here is
>> the Programming in Lua Modules and Packages chapter that clarifies it:
>>
>> http://www.inf.puc-rio.br/~roberto/pil2/chapter15.pdf
>>
>> At least that is how I understood it. So I think it should work without
>> being declared local. In your previous email you said that the environment
>> is saved as an upvalue with the execution of Connect. I am not sure how
>> that would be done since the module itself does not know what environment
>> to Global it will be in. Like if you see in minimal I placed it in the
>> environment newPackage and all my functions tables declared in the module
>> i.e. test, filter, etc. are in the table newPackage in the global
>> environment but the module code has no way of knowing that.
>> One last point is that unless its an event callback function normal
>> functions in the module run just fine whether test is local or not. As an
>> example I just added the test() call as the first line in
>> filterFormActivate which is a non event function so when the Help-> About
>> callback calls filterFormActivate, test() just runs fine even though it is
>> not local but now if you press the Select Task button it will say it could
>> not find test().
>>
>>
>> Milind
>>
>>
>> On Wed, Feb 15, 2012 at 3:14 AM, Milind Gupta
>> <milind.gupta@...><milind.gupta@...>wrote:
>> > Hello John,
>> >
>> > thanks for the reply. Here is an example code that does not
>> work
>>
>> Please try to provide enough code to make it run out of the box... I
>> had to add back GUI.initFrameH and rem out the usage of MainSizer to
>> make it even possible to run without error.
>>
>> > (Pasted below and attached the file as well). A function from the
>> main wxlua
>> > application calls filterFormActivate which sets up a simple frame with 2
>> > buttons and one static text and associates the button click to
>> SelTaskPress.
>>
>> I made the help menu callback function of the minimal.wx.lua sample
>> call filterform.filterFormActivate(frame).
>>
>> > But when the button is clicked the test() statement gives an error.
>> If that
>> > is removed then it cannot recognize the frame varaiable in the
>> > wx.wxFrame(frame line after test().
>>
>> Please always include these errors in the future to help diagnose the
>> problem.
>>
>> In order to solve your problem I made test() a local function so that
>> it will be an upvalue of the Connect() function that calls it. Note
>> that the 'frame' that is used in the SelTaskPress() function is the
>> frame from the minimal.wx.lua and not the frame from
>> filterFormActivate().
>>
>> To be honest, I have not done too much with modules and require in Lua
>> since I'm not sure I fully understand its behavior.
>>
>> I just came across this which clears some things up for me. Note the
>> sentence "This means that any global functions are not visible by
>> default, which is why we had to create a local alias to print." This
>> is probably also why making test() local above fixed it. See also
>> package.seeall which might be useful to you.
>> http://www.luafaq.org/#T1.37
>>
>> Hope this helps,
>> John
>>
>>
>>
>>
>> ------------------------------------------------------------------------------
>> Virtualization & Cloud Management Using Capacity Planning
>> Cloud computing makes use of virtualization - but cloud computing
>> also focuses on allowing computing to be delivered as a
>> service.http://www.accelacomm.com/jaw/sfnl/114/51521223/
>>
>>
>>
>> _______________________________________________
>> wxlua-users mailing
>> listwxlua-users@lists.sourceforge.nethttps://lists.sourceforge.net/lists/listinfo/wxlua-users
>>
>>
>>
>> ------------------------------------------------------------------------------
>> Virtualization & Cloud Management Using Capacity Planning
>> Cloud computing makes use of virtualization - but cloud computing
>> also focuses on allowing computing to be delivered as a service.
>> http://www.accelacomm.com/jaw/sfnl/114/51521223/
>> _______________________________________________
>> wxlua-users mailing list
>> wxlua-users@lists.sourceforge.net
>> https://lists.sourceforge.net/lists/listinfo/wxlua-users
>>
>>
>
>
> ------------------------------------------------------------------------------
> Virtualization & Cloud Management Using Capacity Planning
> Cloud computing makes use of virtualization - but cloud computing
> also focuses on allowing computing to be delivered as a
> service.http://www.accelacomm.com/jaw/sfnl/114/51521223/
>
>
>
> _______________________________________________
> wxlua-users mailing
> listwxlua-users@lists.sourceforge.nethttps://lists.sourceforge.net/lists/listinfo/wxlua-users
>
>
>
> ------------------------------------------------------------------------------
> Virtualization & Cloud Management Using Capacity Planning
> Cloud computing makes use of virtualization - but cloud computing
> also focuses on allowing computing to be delivered as a service.
> http://www.accelacomm.com/jaw/sfnl/114/51521223/
> _______________________________________________
> wxlua-users mailing list
> wxlua-users@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/wxlua-users
>
>
------------------------------------------------------------------------------
Virtualization & Cloud Management Using Capacity Planning
Cloud computing makes use of virtualization - but cloud computing
also focuses on allowing computing to be delivered as a service.
http://www.accelacomm.com/jaw/sfnl/114/51521223/
_______________________________________________
wxlua-users mailing list
wxlua-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/wxlua-users