rtl: added GetInterfaceProp, SetInterfaceProp

This commit is contained in:
mattias 2019-05-22 12:43:39 +00:00
parent 87f96a7724
commit 0a5fe28683

View File

@ -472,6 +472,16 @@ function GetMethodProp(Instance: TObject; const PropName: string): TMethod;
procedure SetMethodProp(Instance: TObject; PropInfo: TTypeMemberProperty; const Value : TMethod);
procedure SetMethodProp(Instance: TObject; const PropName: string; const Value: TMethod);
function GetInterfaceProp(Instance: TObject; const PropName: string): IInterface;
function GetInterfaceProp(Instance: TObject; PropInfo: TTypeMemberProperty): IInterface;
procedure SetInterfaceProp(Instance: TObject; const PropName: string; const Value: IInterface);
procedure SetInterfaceProp(Instance: TObject; PropInfo: TTypeMemberProperty; const Value: IInterface);
function GetRawInterfaceProp(Instance: TObject; const PropName: string): Pointer;
function GetRawInterfaceProp(Instance: TObject; PropInfo: TTypeMemberProperty): Pointer;
procedure SetRawInterfaceProp(Instance: TObject; const PropName: string; const Value: Pointer);
procedure SetRawInterfaceProp(Instance: TObject; PropInfo: TTypeMemberProperty; const Value: Pointer);
implementation
function GetClassMembers(aTIStruct: TTypeInfoStruct): TTypeMemberDynArray;
@ -926,6 +936,7 @@ begin
else if (pfGetFunction and PropInfo.Flags)>0 then
begin
if length(PropInfo.Params)>0 then
// array property
Result:=gkFunctionWithParams
else
Result:=gkFunction;
@ -949,6 +960,7 @@ begin
else if (pfSetProcedure and PropInfo.Flags)>0 then
begin
if length(PropInfo.Params)>0 then
// array property
Result:=skProcedureWithParams
else
Result:=skProcedure;
@ -1416,6 +1428,97 @@ begin
SetMethodProp(Instance,FindPropInfo(Instance,PropName),Value);
end;
function GetInterfaceProp(Instance: TObject; const PropName: string
): IInterface;
begin
Result:=GetInterfaceProp(Instance,FindPropInfo(Instance,PropName));
end;
function GetInterfaceProp(Instance: TObject; PropInfo: TTypeMemberProperty
): IInterface;
type
TGetter = function: IInterface of object;
TGetterWithIndex = function(Index: JSValue): IInterface of object;
var
gk: TGetterKind;
begin
if Propinfo.TypeInfo.Kind<>tkInterface then
raise Exception.Create('Cannot get RAW interface from IInterface interface');
gk:=GetPropGetterKind(PropInfo);
case gk of
gkNone:
raise EPropertyError.CreateFmt(SCantReadPropertyS, [PropInfo.Name]);
gkField:
Result:=IInterface(TJSObject(Instance)[PropInfo.Getter]);
gkFunction:
if (pfHasIndex and PropInfo.Flags)>0 then
Result:=TGetterWithIndex(TJSObject(Instance)[PropInfo.Getter])(PropInfo.Index)
else
Result:=TGetter(TJSObject(Instance)[PropInfo.Getter])();
gkFunctionWithParams:
raise EPropertyError.CreateFmt(SIndexedPropertyNeedsParams, [PropInfo.Name]);
end;
end;
procedure SetInterfaceProp(Instance: TObject; const PropName: string;
const Value: IInterface);
begin
SetInterfaceProp(Instance,FindPropInfo(Instance,PropName),Value);
end;
procedure SetInterfaceProp(Instance: TObject; PropInfo: TTypeMemberProperty;
const Value: IInterface);
type
TSetter = procedure(Value: IInterface) of object;
TSetterWithIndex = procedure(Index: JSValue; Value: IInterface) of object;
procedure setIntfP(Instance: TObject; const PropName: string; value: jsvalue); external name 'rtl.setIntfP';
var
sk: TSetterKind;
Setter: String;
begin
if Propinfo.TypeInfo.Kind<>tkInterface then
raise Exception.Create('Cannot set RAW interface from IInterface interface');
sk:=GetPropSetterKind(PropInfo);
Setter:=PropInfo.Setter;
case sk of
skNone:
raise EPropertyError.CreateFmt(SCantWritePropertyS, [PropInfo.Name]);
skField:
setIntfP(Instance,Setter,Value);
skProcedure:
if (pfHasIndex and PropInfo.Flags)>0 then
TSetterWithIndex(TJSObject(Instance)[Setter])(PropInfo.Index,Value)
else
TSetter(TJSObject(Instance)[Setter])(Value);
skProcedureWithParams:
raise EPropertyError.CreateFmt(SIndexedPropertyNeedsParams, [PropInfo.Name]);
end;
end;
function GetRawInterfaceProp(Instance: TObject; const PropName: string
): Pointer;
begin
Result:=GetRawInterfaceProp(Instance,FindPropInfo(Instance,PropName));
end;
function GetRawInterfaceProp(Instance: TObject; PropInfo: TTypeMemberProperty
): Pointer;
begin
Result:=Pointer(GetJSValueProp(Instance,PropInfo));
end;
procedure SetRawInterfaceProp(Instance: TObject; const PropName: string;
const Value: Pointer);
begin
SetRawInterfaceProp(Instance,FindPropInfo(Instance,PropName),Value);
end;
procedure SetRawInterfaceProp(Instance: TObject; PropInfo: TTypeMemberProperty;
const Value: Pointer);
begin
SetJSValueProp(Instance,PropInfo,Value);
end;
function GetFloatProp(Instance: TObject; PropInfo: TTypeMemberProperty): Double;
begin
Result:=Double(GetJSValueProp(Instance,PropInfo));