From: Mike R. <mri...@gm...> - 2012-02-16 21:53:57
|
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 <mri...@gm... > <mailto:mri...@gm...>> 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 >> <http://www.inf.puc-rio.br/%7Eroberto/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@...> >> <mailto: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 list >> wxl...@li... <mailto:wxl...@li...> >> 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 > wxl...@li... > <mailto:wxl...@li...> > 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 > wxl...@li... > https://lists.sourceforge.net/lists/listinfo/wxlua-users |