- unitUnit_main;
- interface
- uses
- Windows,Messages,SysUtils,Variants,Classes,Graphics,Controls,Forms,
- Dialogs,StdCtrls,TypInfo;
- type
- TForm_main=class(TForm)
- Button1:TButton;
- Memo1:TMemo;
- Memo2:TMemo;
- Button2:TButton;
- Button3:TButton;
- Button4:TButton;
- Button5:TButton;
- Button6:TButton;
- Button7:TButton;
- Button8:TButton;
- Button9:TButton;
- Button10:TButton;
- Button11:TButton;
- Button12:TButton;
- Button13:TButton;
- procedureButton1Click(Sender:TObject);
- procedureButton2Click(Sender:TObject);
- procedureButton3Click(Sender:TObject);
- procedureButton4Click(Sender:TObject);
- procedureButton5Click(Sender:TObject);
- procedureButton6Click(Sender:TObject);
- procedureButton7Click(Sender:TObject);
- procedureButton8Click(Sender:TObject);
- procedureButton9Click(Sender:TObject);
- procedureButton10Click(Sender:TObject);
- procedureButton11Click(Sender:TObject);
- procedureButton12Click(Sender:TObject);
- procedureButton13Click(Sender:TObject);
- private
- {Privatedeclarations}
- public
- {Publicdeclarations}
- end;
- PTKeyDog=^TKeyDog;
- TKeyDog=record
- id:Integer;
- projectname:string;
- city:string;
- letter:string;
- hash:string;
- code:string;
- note:string;
- filepath:string;
- userid:Integer;
- end;
- {自定义的类}
- TMyClass=class(TComponent)
- public
- proceduremsg(conststr:string);
- functionAdd(consta,b:Integer):Integer;
- end;
- //编译指令Methodinfo是Delphi2009新增的,只有它打开了,ObjAuto才可以获取public区的信息.
- //这样,ObjAuto可以获取TClass3的public、published和默认区域的信息.
- {$M+}
- {$METHODINFOON}
- TClass3=class
- functionFun3:string;
- private
- functionFun3Private:string;
- protected
- functionFun3Protected:string;
- public
- functionFun3Public:string;
- published
- functionFun3Published:string;
- end;
- {$METHODINFOOFF}
- {$M-}
- var
- Form_main:TForm_main;
- implementation
- uses
- Rtti,ObjAuto;
- {$R*.dfm}
- //获取对象的RTTI属性与事件的函数
- functionGetPropertyAndEventList(obj:TObject;
- pList,eList:TStringList):Boolean;
- var
- ClassTypeInfo:PTypeInfo;{类的信息结构指针}
- ClassDataInfo:PTypeData;{类的数据结构指针}
- propertyList:PPropList;{TPropInfo是属性的数据结构;
- PPropList是其指针;
- TPropList是属性结构指针的列表数组;
- PPropList是指向这个数组的指针}
- num:Integer;{记录属性的总数}
- size:Integer;{记录属性结构的大小}
- i:Integer;
- begin
- ClassTypeInfo:=obj.ClassInfo;{先获取:类的信息结构指针}
- ClassDataInfo:=GetTypeData(ClassTypeInfo);{再获取:类的数据结构指针}
- num:=ClassDataInfo.PropCount;{属性总数}
- size:=SizeOf(TPropInfo);{属性结构大小}
- GetMem(propertyList,size*num);{给属性数组分配内存}
- GetPropInfos(ClassTypeInfo,propertyList);{获取属性列表}
- fori:=0tonum-1do
- begin
- ifpropertyList[i].PropType^.Kind=tkMethodthen{如果是事件;事件也是属性吗,给分出来}
- eList.Add(propertyList[i].Name)
- else
- pList.Add(propertyList[i].Name);
- end;
- pList.Sort;
- eList.Sort;{排序}
- FreeMem(propertyList);{释放属性数组的内存}
- Result:=True;
- end;
- procedureTForm_main.Button10Click(Sender:TObject);
- var
- obj:TMyClass;
- t:TRttiType;
- m1,m2:TRttiMethod;
- r:TValue;//TRttiMethod.Invoke的返回类型
- begin
- t:=TRttiContext.Create.GetType(TMyClass);
- {获取TMyClass类的两个方法}
- m1:=t.GetMethod('msg');{procedure}
- m2:=t.GetMethod('Add');{function}
- obj:=TMyClass.Create(Self);{调用需要依赖一个已存在的对象}
- {调用msg过程}
- m1.Invoke(obj,['Delphi2010']);{将弹出信息框}
- {调用Add函数}
- r:=m2.Invoke(obj,[1,2]);{其返回值是个TValue类型的结构}
- ShowMessage(IntToStr(r.AsInteger));{3}
- obj.Free;
- end;
- procedureTForm_main.Button11Click(Sender:TObject);
- var
- obj:TMyClass;
- t:TRttiType;
- p:TRttiProperty;
- r:TValue;
- begin
- obj:=TMyClass.Create(Self);
- t:=TRttiContext.Create.GetType(TMyClass);
- p:=t.GetProperty('Name');//继承自TComponent的name
- r:=p.GetValue(obj);
- ShowMessage(r.AsString);{原来的}
- p.SetValue(obj,'NewName');
- r:=p.GetValue(obj);
- ShowMessage(r.AsString);{NewName}
- obj.Free;
- end;
- procedureTForm_main.Button12Click(Sender:TObject);
- var
- t:TRttiType;
- p:TRttiProperty;
- r:TValue;
- begin
- t:=TRttiContext.Create.GetType(TButton);
- p:=t.GetProperty('Align');
- p.SetValue(Button1,TValue.FromOrdinal(TypeInfo(TAlign),Ord(alLeft)));
- r:=p.GetValue(Button1);
- ShowMessage(IntToStr(r.AsOrdinal));{3}
- end;
- procedureTForm_main.Button13Click(Sender:TObject);
- var
- MiArr:TMethodInfoArray;
- Mi:PMethodInfoHeader;
- obj:TClass3;
- begin
- obj:=TClass3.Create;
- MiArr:=GetMethods(obj.ClassType);
- Memo1.Clear;
- forMiinMiArrdo
- Memo1.Lines.Add(string(Mi.Name));
- obj.Free;
- end;
- procedureTForm_main.Button1Click(Sender:TObject);
- var
- propertyL,EventL:TStringList;
- begin
- //属性
- propertyL:=TStringList.Create;
- //事件
- EventL:=TStringList.Create;
- Memo1.Clear;
- Memo2.Clear;
- GetPropertyAndEventList(Self,propertyL,EventL);{调用函数,第一个参数是对象名}
- Memo1.Lines:=propertyL;
- Memo2.Lines:=EventL;
- propertyL.Free;
- EventL.Free;
- end;
- procedureTForm_main.Button2Click(Sender:TObject);
- var
- ctx:TRttiContext;
- t:TRttiType;
- begin
- Memo1.Clear;
- fortinctx.GetTypesdo
- Memo1.Lines.Add(t.Name);
- end;
- procedureTForm_main.Button3Click(Sender:TObject);
- var
- ctx:TRttiContext;
- t:TRttiType;
- m:TRttiMethod;
- begin
- Memo1.Clear;
- t:=ctx.GetType(TButton);
- //formint.GetMethodsdoMemo1.Lines.Add(m.Name);
- formint.GetMethodsdo
- Memo1.Lines.Add(m.ToString);
- end;
- procedureTForm_main.Button4Click(Sender:TObject);
- var
- ctx:TRttiContext;
- t:TRttiType;
- p:TRttiProperty;
- begin
- Memo1.Clear;
- t:=ctx.GetType(TButton);
- //forpint.GetPropertiesdoMemo1.Lines.Add(p.Name);
- forpint.GetPropertiesdo
- Memo1.Lines.Add(p.ToString);
- end;
- procedureTForm_main.Button5Click(Sender:TObject);
- var
- ctx:TRttiContext;
- t:TRttiType;
- f:TRttiField;
- begin
- Memo1.Clear;
- t:=ctx.GetType(TButton);
- //forfint.GetFieldsdoMemo1.Lines.Add(f.Name);
- forfint.GetFieldsdo
- Memo1.Lines.Add(f.ToString);
- end;
- //http://my.oschina.net/hermer/blog/320075
- procedureTForm_main.Button6Click(Sender:TObject);
- var
- ctx:TRttiContext;
- t:TRttiType;
- ms:TArray<TRttiMethod>;
- ps:TArray<TRttiProperty>;
- fs:TArray<TRttiField>;
- begin
- Memo1.Clear;
- t:=ctx.GetType(TButton);
- ms:=t.GetMethods;
- ps:=t.GetProperties;
- fs:=t.GetFields;
- Memo1.Lines.Add(Format('%s类共有%d个方法',[t.Name,Length(ms)]));
- Memo1.Lines.Add(Format('%s类共有%d个属性',[t.Name,Length(ps)]));
- Memo1.Lines.Add(Format('%s类共有%d个字段',[t.Name,Length(fs)]));
- end;
- procedureTForm_main.Button7Click(Sender:TObject);
- var
- t:TRttiRecordType;
- f:TRttiField;
- begin
- Memo1.Clear;
- t:=TRttiContext.Create.GetType(TypeInfo(TPoint)).AsRecord;
- Memo1.Lines.Add(t.QualifiedName);
- Memo1.Lines.Add(Format('Size:%d',[t.TypeSize]));
- Memo1.Lines.Add(EmptyStr);
- Memo1.Lines.Add(Format('字段数:%d',[Length(t.GetFields)]));
- Memo1.Lines.Add(Format('方法数:%d',[Length(t.GetMethods)]));
- Memo1.Lines.Add(Format('属性数:%d',[Length(t.GetProperties)]));
- Memo1.Lines.Add(EmptyStr);
- Memo1.Lines.Add('全部字段:');
- forfint.GetFieldsdo
- Memo1.Lines.Add(f.ToString);
- end;
- procedureTForm_main.Button8Click(Sender:TObject);
- var
- t:TRttiRecordType;
- f:TRttiField;
- begin
- Memo1.Clear;
- t:=TRttiContext.Create.GetType(TypeInfo(TKeyDog)).AsRecord;
- Memo1.Lines.Add(t.QualifiedName);
- Memo1.Lines.Add(Format('Size:%d',[t.TypeSize]));
- Memo1.Lines.Add(EmptyStr);
- Memo1.Lines.Add(Format('字段数:%d',[Length(t.GetFields)]));
- Memo1.Lines.Add(Format('方法数:%d',[Length(t.GetMethods)]));
- Memo1.Lines.Add(Format('属性数:%d',[Length(t.GetProperties)]));
- Memo1.Lines.Add(EmptyStr);
- Memo1.Lines.Add('全部字段:');
- forfint.GetFieldsdo
- Memo1.Lines.Add(f.ToString);
- end;
- procedureTForm_main.Button9Click(Sender:TObject);
- var
- t:TRttiOrdinalType;
- begin
- Memo1.Clear;
- //先从类型名获取类型信息对象
- t:=TRttiContext.Create.GetType(TypeInfo(Byte))asTRttiOrdinalType;
- Memo1.Lines.Add(Format('%s-%s',[t.Name,t.QualifiedName]));
- Memo1.Lines.Add(Format('Size:%d',[t.TypeSize]));
- Memo1.Lines.Add('QualifiedName:'+t.QualifiedName);
- Memo1.Lines.Add(Format('Min,Max:%d,%d',[t.MinValue,t.MaxValue]));
- Memo1.Lines.Add(EmptyStr);//空字串
- //可以用AsOrdinal方法代替前面的asTRttiOrdinalType
- t:=TRttiContext.Create.GetType(TypeInfo(Word)).AsOrdinal;
- Memo1.Lines.Add(Format('%s:%s',[t.Name,t.QualifiedName]));
- Memo1.Lines.Add(Format('Size:%d',[t.TypeSize]));
- Memo1.Lines.Add(Format('Min,Max:%d,%d',[t.MinValue,t.MaxValue]));
- Memo1.Lines.Add(EmptyStr);
- //也可以直接强制转换
- t:=TRttiOrdinalType(TRttiContext.Create.GetType(TypeInfo(Integer)));
- Memo1.Lines.Add(Format('%s:%s',[t.Name,t.QualifiedName]));
- Memo1.Lines.Add(Format('Size:%d',[t.TypeSize]));
- Memo1.Lines.Add(Format('Min,Max:%d,%d',[t.MinValue,t.MaxValue]));
- Memo1.Lines.Add(EmptyStr);
- end;
- {TMyClass}
- functionTMyClass.Add(consta,b:Integer):Integer;
- begin
- Result:=a+b;
- end;
- procedureTMyClass.msg(conststr:string);
- begin
- MessageDlg(str,mtInformation,[mbYes],0);
- end;
- {TClass3}
- functionTClass3.Fun3:string;
- begin
- Result:='Fun3';
- end;
- functionTClass3.Fun3Private:string;
- begin
- Result:='Fun3Private';
- end;
- functionTClass3.Fun3Protected:string;
- begin
- Result:='Fun3Protected';
- end;
- functionTClass3.Fun3Public:string;
- begin
- Result:='Fun3Public';
- end;
- functionTClass3.Fun3Published:string;
- begin
- Result:='Fun3Published';
- end;
- end.
delphi RTTI 反射技术
免责声明:文章转载自《delphi RTTI 反射技术》仅用于学习参考。如对内容有疑问,请及时联系本站处理。
上篇[JavaWeb]SpringSecurity-OAuth2.0 统一认证、资源分离的配置,用于分布式架构、模块化开发的认证体系建立SQL Server用户登录下篇
宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=