Lua_Classes.pas 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. //******************************************************************************
  2. //*** LUA SCRIPT FUNCTIONS ***
  3. //*** ***
  4. //*** (c) Massimo Magnano 2006 ***
  5. //*** ***
  6. //*** ***
  7. //******************************************************************************
  8. // File : Lua_Classes.pas (rev. 1.0)
  9. //
  10. // Description : Access from Lua scripts to Class declared in "Classes.pas"
  11. //
  12. //******************************************************************************
  13. unit Lua_Classes;
  14. interface
  15. uses TypInfo, Variants, Lua_Object;
  16. type
  17. TLuaComponent = class(TLuaObject)
  18. protected
  19. class function GetPublicPropertyAccessClass :TClass; override;
  20. public
  21. //TClass TComponent TComponent
  22. function LuaCreate(ObjClass :Integer; AOwner :Integer) :Integer; overload;
  23. function GetArrayPropType(Name :String; index :Variant) :PTypeInfo; override;
  24. function GetArrayProp(Name :String; index :Variant) :Variant; override;
  25. function GetElementType(Name :String) :PTypeInfo; override;
  26. function GetElement(Name :String) :Variant; override;
  27. end;
  28. implementation
  29. uses Classes, SysUtils, StdCtrls;
  30. type
  31. TComponentAccess = class(TComponent)
  32. published
  33. property ComponentIndex;
  34. property ComponentCount;
  35. end;
  36. function TLuaComponent.LuaCreate(ObjClass :Integer; AOwner :Integer) :Integer;
  37. Var
  38. xObjClass :TClass;
  39. begin
  40. xObjClass :=TClass(ObjClass);
  41. if (xObjClass.InheritsFrom(TComponent))
  42. then Result :=Integer(TComponentClass(xObjClass).Create(TComponent(AOwner)))
  43. else Result :=Integer(TComponent(LuaCreate(ObjClass)));
  44. end;
  45. function TLuaComponent.GetArrayPropType(Name :String; index :Variant) :PTypeInfo;
  46. begin
  47. Name :=Uppercase(Name);
  48. Result :=nil;
  49. if (Name='COMPONENTS')
  50. then begin
  51. if (TComponent(InstanceObj).Components[index]<>nil)
  52. then Result :=TypeInfo(TComponent)
  53. else Result :=nil;
  54. end;
  55. end;
  56. function TLuaComponent.GetArrayProp(Name :String; index :Variant) :Variant;
  57. begin
  58. Name :=Uppercase(Name);
  59. Result :=NULL;
  60. if (Name='COMPONENTS')
  61. then begin
  62. if (TComponent(InstanceObj).Components[index]<>nil)
  63. then Result :=Integer(TComponent(InstanceObj).Components[index]);
  64. end;
  65. end;
  66. function TLuaComponent.GetElementType(Name :String) :PTypeInfo;
  67. Var
  68. upName :String;
  69. begin
  70. upName :=Uppercase(Name);
  71. Result :=nil;
  72. if (upName='COMPONENTS')
  73. then Result :=@TypeInfoArray
  74. else
  75. if (TComponent(InstanceObj).FindComponent(Name)<>nil)
  76. then Result :=TypeInfo(TComponent);
  77. end;
  78. function TLuaComponent.GetElement(Name :String) :Variant;
  79. Var
  80. theComponent :TComponent;
  81. begin
  82. Result :=NULL;
  83. theComponent :=TComponent(InstanceObj).FindComponent(Name);
  84. if (theComponent<>nil)
  85. then Result :=Integer(theComponent);
  86. end;
  87. class function TLuaComponent.GetPublicPropertyAccessClass :TClass;
  88. begin
  89. Result :=TComponentAccess;
  90. end;
  91. initialization
  92. Lua_Object.RegisterClass(TComponent, TLuaComponent);
  93. end.