Составители:
Рубрика:
22
{------------------------------------------------------------------------------}
const
TMyComponent_tag: integer = LUA_NOTAG;
function TMyComponent_gettable_event( L: lua_State ): integer; cdecl;
function TMyComponent_settable_event( L: lua_State ): integer; cdecl;
{------------------------------------------------------------------------------}
const
type_TMyComponent = LUA_TTABLE;
function to_TMyComponent( L: lua_State;
value_index: integer ): TMyComponent;
function push_TMyComponent( L: lua_State;
value: TMyComponent ): integer;
{==============================================================================}
implementation
uses
SysUtils,
LuaDebug,
TMyComponent_LuaObject;
////////////////////////////////////////////////////////////////////////////////
function TMyComponent_alloc( L: lua_State ): integer; cdecl;
var MyComp: TMyComponent;
begin
Result := 1;
MyComp := TMyComponent.Create();
PushObjectHandleWithTag( L, MyComp );
end;
{------------------------------------------------------------------------------}
function TMyComponent_new( L: lua_State ): integer; cdecl;
var top: integer;
begin
Result := 1;
if lua_type( L, 1 ) <> LUA_TTABLE then begin
lua_pushnil( L ) // если это не таблица, необходимо возвращать nil
end
else begin
TMyComponent_alloc( L ); // создаем экземпляр объекта и посылаем в стек
CreateTableCopy( L, 1 ); // создаем копию таблицы и посылаем в стек
top := lua_gettop( L );
SetObjectHandleToTable( L, top, lua_gettop(L)-1 ); // ассоциируем
// таблицу и объект
lua_remove( L, -2 ); // удаляем копию объекта из стека
// на вершине остается только таблица
if TMyComponent_Tag = LUA_NOTAG then begin
// создаем tag для таблицы
TMyComponent_Tag := lua_newtag( L );
lua_pushcfunction( L, TMyComponent_gettable_event );
lua_settagmethod( L, TMyComponent_Tag, 'gettable' );
lua_pushcfunction( L, TMyComponent_settable_event );
lua_settagmethod( L, TMyComponent_Tag, 'settable' );
end;
lua_settag( L, TMyComponent_Tag ); // ассоциируем tag и таблицу
end;
end;
////////////////////////////////////////////////////////////////////////////////
function TMyComponent_gettable_event( L: lua_State ): integer; cdecl;
begin
Result := 1;
lua_pushvalue( L, 2 );
lua_rawget( L, 1 );
end;
{------------------------------------------------------------------------------} const TMyComponent_tag: integer = LUA_NOTAG; function TMyComponent_gettable_event( L: lua_State ): integer; cdecl; function TMyComponent_settable_event( L: lua_State ): integer; cdecl; {------------------------------------------------------------------------------} const type_TMyComponent = LUA_TTABLE; function to_TMyComponent( L: lua_State; value_index: integer ): TMyComponent; function push_TMyComponent( L: lua_State; value: TMyComponent ): integer; {==============================================================================} implementation uses SysUtils, LuaDebug, TMyComponent_LuaObject; //////////////////////////////////////////////////////////////////////////////// function TMyComponent_alloc( L: lua_State ): integer; cdecl; var MyComp: TMyComponent; begin Result := 1; MyComp := TMyComponent.Create(); PushObjectHandleWithTag( L, MyComp ); end; {------------------------------------------------------------------------------} function TMyComponent_new( L: lua_State ): integer; cdecl; var top: integer; begin Result := 1; if lua_type( L, 1 ) <> LUA_TTABLE then begin lua_pushnil( L ) // если это не таблица, необходимо возвращать nil end else begin TMyComponent_alloc( L ); // создаем экземпляр объекта и посылаем в стек CreateTableCopy( L, 1 ); // создаем копию таблицы и посылаем в стек top := lua_gettop( L ); SetObjectHandleToTable( L, top, lua_gettop(L)-1 ); // ассоциируем // таблицу и объект lua_remove( L, -2 ); // удаляем копию объекта из стека // на вершине остается только таблица if TMyComponent_Tag = LUA_NOTAG then begin // создаем tag для таблицы TMyComponent_Tag := lua_newtag( L ); lua_pushcfunction( L, TMyComponent_gettable_event ); lua_settagmethod( L, TMyComponent_Tag, 'gettable' ); lua_pushcfunction( L, TMyComponent_settable_event ); lua_settagmethod( L, TMyComponent_Tag, 'settable' ); end; lua_settag( L, TMyComponent_Tag ); // ассоциируем tag и таблицу end; end; //////////////////////////////////////////////////////////////////////////////// function TMyComponent_gettable_event( L: lua_State ): integer; cdecl; begin Result := 1; lua_pushvalue( L, 2 ); lua_rawget( L, 1 ); end; 22