123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135 |
- program DemoRTTI;
- uses SysUtils, TypInfo;
- type
- { TShrimp }
- TShrimp = class
- private
- FSize: integer;
- procedure SetSize(const AValue: integer);
- published
- FName: String;
- function GetSize: integer;
- procedure SetName(const AValue: String);
- property Name: String read FName write SetName;
- property Size: integer read GetSize write SetSize;
- end;
- { TShrimp }
- function TShrimp.GetSize: integer;
- begin
- Result:=FSize;
- end;
- procedure TShrimp.SetSize(const AValue: integer);
- begin
- FSize:=AValue;
- end;
- procedure TShrimp.SetName(const AValue: String);
- begin
- if FName=AValue then Exit;
- FName:=AValue;
- end;
- procedure ShowFields(TI: TTypeInfoStruct);
- var
- i: Integer;
- f: TTypeMemberField;
- begin
- writeln('ShowFields of ',TI.Name);
- for i:=0 to TI.FieldCount-1 do
- begin
- f:=TTypeMemberField(TI.Members[TI.Fields[i]]);
- writeln(' Name="',f.Name,'" Kind=',str(f.Kind),
- ' Type=',f.TypeInfo.Name,' TypeKind=',str(f.TypeInfo.Kind));
- end;
- end;
- function ProcSignatureToStr(Sig: TProcedureSignature): String;
- var
- i: Integer;
- Param: TProcedureParam;
- begin
- Result:='(';
- for i:=0 to length(Sig.Params)-1 do
- begin
- Param:=Sig.Params[i];
- if i>0 then Result:=Result+';';
- Result:=Result+Param.Name;
- Result:=Result+':'+Param.TypeInfo.Name;
- end;
- Result:=Result+')';
- if Sig.ResultType<>nil then
- Result:=Result+':'+Sig.ResultType.Name+'/'+str(Sig.ResultType.Kind);
- end;
- procedure ShowMethods(TI: TTypeInfoStruct);
- var
- i: Integer;
- m: TTypeMemberMethod;
- begin
- writeln('ShowMethods of ',TI.Name);
- for i:=0 to TI.MethodCount-1 do
- begin
- m:=TTypeMemberMethod(TI.Members[TI.Methods[i]]);
- writeln(' Name="',m.Name,'" Kind=',str(m.Kind),
- ' MethodKind=',str(m.MethodKind),' Sig=',ProcSignatureToStr(m.ProcSig));
- end;
- end;
- procedure ShowProperties(Instance: TObject);
- var
- i: Integer;
- PropInfo: TTypeMemberProperty;
- Value: String;
- TI: TTypeInfoClass;
- begin
- TI:=TypeInfo(Instance);
- writeln('ShowProperties of ',TI.Name);
- for i:=0 to TI.PropCount-1 do
- begin
- PropInfo:=TTypeMemberProperty(TI.Members[TI.Properties[i]]);
- Value:='?';
- if PropInfo.Getter<>'' then
- begin
- case PropInfo.TypeInfo.Kind of
- tkInteger: Value:=IntToStr(GetNativeIntProp(Instance,PropInfo));
- tkString: Value:=GetStrProp(Instance,PropInfo);
- end;
- end;
- writeln(' Name="',PropInfo.Name,'"',
- ' Kind=',str(PropInfo.Kind),
- ' Type=',PropInfo.TypeInfo.Name,
- ' TypeKind=',str(PropInfo.TypeInfo.Kind),
- ' Value=',Value);
- end;
- end;
- procedure ShowObjectRTTI(Obj: TObject);
- var
- ObjTI: TTypeInfoClass;
- begin
- ObjTI:=TypeInfo(Obj);
- ShowFields(ObjTI);
- ShowMethods(ObjTI);
- ShowProperties(Obj);
- end;
- var
- Shrimp: TShrimp;
- begin
- Shrimp:=TShrimp.Create;
- Shrimp.Name:='Shrimpy';
- Shrimp.Size:=42;
- ShowObjectRTTI(Shrimp);
- writeln('Setting Size to 137:');
- SetNativeIntProp(Shrimp,'size',137);
- writeln('Size=',GetNativeIntProp(Shrimp,'size'));
- end.
|