unit uAnyComponent;

interface

uses
  SysUtils, Classes,
{$IFDEF VCL}
  Forms,
{$ELSE}
  QForms,
{$ENDIF}
  Rubies;

function ap_iAnyComponent_v(var Component; owner: Tvalue): Tvalue;
(*
  任意の Delphi Component に対応する Ruby Object を返す。

  GetAllocFunc においてクラス名が PhiAllocFuncList に含まれていない
  場合にこの関数が返される。

  : var Component
    任意の Delphi Component

  引数に指定した Component の Delphi Class に対応する Ruby Class は
  AnyRubyClassList から探す。見つからなければ Ruby Class を生成して
  AnyRubyClassList に加える。
*)

function AnyForm_alloc(real: TForm): Tvalue;
(*
  任意の Delphi Form に対応する Ruby Object を返す。

  PhiLoadForm から呼ばれる。

  : real: TForm
    任意の Delphi Form

  引数に指定した real Form の Delphi Class に対応する Ruby Class は
  AnyRubyClassList から探す。見つからなければ Ruby Class を生成して
  AnyRubyClassList に加える。
*)

implementation

uses
  uHandle, uAlloc, uPhi, uProp, uComponent, uForm;

var
  AnyRubyClassList: TStringList;

function DefineRubyClass(real: TPersistent; super: Tvalue): Tvalue;
var
  AClass: TPersistentClass;
  S: string;
  i: Integer;
begin
  AClass := TPersistentClass(real.ClassType);
  RegisterClass(AClass);
  S := real.ClassName;
  i := AnyRubyClassList.IndexOf(S);
  if i < 0 then
  begin
    result := rb_define_class_under(mPhi, PChar(S)+1, super);
    AnyRubyClassList.AddObject(S, Pointer(result));
    DefineProp(result, AClass);
  end else
    result := Tvalue(AnyRubyClassList.Objects[i])
  ;
end;

function ap_iAnyComponent_v(var Component; owner: Tvalue): Tvalue;
var
  real: TComponent;
  cAny: Tvalue;
begin
  real := TComponent(Component);
  cAny := DefineRubyClass(real, ap_cObject);
  result := ChildAlloc(cAny, real);
  ap_owner(result, owner);
//    AssignPropMethod(real, [Handle]);
end;

function AnyForm_alloc(real: TForm): Tvalue;
var
  cAny: Tvalue;
begin
  cAny := DefineRubyClass(real, cForm);
  result := ChildAlloc(cAny, real);
  Form_setup(result, real);
end;

initialization
  AnyRubyClassList := TStringList.Create;

finalization
  AnyRubyClassList.Free;

end.
