Lua + Delphi (续)
2012-05-03 15:58 zd5000 阅读(5772) 评论(3) 编辑 收藏 举报
这几天试图在delphi中整合Lua,发现相关的资料相当少。
最早下载的Lua4Delphi(http://sourceforge.net/projects/lua4delphi/files/lua4delphi/)包已经废弃很久了。连自带的示例都无法正常运行。源码中也有显而易见的bug。所以继续寻找可用的组件,找到了LuaDelphi 2010(http://blog.spreendigital.de/wp-content/uploads/2009/10/LuaDelphi2010-v1.3.zip) 这个组件可以正常运行,但有一个缺点:只能注册类中的方法而无法注册类本身。而且注册的类方法必须遵循统一的函数原型。所以它也不是好的选择。
后来找到了一个叫pLua的组件,发现它还是不错的,支持注册类,也支持动态注册类实例。不过它是用Lazarus写的,所以在函数指针上与delphi编译器有差异,在pLuaObject.pas中,plua_pushFunction这个过程要改一下才能正常运行。具体就是把 addr := integer(p^); 改成 addr := integer(p);即可.
具体用法如下:
uses LuaWrapper,pLuaObject; Lua := TLua.Create(self); lua.Value['x'] := 100;//注册变量 Lua.RegisterLuaMethod('ShowMessage', lua_ShowMessage);//注册函数 RegisterLuaButton(Lua.LuaState);//注册类 RegisterExistingButton(Lua.LuaState, 'btn', btn1);//注册类实例 if FileExists('script.lua') then begin Lua.LoadFile('script.lua'); Lua.Execute; showmessage(inttostr(lua.Value['x']));//读取变量 end; var ButtonInfo : TLuaClassInfo; function setButtonInfo : TLuaClassInfo; begin plua_initClassInfo(result); result.ClassName := 'TButton'; result.New := @newButton; plua_AddClassProperty(result, 'Caption', @GetCaption, @SetCaption); plua_AddClassProperty(result, 'Left', @GetLeft, @SetLeft); plua_AddClassProperty(result, 'Top', @GetTop, @SetTop); plua_AddClassProperty(result, 'Width', @GetWidth, @SetWidth); plua_AddClassProperty(result, 'Height', @GetHeight, @SetHeight); plua_AddClassProperty(result, 'Visible', @GetVisible, @SetVisible); plua_AddClassProperty(result, 'Enabled', @GetEnabled, @SetEnabled); plua_AddClassMethod(result, 'Click', @Click); end; procedure RegisterLuaButton(L: Plua_State); begin plua_registerclass(L, ButtonInfo); end; procedure RegisterExistingButton(L: Plua_State; InstanceName : AnsiString; Instance: TButton); begin TButtonDelegate.Create(plua_registerExisting(L, InstanceName, Instance, @ButtonInfo), Instance); end;