新建一个单元文件,填写如下代码,然后保存为 ClassInfoUnit.pas,这里定义了一个结构,用来读取指定类的信息。

  1. unit ClassInfoUnit;
  2. interface
  3. uses
  4. Classes, TypInfo;
  5. type
  6. { 存放类属性的动态数组 }
  7. PropInfoArray = array of PPropInfo;
  8. { 用法:首先声明该结构的变量,然后通过 Create 函数或 Target 属性指定要获取 }
  9. { 信息的类,然后就可以通过 public 中的属性或方法来获取该类的各种信息了 }
  10. TClassInfo = record      { use TypInfo }
  11. private
  12. { 属性:要获取其运行时信息(RTTI)的类 }
  13. FTarget: TClass;
  14. { 属性:指向存放类信息的指针 }
  15. FTypeInfo: PTypeInfo;
  16. { 属性:指向存放类数据的指针 }
  17. FDataInfo: PTypeData;
  18. { 类属性(property)的个数 }
  19. FPropertyCount: Cardinal;
  20. { 类属性列表(数组) }
  21. FPropertyList: PropInfoArray;
  22. { 设置 FTarget }
  23. procedure SetTarget(aClass: TClass);
  24. { 读取 PropertyTypes[Index] }
  25. function GetPropTypes(Index: Integer): PTypeInfo;
  26. public
  27. { 构造函数,用来设置要获取其信息的对象 }
  28. procedure Create(aObj: TObject); overload;
  29. { 构造函数,用来设置要获取其信息的类 }
  30. procedure Create(aClass: TClass); overload;
  31. { 获取类的所有属性和事件 }
  32. function GetAllProperties: string;
  33. { 获取类的所有属性 }
  34. function GetPropList: string;
  35. { 获取类的所有事件 }
  36. function GetMethodList: string;
  37. { 指向类信息的指针 }
  38. property TypeInfo: PTypeInfo read FTypeInfo;
  39. { 指向类数据的指针 }
  40. property DataInfo: PTypeData read FDataInfo;
  41. { 属性:要获取其运行时信息(RTTI)的类 }
  42. property Target: TClass read FTarget write SetTarget;
  43. { 类的所有属性信息列表 }
  44. property PropertyList: PropInfoArray read FPropertyList;
  45. { 类的所有属性类型列表 }
  46. property PropertyTypes[Index: Integer]: PTypeInfo read GetPropTypes;
  47. { 类的属性总个数 }
  48. property PropertyCount: Cardinal read FPropertyCount;
  49. end;
  50. implementation
  51. { 构造函数 }
  52. procedure TClassInfo.Create(aObj: TObject);
  53. begin
  54. if aObj = nil then
  55. Create(nil)
  56. else
  57. Create(aObj.ClassType);
  58. end;
  59. { 构造函数 }
  60. procedure TClassInfo.Create(aClass: TClass);
  61. begin
  62. Target := aClass;
  63. end;
  64. { 私有:更改要操作的类 }
  65. procedure TClassInfo.SetTarget(aClass: TClass);
  66. begin
  67. if FTarget = aClass then
  68. Exit;
  69. FTarget := aClass;
  70. if Assigned(FTarget) then
  71. begin
  72. FTypeInfo := aClass.ClassInfo;
  73. FDataInfo := GetTypeData(FTypeInfo);
  74. FPropertyCount := FDataInfo.PropCount;
  75. SetLength(FPropertyList, FPropertyCount);
  76. GetPropInfos(FTypeInfo, PPropList(FPropertyList));
  77. end
  78. else
  79. begin
  80. FTypeInfo := nil;
  81. FDataInfo := nil;
  82. FPropertyCount := 0;
  83. SetLength(FPropertyList,0);
  84. end;
  85. end;
  86. { 私有:获取属性的类型信息 }
  87. function TClassInfo.GetPropTypes(Index: Integer): PTypeInfo;
  88. begin
  89. Result := nil;
  90. if FPropertyCount = 0 then
  91. Exit;
  92. Result := FPropertyList[Index].PropType^;
  93. end;
  94. { 获取所有属性和事件列表 }
  95. function TClassInfo.GetAllProperties: string;
  96. var
  97. I: Integer;
  98. Strs: TStringList;
  99. begin
  100. if FPropertyCount = 0 then
  101. Exit;
  102. Strs := TStringList.Create;
  103. try
  104. for I := 0 to PropertyCount - 1 do
  105. Strs.Add(PropertyList[I].Name);
  106. Result := Strs.Text;
  107. finally
  108. Strs.Free;
  109. end;
  110. end;
  111. { 获取属性列表 }
  112. function TClassInfo.GetPropList: string;
  113. var
  114. I: Integer;
  115. Strs: TStringList;
  116. begin
  117. if FPropertyCount = 0 then
  118. Exit;
  119. Strs := TStringList.Create;
  120. try
  121. for I := 0 to PropertyCount - 1 do
  122. begin
  123. if PropertyTypes[I].Kind <> tkMethod then
  124. Strs.Add(PropertyList[I].Name);
  125. end;
  126. Result := Strs.Text;
  127. finally
  128. Strs.Free;
  129. end;
  130. end;
  131. { 获取事件列表 }
  132. function TClassInfo.GetMethodList: string;
  133. var
  134. I: Integer;
  135. Strs: TStringList;
  136. begin
  137. if FPropertyCount = 0 then
  138. Exit;
  139. Strs := TStringList.Create;
  140. try
  141. for I := 0 to PropertyCount - 1 do
  142. begin
  143. if PropertyTypes[I].Kind = tkMethod then
  144. Strs.Add(PropertyList[I].Name)
  145. end;
  146. Result := Strs.Text;
  147. finally
  148. Strs.Free;
  149. end;
  150. end;
  151. end.

然后创建一个空白窗体,窗体上创建两个 TMemo(mmo1、mmo2)和两个 TButton(btn1、btn2),双击 btn1 和 btn2 ,使用如下代码进行测试(测试在程序运行时 TControl 和 TButton 的 published 属性和方法):

    1. unit Form1Unit;
    2. interface
    3. uses
    4. Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
    5. Dialogs, StdCtrls, ExtCtrls;
    6. type
    7. TForm1 = class(TForm)
    8. mmo1: TMemo;
    9. mmo2: TMemo;
    10. btn1: TButton;
    11. btn2: TButton;
    12. procedure btn1Click(Sender: TObject);
    13. procedure btn2Click(Sender: TObject);
    14. private
    15. { Private declarations }
    16. public
    17. { Public declarations }
    18. end;
    19. var
    20. Form1: TForm1;
    21. implementation
    22. {$R *.dfm}
    23. uses
    24. ClassInfoUnit;
    25. { 获取 TControl 的运行时信息 }
    26. procedure TForm1.btn1Click(Sender: TObject);
    27. var
    28. CI: TClassInfo;
    29. begin
    30. Caption := 'TControl';
    31. CI.Create(TControl);
    32. mmo1.Text := CI.GetPropList;
    33. mmo2.Text := CI.GetMethodList;
    34. end;
    35. { 获取 TButton 的运行时信息 }
    36. procedure TForm1.btn2Click(Sender: TObject);
    37. var
    38. CI: TClassInfo;
    39. begin
    40. Caption := 'TButton';
    41. CI.Create(TButton);
    42. mmo1.Text := CI.GetPropList;
    43. mmo2.Text := CI.GetMethodList;
    44. end;
    45. end.

http://blog.csdn.net/stevenldj/article/details/7166455

简单测试运行时类信息(RTTI),附详细例子的更多相关文章

  1. MFC中关于运行时类信息及动态创建对象的两个宏的意义(转)

    http://blog.csdn.net/ligand/article/details/49839507 MFC运行时类信息 用途: 程序在运行时,获取对象类的信息及类的继承关系 实现: 1.定义的类 ...

  2. 批处理bat脚本编写(附详细例子)

                                                        批处理bat脚本编写(附详细例子) 由于在项目开发的过程中经常需要编写bat脚本,而看大牛们编写 ...

  3. Java 序列化Serializable详解(附详细例子)

    Java 序列化Serializable详解(附详细例子) 1.什么是序列化和反序列化 Serialization(序列化)是一种将对象以一连串的字节描述的过程:反序列化deserialization ...

  4. Java 序列化Serializable详解(附详细例子)

    Java 序列化Serializable详解(附详细例子) 1.什么是序列化和反序列化Serialization(序列化)是一种将对象以一连串的字节描述的过程:反序列化deserialization是 ...

  5. 了解运行时类型信息(RTTI)

    RTTI需要引用单元TypeInfo GetPropInfo 函数用于获得属性的 RTTI 指针 PPropInfo.它有四种重载形式,后面三种重载的实现都是调用第一种形式.AKinds 参数用于限制 ...

  6. android开发之java JDK环境变量配置的信息代码 附详细教程。

    java环境变量配置: [用户变量]class_path    .;%JAVA_HOME%\lib\tools;%JAVA_HOME%\jre PATH           ;%JAVA_HOME%\ ...

  7. 【JavaSE】运行时类型信息(RTTI、反射)

    运行时类型信息使得你可以在程序运行时发现和使用类型信息.--<Think in java 4th> **** 通常我们在面向对象的程序设计中我们经常使用多态特性使得大部分代码尽可能地少了解 ...

  8. C++ - RTTI(RunTime Type Information)执行时类型信息 具体解释

    RTTI(RunTime Type Information)执行时类型信息 具体解释 本文地址: http://blog.csdn.net/caroline_wendy/article/details ...

  9. 是否含有RTTI(运行时类型信息)是动态语言与静态语言的主要区别

    运行时类型信息代表类型信息和对内存的操作能力. 运行时类型信息是运行时系统的基础. 类型信息分为编译时类型信息和运行时类型信息两种: 静态语言的类型信息只在编译时使用和保留,在可执行文件中没有类型信息 ...

随机推荐

  1. Web 应用性能提升 10 倍的 10 个建议

    转载自http://blog.jobbole.com/94962/ 提升 Web 应用的性能变得越来越重要.线上经济活动的份额持续增长,当前发达世界中 5 % 的经济发生在互联网上(查看下面资源的统计 ...

  2. 怎样在超级终端和PC之间通过串口传输文件

    Windows环境下,通过SecureCRT软件,用串口向ARM开发板发送文件: 输入命令 rz,可以看到如下图所示: 选择路径点击上传即可. 如果是想从Arm开发板中把文件Down下来,则可以按照下 ...

  3. C#学习日志 day10 -------------- problem statement

    Revision History Date Issue Description Author 15/May/2015 1.0 Finish most of the designed function. ...

  4. 【异常处理】java.lang.NoClassDefFoundError

    Exception in thread"main" java.lang.NoClassDefFoundError:org/apache/commons/lang/exception ...

  5. php面向对象编程学习之高级特性

    前几天写了一篇关于php面向对象基础知识的博客,这两天看了php面向对象的高级特性,写出来记录一下吧,方便以后拿出来复习. 面向对象除了最基本的定义类之外,最主要就是因为面向的一些高级特性,运用这些高 ...

  6. 车间任务不允许"每个装配件"超过100000

    应用 Oracle Work in   Progress 层 Level Function 函数名 Funcgtion Name WIP_WIPMRMDF 表单名 Form Name WIPMRMDF ...

  7. JDBC笔记

    简介 JDBC是Java规定的访问数据库的API,目前主流的数据库都支持JDBC.使用JDBC访问不同的数据库时需要安装不同的驱动. JDBC定义了数据库的链接,SQL语句的执行以及查询结果集的遍历等 ...

  8. poj1862---变形虫(贪心)

    题意:两条虫之间碰在一起,质量变为2*sqrt(m1*m2) 求怎么结合,能使最后的一只虫质量最小 分析:如果让按从大到小的顺序依次结合,可以使大的数被开方的次数最多,得到的结果更小 4 3 2 1 ...

  9. XML限制、初步WEB服务

    DTD <!DOCTYPE 根元素 [ <!ELEMENT 元素 (a,b,c)>//必须按照根元素包含abc顺序排列 <!ATTLIST 属性 > ]> 引用方式 ...

  10. javaScript 工作必知(六) delete in instanceof

    in in 判断  左边 的字符串或者能转换成字符串的是否属于 右边 的属性. var data = { x: 1, y: 4 };//定义了直接对象 alert("x" in d ...