delphi RTTI 反射技术

摘要:
[delphi]viewplaincopyunitUnit_main;interfaceusesWindows,Messages,SysUtils,Variants,Classes,Graphics,Controls,Forms,Dialogs,StdCtrls,TypInfo;typeTForm_main=class(TForm)Button1:TButton;Memo1:TMemo;Memo2
  1. unitUnit_main;
  2. interface
  3. uses
  4. Windows,Messages,SysUtils,Variants,Classes,Graphics,Controls,Forms,
  5. Dialogs,StdCtrls,TypInfo;
  6. type
  7. TForm_main=class(TForm)
  8. Button1:TButton;
  9. Memo1:TMemo;
  10. Memo2:TMemo;
  11. Button2:TButton;
  12. Button3:TButton;
  13. Button4:TButton;
  14. Button5:TButton;
  15. Button6:TButton;
  16. Button7:TButton;
  17. Button8:TButton;
  18. Button9:TButton;
  19. Button10:TButton;
  20. Button11:TButton;
  21. Button12:TButton;
  22. Button13:TButton;
  23. procedureButton1Click(Sender:TObject);
  24. procedureButton2Click(Sender:TObject);
  25. procedureButton3Click(Sender:TObject);
  26. procedureButton4Click(Sender:TObject);
  27. procedureButton5Click(Sender:TObject);
  28. procedureButton6Click(Sender:TObject);
  29. procedureButton7Click(Sender:TObject);
  30. procedureButton8Click(Sender:TObject);
  31. procedureButton9Click(Sender:TObject);
  32. procedureButton10Click(Sender:TObject);
  33. procedureButton11Click(Sender:TObject);
  34. procedureButton12Click(Sender:TObject);
  35. procedureButton13Click(Sender:TObject);
  36. private
  37. {Privatedeclarations}
  38. public
  39. {Publicdeclarations}
  40. end;
  41. PTKeyDog=^TKeyDog;
  42. TKeyDog=record
  43. id:Integer;
  44. projectname:string;
  45. city:string;
  46. letter:string;
  47. hash:string;
  48. code:string;
  49. note:string;
  50. filepath:string;
  51. userid:Integer;
  52. end;
  53. {自定义的类}
  54. TMyClass=class(TComponent)
  55. public
  56. proceduremsg(conststr:string);
  57. functionAdd(consta,b:Integer):Integer;
  58. end;
  59. //编译指令Methodinfo是Delphi2009新增的,只有它打开了,ObjAuto才可以获取public区的信息.
  60. //这样,ObjAuto可以获取TClass3的public、published和默认区域的信息.
  61. {$M+}
  62. {$METHODINFOON}
  63. TClass3=class
  64. functionFun3:string;
  65. private
  66. functionFun3Private:string;
  67. protected
  68. functionFun3Protected:string;
  69. public
  70. functionFun3Public:string;
  71. published
  72. functionFun3Published:string;
  73. end;
  74. {$METHODINFOOFF}
  75. {$M-}
  76. var
  77. Form_main:TForm_main;
  78. implementation
  79. uses
  80. Rtti,ObjAuto;
  81. {$R*.dfm}
  82. //获取对象的RTTI属性与事件的函数
  83. functionGetPropertyAndEventList(obj:TObject;
  84. pList,eList:TStringList):Boolean;
  85. var
  86. ClassTypeInfo:PTypeInfo;{类的信息结构指针}
  87. ClassDataInfo:PTypeData;{类的数据结构指针}
  88. propertyList:PPropList;{TPropInfo是属性的数据结构;
  89. PPropList是其指针;
  90. TPropList是属性结构指针的列表数组;
  91. PPropList是指向这个数组的指针}
  92. num:Integer;{记录属性的总数}
  93. size:Integer;{记录属性结构的大小}
  94. i:Integer;
  95. begin
  96. ClassTypeInfo:=obj.ClassInfo;{先获取:类的信息结构指针}
  97. ClassDataInfo:=GetTypeData(ClassTypeInfo);{再获取:类的数据结构指针}
  98. num:=ClassDataInfo.PropCount;{属性总数}
  99. size:=SizeOf(TPropInfo);{属性结构大小}
  100. GetMem(propertyList,size*num);{给属性数组分配内存}
  101. GetPropInfos(ClassTypeInfo,propertyList);{获取属性列表}
  102. fori:=0tonum-1do
  103. begin
  104. ifpropertyList[i].PropType^.Kind=tkMethodthen{如果是事件;事件也是属性吗,给分出来}
  105. eList.Add(propertyList[i].Name)
  106. else
  107. pList.Add(propertyList[i].Name);
  108. end;
  109. pList.Sort;
  110. eList.Sort;{排序}
  111. FreeMem(propertyList);{释放属性数组的内存}
  112. Result:=True;
  113. end;
  114. procedureTForm_main.Button10Click(Sender:TObject);
  115. var
  116. obj:TMyClass;
  117. t:TRttiType;
  118. m1,m2:TRttiMethod;
  119. r:TValue;//TRttiMethod.Invoke的返回类型
  120. begin
  121. t:=TRttiContext.Create.GetType(TMyClass);
  122. {获取TMyClass类的两个方法}
  123. m1:=t.GetMethod('msg');{procedure}
  124. m2:=t.GetMethod('Add');{function}
  125. obj:=TMyClass.Create(Self);{调用需要依赖一个已存在的对象}
  126. {调用msg过程}
  127. m1.Invoke(obj,['Delphi2010']);{将弹出信息框}
  128. {调用Add函数}
  129. r:=m2.Invoke(obj,[1,2]);{其返回值是个TValue类型的结构}
  130. ShowMessage(IntToStr(r.AsInteger));{3}
  131. obj.Free;
  132. end;
  133. procedureTForm_main.Button11Click(Sender:TObject);
  134. var
  135. obj:TMyClass;
  136. t:TRttiType;
  137. p:TRttiProperty;
  138. r:TValue;
  139. begin
  140. obj:=TMyClass.Create(Self);
  141. t:=TRttiContext.Create.GetType(TMyClass);
  142. p:=t.GetProperty('Name');//继承自TComponent的name
  143. r:=p.GetValue(obj);
  144. ShowMessage(r.AsString);{原来的}
  145. p.SetValue(obj,'NewName');
  146. r:=p.GetValue(obj);
  147. ShowMessage(r.AsString);{NewName}
  148. obj.Free;
  149. end;
  150. procedureTForm_main.Button12Click(Sender:TObject);
  151. var
  152. t:TRttiType;
  153. p:TRttiProperty;
  154. r:TValue;
  155. begin
  156. t:=TRttiContext.Create.GetType(TButton);
  157. p:=t.GetProperty('Align');
  158. p.SetValue(Button1,TValue.FromOrdinal(TypeInfo(TAlign),Ord(alLeft)));
  159. r:=p.GetValue(Button1);
  160. ShowMessage(IntToStr(r.AsOrdinal));{3}
  161. end;
  162. procedureTForm_main.Button13Click(Sender:TObject);
  163. var
  164. MiArr:TMethodInfoArray;
  165. Mi:PMethodInfoHeader;
  166. obj:TClass3;
  167. begin
  168. obj:=TClass3.Create;
  169. MiArr:=GetMethods(obj.ClassType);
  170. Memo1.Clear;
  171. forMiinMiArrdo
  172. Memo1.Lines.Add(string(Mi.Name));
  173. obj.Free;
  174. end;
  175. procedureTForm_main.Button1Click(Sender:TObject);
  176. var
  177. propertyL,EventL:TStringList;
  178. begin
  179. //属性
  180. propertyL:=TStringList.Create;
  181. //事件
  182. EventL:=TStringList.Create;
  183. Memo1.Clear;
  184. Memo2.Clear;
  185. GetPropertyAndEventList(Self,propertyL,EventL);{调用函数,第一个参数是对象名}
  186. Memo1.Lines:=propertyL;
  187. Memo2.Lines:=EventL;
  188. propertyL.Free;
  189. EventL.Free;
  190. end;
  191. procedureTForm_main.Button2Click(Sender:TObject);
  192. var
  193. ctx:TRttiContext;
  194. t:TRttiType;
  195. begin
  196. Memo1.Clear;
  197. fortinctx.GetTypesdo
  198. Memo1.Lines.Add(t.Name);
  199. end;
  200. procedureTForm_main.Button3Click(Sender:TObject);
  201. var
  202. ctx:TRttiContext;
  203. t:TRttiType;
  204. m:TRttiMethod;
  205. begin
  206. Memo1.Clear;
  207. t:=ctx.GetType(TButton);
  208. //formint.GetMethodsdoMemo1.Lines.Add(m.Name);
  209. formint.GetMethodsdo
  210. Memo1.Lines.Add(m.ToString);
  211. end;
  212. procedureTForm_main.Button4Click(Sender:TObject);
  213. var
  214. ctx:TRttiContext;
  215. t:TRttiType;
  216. p:TRttiProperty;
  217. begin
  218. Memo1.Clear;
  219. t:=ctx.GetType(TButton);
  220. //forpint.GetPropertiesdoMemo1.Lines.Add(p.Name);
  221. forpint.GetPropertiesdo
  222. Memo1.Lines.Add(p.ToString);
  223. end;
  224. procedureTForm_main.Button5Click(Sender:TObject);
  225. var
  226. ctx:TRttiContext;
  227. t:TRttiType;
  228. f:TRttiField;
  229. begin
  230. Memo1.Clear;
  231. t:=ctx.GetType(TButton);
  232. //forfint.GetFieldsdoMemo1.Lines.Add(f.Name);
  233. forfint.GetFieldsdo
  234. Memo1.Lines.Add(f.ToString);
  235. end;
  236. //http://my.oschina.net/hermer/blog/320075
  237. procedureTForm_main.Button6Click(Sender:TObject);
  238. var
  239. ctx:TRttiContext;
  240. t:TRttiType;
  241. ms:TArray<TRttiMethod>;
  242. ps:TArray<TRttiProperty>;
  243. fs:TArray<TRttiField>;
  244. begin
  245. Memo1.Clear;
  246. t:=ctx.GetType(TButton);
  247. ms:=t.GetMethods;
  248. ps:=t.GetProperties;
  249. fs:=t.GetFields;
  250. Memo1.Lines.Add(Format('%s类共有%d个方法',[t.Name,Length(ms)]));
  251. Memo1.Lines.Add(Format('%s类共有%d个属性',[t.Name,Length(ps)]));
  252. Memo1.Lines.Add(Format('%s类共有%d个字段',[t.Name,Length(fs)]));
  253. end;
  254. procedureTForm_main.Button7Click(Sender:TObject);
  255. var
  256. t:TRttiRecordType;
  257. f:TRttiField;
  258. begin
  259. Memo1.Clear;
  260. t:=TRttiContext.Create.GetType(TypeInfo(TPoint)).AsRecord;
  261. Memo1.Lines.Add(t.QualifiedName);
  262. Memo1.Lines.Add(Format('Size:%d',[t.TypeSize]));
  263. Memo1.Lines.Add(EmptyStr);
  264. Memo1.Lines.Add(Format('字段数:%d',[Length(t.GetFields)]));
  265. Memo1.Lines.Add(Format('方法数:%d',[Length(t.GetMethods)]));
  266. Memo1.Lines.Add(Format('属性数:%d',[Length(t.GetProperties)]));
  267. Memo1.Lines.Add(EmptyStr);
  268. Memo1.Lines.Add('全部字段:');
  269. forfint.GetFieldsdo
  270. Memo1.Lines.Add(f.ToString);
  271. end;
  272. procedureTForm_main.Button8Click(Sender:TObject);
  273. var
  274. t:TRttiRecordType;
  275. f:TRttiField;
  276. begin
  277. Memo1.Clear;
  278. t:=TRttiContext.Create.GetType(TypeInfo(TKeyDog)).AsRecord;
  279. Memo1.Lines.Add(t.QualifiedName);
  280. Memo1.Lines.Add(Format('Size:%d',[t.TypeSize]));
  281. Memo1.Lines.Add(EmptyStr);
  282. Memo1.Lines.Add(Format('字段数:%d',[Length(t.GetFields)]));
  283. Memo1.Lines.Add(Format('方法数:%d',[Length(t.GetMethods)]));
  284. Memo1.Lines.Add(Format('属性数:%d',[Length(t.GetProperties)]));
  285. Memo1.Lines.Add(EmptyStr);
  286. Memo1.Lines.Add('全部字段:');
  287. forfint.GetFieldsdo
  288. Memo1.Lines.Add(f.ToString);
  289. end;
  290. procedureTForm_main.Button9Click(Sender:TObject);
  291. var
  292. t:TRttiOrdinalType;
  293. begin
  294. Memo1.Clear;
  295. //先从类型名获取类型信息对象
  296. t:=TRttiContext.Create.GetType(TypeInfo(Byte))asTRttiOrdinalType;
  297. Memo1.Lines.Add(Format('%s-%s',[t.Name,t.QualifiedName]));
  298. Memo1.Lines.Add(Format('Size:%d',[t.TypeSize]));
  299. Memo1.Lines.Add('QualifiedName:'+t.QualifiedName);
  300. Memo1.Lines.Add(Format('Min,Max:%d,%d',[t.MinValue,t.MaxValue]));
  301. Memo1.Lines.Add(EmptyStr);//空字串
  302. //可以用AsOrdinal方法代替前面的asTRttiOrdinalType
  303. t:=TRttiContext.Create.GetType(TypeInfo(Word)).AsOrdinal;
  304. Memo1.Lines.Add(Format('%s:%s',[t.Name,t.QualifiedName]));
  305. Memo1.Lines.Add(Format('Size:%d',[t.TypeSize]));
  306. Memo1.Lines.Add(Format('Min,Max:%d,%d',[t.MinValue,t.MaxValue]));
  307. Memo1.Lines.Add(EmptyStr);
  308. //也可以直接强制转换
  309. t:=TRttiOrdinalType(TRttiContext.Create.GetType(TypeInfo(Integer)));
  310. Memo1.Lines.Add(Format('%s:%s',[t.Name,t.QualifiedName]));
  311. Memo1.Lines.Add(Format('Size:%d',[t.TypeSize]));
  312. Memo1.Lines.Add(Format('Min,Max:%d,%d',[t.MinValue,t.MaxValue]));
  313. Memo1.Lines.Add(EmptyStr);
  314. end;
  315. {TMyClass}
  316. functionTMyClass.Add(consta,b:Integer):Integer;
  317. begin
  318. Result:=a+b;
  319. end;
  320. procedureTMyClass.msg(conststr:string);
  321. begin
  322. MessageDlg(str,mtInformation,[mbYes],0);
  323. end;
  324. {TClass3}
  325. functionTClass3.Fun3:string;
  326. begin
  327. Result:='Fun3';
  328. end;
  329. functionTClass3.Fun3Private:string;
  330. begin
  331. Result:='Fun3Private';
  332. end;
  333. functionTClass3.Fun3Protected:string;
  334. begin
  335. Result:='Fun3Protected';
  336. end;
  337. functionTClass3.Fun3Public:string;
  338. begin
  339. Result:='Fun3Public';
  340. end;
  341. functionTClass3.Fun3Published:string;
  342. begin
  343. Result:='Fun3Published';
  344. end;
  345. end.
http://blog.csdn.net/earbao/article/details/46729785

免责声明:文章转载自《delphi RTTI 反射技术》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇[JavaWeb]SpringSecurity-OAuth2.0 统一认证、资源分离的配置,用于分布式架构、模块化开发的认证体系建立SQL Server用户登录下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

.NET系统框架

本书是一本讲解.NET技术的书籍,目标读者群也是在.NET框架(.NET Framework)下进行开发的程序员,因此我们无法回避的问题就是:什么是.NET框架?它包含了哪些内容?为开发程序提供了哪些支持?很多朋友对这类个问题的第一反应可能是.NET框架所提供的庞大类库及编写代码所采用的C#语言,实际上远不止这些。 要描述.NET框架,自然会遇到与其相关的...

Java里import语句使用

文件一: package com.xuexi;//在 Java 中,如果给出一个完整的限定名,包括包名、类名,那么 Java 编译器就可以很容易地定位到源代码或者类。// import 语句就是用来提供一个合理的路径,使得编译器可以找到某个类。public class Import { String name; int age; Stri...

使用Lucene.NET实现数据检索功能

引言     在软件系统中查询数据是再平常不过的事情了,那当数据量非常大,数据存储的媒介不是数据库,或者检索方式要求更为灵活的时候,我们该如何实现数据的检索呢?为数据建立索引吧,利用索引技术可以更灵活更快捷的实现检索功能。     以下我要介绍的是.NET版的Lucene在实际项目中是如何应用的。 案例概要     我以一个文件检索系统为例,主要功能就...

使用javaMail接收邮件(比较全)

package org.davidfang.mail;import java.io.BufferedInputStream;import java.io.BufferedOutputStream;import java.io.File;import java.io.FileNotFoundException;import java.io.FileOutpu...

android界面布局

(一)LinearLayout界面编排模式 他的格式是按照线性顺序,由上往下或右左往右,逐一排列界面组件。 layout_中的“match_parent”表示要填满他所在的外框,而“wrap_content”表示它的大小只要满足内部所包含的界面组件即可。 android:orientation:“horizontal”表示排列方式为水平,而“vertica...

WPF多语言化的实现

  Metro插件系统系列就暂时停一下,这次我们讨论一下WPF的资源本地化实现,主要用到的:CultureInfo,ResourceManger,MarkupExtension,RESX文件,这些都是.NET框架提供的。 项目结构: 运行结果: 可在程序运行时,实时切换语言 CultureInfo   CultureInfo类表示有关特定区域性的信息...