diff --git a/packages/rtl/typinfo.pas b/packages/rtl/typinfo.pas index ad930b4..aa4482a 100644 --- a/packages/rtl/typinfo.pas +++ b/packages/rtl/typinfo.pas @@ -108,7 +108,7 @@ type TTypeInfoEnum = class external name 'rtl.tTypeInfoEnum'(TTypeInfoInteger) public - // not supported: OrdType : TOrdType, BaseType: TTypeInfo + // not supported: BaseType: TTypeInfo EnumType: TEnumType external name 'enumtype'; end; @@ -116,7 +116,7 @@ type TTypeInfoSet = class external name 'rtl.tTypeInfoSet'(TTypeInfo) public - // not supported: OrdType : TOrdType, BaseType: TTypeInfo + // not supported: BaseType: TTypeInfo CompType: TTypeInfo external name 'comptype'; end; @@ -385,15 +385,27 @@ function GetOrdProp(Instance: TObject; const PropInfo: TTypeMemberProperty): lon procedure SetOrdProp(Instance: TObject; const PropName: String; Value: longint); procedure SetOrdProp(Instance: TObject; const PropInfo: TTypeMemberProperty; Value: longint); +function GetEnumProp(Instance: TObject; const PropName: String): String; +function GetEnumProp(Instance: TObject; const PropInfo: TTypeMemberProperty): String; +procedure SetEnumProp(Instance: TObject; const PropName: String; const Value: String); +procedure SetEnumProp(Instance: TObject; const PropInfo: TTypeMemberProperty; const Value: String); + +function GetSetProp(Instance: TObject; const PropName: String): String; overload; +function GetSetProp(Instance: TObject; const PropInfo: TTypeMemberProperty): String; overload; +function GetSetPropArray(Instance: TObject; const PropName: String): TIntegerDynArray; overload; +function GetSetPropArray(Instance: TObject; const PropInfo: TTypeMemberProperty): TIntegerDynArray; overload; +procedure SetSetPropArray(Instance: TObject; const PropName: String; const Arr: TIntegerDynArray); overload; +procedure SetSetPropArray(Instance: TObject; const PropInfo: TTypeMemberProperty; const Arr: TIntegerDynArray); overload; + function GetStrProp(Instance: TObject; const PropName: String): String; function GetStrProp(Instance: TObject; const PropInfo: TTypeMemberProperty): String; procedure SetStrProp(Instance: TObject; const PropName: String; Value: String); procedure SetStrProp(Instance: TObject; const PropInfo: TTypeMemberProperty; Value: String); -function GetStringProp(Instance: TObject; const PropName: String): String; deprecated; -function GetStringProp(Instance: TObject; const PropInfo: TTypeMemberProperty): String; deprecated; -procedure SetStringProp(Instance: TObject; const PropName: String; Value: String); deprecated; -procedure SetStringProp(Instance: TObject; const PropInfo: TTypeMemberProperty; Value: String); deprecated; +function GetStringProp(Instance: TObject; const PropName: String): String; deprecated; // use GetStrProp +function GetStringProp(Instance: TObject; const PropInfo: TTypeMemberProperty): String; deprecated; // use GetStrProp +procedure SetStringProp(Instance: TObject; const PropName: String; Value: String); deprecated; // use GetStrProp +procedure SetStringProp(Instance: TObject; const PropInfo: TTypeMemberProperty; Value: String); deprecated; // use GetStrProp function GetBoolProp(Instance: TObject; const PropName: String): boolean; function GetBoolProp(Instance: TObject; const PropInfo: TTypeMemberProperty): boolean; @@ -903,6 +915,116 @@ begin SetJSValueProp(Instance,PropInfo,Value); end; +function GetEnumProp(Instance: TObject; const PropName: String): String; +begin + Result:=GetEnumProp(Instance,FindPropInfo(Instance,PropName)); +end; + +function GetEnumProp(Instance: TObject; const PropInfo: TTypeMemberProperty): String; +var + n: NativeInt; + TIEnum: TTypeInfoEnum; +begin + TIEnum:=PropInfo.TypeInfo as TTypeInfoEnum; + n:=NativeInt(GetJSValueProp(Instance,PropInfo)); + if (n>=TIEnum.MinValue) and (n<=TIEnum.MaxValue) then + Result:=TIEnum.EnumType.IntToName[n] + else + Result:=str(n); +end; + +procedure SetEnumProp(Instance: TObject; const PropName: String; + const Value: String); +begin + SetEnumProp(Instance,FindPropInfo(Instance,PropName),Value); +end; + +procedure SetEnumProp(Instance: TObject; const PropInfo: TTypeMemberProperty; + const Value: String); +var + TIEnum: TTypeInfoEnum; + n: NativeInt; +begin + TIEnum:=PropInfo.TypeInfo as TTypeInfoEnum; + n:=TIEnum.EnumType.NameToInt[Value]; + if not isUndefined(n) then + SetJSValueProp(Instance,PropInfo,n); +end; + +function GetSetProp(Instance: TObject; const PropName: String): String; +begin + Result:=GetSetProp(Instance,FindPropInfo(Instance,PropName)); +end; + +function GetSetProp(Instance: TObject; const PropInfo: TTypeMemberProperty + ): String; +var + o: TJSObject; + key, Value: String; + n: NativeInt; + TIEnum: TTypeInfoEnum; + TISet: TTypeInfoSet; +begin + Result:=''; + // get enum type if available + TISet:=PropInfo.TypeInfo as TTypeInfoSet; + TIEnum:=nil; + if TISet.CompType is TTypeInfoEnum then + TIEnum:=TTypeInfoEnum(TISet.CompType); + // read value + o:=TJSObject(GetJSValueProp(Instance,PropInfo)); + // a set is a JS object, where included element is stored as: o[ElementDecimal]=true + for Key in o do + begin + n:=parseInt(Key,10); + if (TIEnum<>nil) and (n>=TIEnum.MinValue) and (n<=TIEnum.MaxValue) then + Value:=TIEnum.EnumType.IntToName[n] + else + Value:=str(n); + if Result<>'' then Result:=Result+','; + Result:=Result+Value; + end; + Result:='['+Result+']'; +end; + +function GetSetPropArray(Instance: TObject; const PropName: String + ): TIntegerDynArray; +begin + Result:=GetSetPropArray(Instance,FindPropInfo(Instance,PropName)); +end; + +function GetSetPropArray(Instance: TObject; const PropInfo: TTypeMemberProperty + ): TIntegerDynArray; +var + o: TJSObject; + Key: string; +begin + Result:=[]; + // read value + o:=TJSObject(GetJSValueProp(Instance,PropInfo)); + // a set is a JS object, where included element is stored as: o[ElementDecimal]=true + for Key in o do + TJSArray(Result).push(parseInt(Key,10)); +end; + +procedure SetSetPropArray(Instance: TObject; const PropName: String; + const Arr: TIntegerDynArray); +begin + SetSetPropArray(Instance,FindPropInfo(Instance,PropName),Arr); +end; + +procedure SetSetPropArray(Instance: TObject; + const PropInfo: TTypeMemberProperty; const Arr: TIntegerDynArray); +var + o: TJSObject; + i: integer; +begin + o:=TJSObject.new; + for i in Arr do + o[str(i)]:=true; + SetJSValueProp(Instance,PropInfo,o); +end; + function GetStrProp(Instance: TObject; const PropName: String): String; begin Result:=GetStrProp(Instance,FindPropInfo(Instance,PropName));