Составители:
Рубрика:
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
