how to set array length in runtime ? setLength(t.GetProperty('Propertys'),3); ????
unit Unit3;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TSubProperty = Class
private
Fitem2: Integer;
Fitem1: String;
procedure Setitem1(const Value: String);
procedure Setitem2(const Value: Integer);
published
property item1:String read Fitem1 write Setitem1;
property item2:Integer read Fitem2 write Setitem2;
End;
TArraySubPropertys=array of TSubProperty;
TmyObject = Class
private
FPropertys: TArraySubPropertys;
procedure SetPropertys(const Value: TArraySubPropertys);
published
property Propertys:TArraySubPropertys read FPropertys write SetPropertys;
End;
TForm3 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form3: TForm3;
implementation
{$R *.dfm}
procedure TForm3.Button1Click(Sender: TObject);
var
myObject:TmyObject;
ctx : TRttiContext;
t : TRttiType;
obj:TObject;
begin
myObject :=TmyObject.Create;
ctx := TRttiContext.Create;
t := ctx.GetType(myObject.ClassType);
// setLength(t.GetProperty('Propertys'),3); ????????????????????????????????????
obj:= (t.GetProperty('Propertys').PropertyType as TRttiDynamicArrayType).ElementType.AsInstance.MetaclassType.Create;
//showmessage(obj.toStirng); --> TSubProperty
t.GetProperty('Propertys').getValue(myObject).setArrayElement(0,obj);
obj:= (t.GetProperty('Propertys').PropertyType as TRttiDynamicArrayType).ElementType.AsInstance.MetaclassType.Create;
t.GetProperty('Propertys').getValue(myObject).setArrayElement(1,obj);
obj:= (t.GetProperty('Propertys').PropertyType as TRttiDynamicArrayType).ElementType.AsInstance.MetaclassType.Create;
t.GetProperty('Propertys').getValue(myObject).setArrayElement(2,obj);
{
myObject.Propertys[0] :=TSubProperty.Create;
myObject.Propertys[0].item1 :='x';
myObject.Propertys[0].item2 :=1;
myObject.Propertys[1] :=TSubProperty.Create;
myObject.Propertys[1].item1 :='y';
myObject.Propertys[1].item2 :=2;
myObject.Propertys[2] :=TSubProperty.Create;
myObject.Propertys[2].item1 :='z';
myObject.Propertys[2].item2 :=3;
ShowMessage(myObject.Propertys[2].item1);
FreeAndNil(myObject.Propertys[2]);
FreeAndNil(myObject.Propertys[1]);
FreeAndNil(myObject.Propertys[0]);
}
FreeAndNil(myObject);
end;
{ TSubProperty }
procedure TSubProperty.Setitem1(const Value: String);
begin
Fitem1 := Value;
end;
procedure TSubProperty.Setitem2(const Value: Integer);
begin
Fitem2 := Value;
end;
{ TmyObject }
procedure TmyObject.SetPropertys(const Value: TArraySubPropertys);
begin
FPropertys := Value;
end;
end.