ϊ邽߂̐`
`Cu
DLL

!zz
Apollo̔zźARuby̔zzɏ]AƂ̂҂̈ӌłBAApolloDelphi 6ō쐬AvP[Vł邩ABorland߂zzɔB

!Delphi\[Ẍ
Borland߂zz邱ƁB
: license.txt : Borland Delphi 6 gp_
: deploy.txt : Delphi AvP[V̔zzɂ
͌̕JĂ悢̂?

!^`FbN
܂:
	function StrColGrid_set_cell_params(This, v: Tvalue): Tvalue; cdecl;
	var
	  real: TStrColGrid;
	begin
	  real := ap_data_get_struct(This);
	  real.CellParams := TSCGCellParams(ap_data_get_struct(v)); //댯
	  result := v;
	end;

TSCGCellParamsւ̃LXg댯Bap_data_get_struct(v)̌^`FbNKvB
Thisrealւ̕ϊ̓`FbNKvȂBȂȂÅ֐ThisStrColGrid̃CX^Xł邱ƂۏႳ邩B
sȃLXgsRuby̗O΂B̂߂ap_data_get_objectgB

	function StrColGrid_set_cell_params(This, v: Tvalue): Tvalue; cdecl;
	var
	  real: TStrColGrid;
	  CellParams: TSCGCellParams;
	begin
	  real := ap_data_get_struct(This);
	  ap_data_get_object(v, TSCGCellParams, CellParams);
	  real.CellParams := CellParams;
	  result := v;
	end;

ap_data_get_object ̒`:
uDefUtils.pas:
	procedure ap_data_get_object(v: Tvalue; AClass: TClass; var Ret);
	var
	  Obj: TObject absolute Ret;
	begin
	  if v = Qnil then
	    TObject(ret) := nil
	  else
	  begin
	    Obj := ap_data_get_struct(v);
	    if not (Obj is AClass) then
	      ap_raise(ap_eArgError,
	        Format('%s %s (expected %s)', [
	           sWrong_arg_type,
	           chopHead(Obj.ClassName),
	           chopHead(AClass.ClassName)
	        ]));
	//    TObject(Ret) := Obj;
	  end;
	end;

ꂪSł̂MȂBObjɑ_Ret͔j󂳂̂AObj is AClass ͋Cx߂łȂ悤ȁBRubyO񂾂Ƃɂ͈ȌRetɃANZXĂ͂ȂB̂Ƃ𖾋L悤B

rh菇:
	D:\apollo\src\ext\strcolgrid>dcc32 -B -Ud:\apollo\src -Ud:\usr\lib\delphi -DVCL strcolgrid.dpr

eXg菇:
	D:\apollo\src\ext\strcolgrid>d:\apollo\bin\ruby_ap -Id:/apollo/bin strcolgridtest.rb

eXgR[h:
strcolgridtest.rb:
	require 'phi'
	require 'strcolgrid'
	
	include Phi
	
	form1 = Form.new
	
	btn = Button.new form1
	btn.align = Phi::AL_TOP
	
	scgrid1 = StrColGrid.new form1
	scgrid1.cell_params = btn

publishedvpeBApolloIɒ`B

ہA TStrColGrid.CellParams ͂ɊŶŁA rb_define_method ( ݃vpeB̒`ɂ͕ DefineAttrSet g ) ɂRuby̖IȒ`͍sKvȂB StrColGrid_set_cell_params ͒`ȂĂ悢ƂɂȂB

TObjectȃvpeB̏݃\bhProp_set_objectɂȂB
Prop_set_object͌^`FbNsĂȂB

	function Prop_set_object(This, v: Tvalue): Tvalue; cdecl;
	var
	  real: TObject;
	  name: PChar;
	  objv: TObject;
	begin
	  real := ap_data_get_struct(This);
	  name := rb_id2name(rb_frame_last_func);
	  objv := ap_data_get_struct(v); //댯
	  try
	    SetObjectProp(real, chopUnder(name), objv);
	  except
	    on E: Exception do
	      ap_raise(eDelphiError, PChar(E.message));
	  end;
	  if objv is TComponent then
	    TComponent(objv).tag := v;  // no effect
	  rb_iv_set(This, PChar('@'+chop(name)), v);
	  result := v;
	end;

̎ł́AProp_set_objectvDelphǐ^m蓾ȂA^`FbN͍sȂB
eXg:
	strcolgridtest.rb:23: undefined method `add' for #<Phi::Button:0xd25d58> (NameError)

cƁA܂ōlĂ̂A
	function GetObjectPropClass(Instance: TObject; const PropName: string): TClass; overload;
g΁ADelphi̐ݒ肷ׂ^킩ł͂ȂB

	function Prop_set_object(This, v: Tvalue): Tvalue; cdecl;
	var
	  real: TObject;
	  name: PChar;
	  AClass: TClass;
	  objv: TObject;
	begin
	  real := ap_data_get_struct(This);
	  name := rb_id2name(rb_frame_last_func);
	  AClass := GetObjectPropClass(real, chopUnder(name));
	  ap_data_get_object(v, AClass, objv);
	  if objv is TComponent then
	    TComponent(objv).tag := v;  // no effect
	  rb_iv_set(This, PChar('@'+chop(name)), v);
	  result := v;
	end;

eXg:
	strcolgridtest.rb:12:in `cell_params=': wrong argument type Button (expected SCGCellParams) (ArgumentError)

SɂȂB

!Delphǐ^`FbN̔
̍l@̒ŁADelphǐ^`FbN@̂ŁA܂Ƃ߂Ă݂悤B

* varCconstCout
""^Ȃp[^
""萔p[^Cϐp[^Co̓p[^́C^w肵Ăw肵ȂĂ܂܂B
""ʏCRpC͌^Ȃp[^ɑ΂鑀삪LǂmFł܂B
* absolute
""΃AhX
""ق̕ϐƓAhXVϐ쐬邱Ƃł܂B

* SetObjectProp
  RTTI ( unit TypInfo )
	procedure SetObjectProp(Instance: TObject; const PropName: string;
	  Value: TObject); overload;

