rtl: typinfo: added GetEnumName, GetEnumValue, GetEnumNameCount

This commit is contained in:
mattias 2018-10-07 21:01:00 +00:00
parent abceaab919
commit aabb2c66cf

View File

@ -394,6 +394,10 @@ 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);
// Auxiliary routines, which may be useful
function GetEnumName(TypeInfo: TTypeInfoEnum; Value: Integer): String;
function GetEnumValue(TypeInfo: TTypeInfoEnum; const Name: string): Longint;
function GetEnumNameCount(TypeInfo: TTypeInfoEnum): Longint;
function GetSetProp(Instance: TObject; const PropName: String): String; overload;
function GetSetProp(Instance: TObject; const PropInfo: TTypeMemberProperty): String; overload;
@ -1032,6 +1036,42 @@ begin
SetJSValueProp(Instance,PropInfo,n);
end;
function GetEnumName(TypeInfo: TTypeInfoEnum; Value: Integer): String;
begin
Result:=TypeInfo.EnumType.IntToName[Value];
end;
function GetEnumValue(TypeInfo: TTypeInfoEnum; const Name: string): Longint;
begin
Result:=TypeInfo.EnumType.NameToInt[Name];
end;
function GetEnumNameCount(TypeInfo: TTypeInfoEnum): Longint;
var
o: TJSObject;
l, r: LongInt;
begin
o:=TJSObject(TypeInfo.EnumType);
// as of pas2js 1.0 the RTTI does not contain a min/max value
// -> use exponential search
// ToDo: adapt this once enums with gaps are supported
Result:=1;
while o.hasOwnProperty(String(JSValue(Result))) do
Result:=Result*2;
l:=Result div 2;
r:=Result;
while l<=r do
begin
Result:=(l+r) div 2;
if o.hasOwnProperty(String(JSValue(Result))) then
l:=Result+1
else
r:=Result-1;
end;
if o.hasOwnProperty(String(JSValue(Result))) then
inc(Result);
end;
function GetSetProp(Instance: TObject; const PropName: String): String;
begin
Result:=GetSetProp(Instance,FindPropInfo(Instance,PropName));