新建一个单元文件,填写如下代码,然后保存为 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. 我本人一直以来犯的错误,在看了《Think In Java》后才抓了出来(转)

    也许你是只老鸟,也许你的程序编的很精,但是,在你的程序生活,你也许没有注意到一些“常识性”的问题,因为有些时候我们不需要去注意,我们的程序 照样能够运行得飞快,但是如果那天有一个无聊的人问你一个像这样 ...

  2. 加密传输SSL协议3_非对称加密

    困死了,这里对非对称加密体系开个头,具体的实验明天写 非对称加密体系 为了解决对称加密中密钥的传输的问题,一些天才的数学家就提出了非对称式的加密体系,也称为公钥加密体系. 加密和解密的密钥是不同的.一 ...

  3. classic asp中使用ADODB.Command防止sql injection

    原始代码如下 Set Conn = Server.CreateObject("Adodb.Connection") Conn.Open "Provider=Microso ...

  4. Android SQLiteDatabase使用总结

    SQLiteDatabase数据库操作 1.创建一个继承了类SQLiteOPenHelper类复写相应的方法,和构造函数 2.然后创建一个类,定义一个私有变量(上述类的实例化对象),在构造函数中进行初 ...

  5. SQL Server 启用与禁止触发器

    启用: disable trigger trigger_name on {objectName | database_name | server}; 禁用: enable trigger trigge ...

  6. java中输出流OutputStream 类应用实例(转)

    OutputStream类该类是字节输出流的抽象类,定义了输出流的各种操作方法.这些方法的说明如表1所示.下面通过实例介绍如何使用OutputStream类向控制台输出字符串信息.步骤如下.(1)创建 ...

  7. poj2027简单题

    #include <stdio.h> #include <stdlib.h> int main() { int n,x,y; scanf("%d",& ...

  8. openNebula libvirt-virsh attach disk device for kvm

    1,新建文件硬盘 qemu-img create -f qcow2 testdisk.img 2G

  9. mac下通过xcodebuild使用oclint

    step1 :下载oclint并安装 下载地址: http://oclint.org/downloads.html 选择mac os x或者darwin的包,下载到本地. 文件夹类似以下: oclin ...

  10. SQL语句一些特殊的用法

    SQL语句一些特殊的用法 一.基础 1.说明:创建数据库 CREATE DATABASE database-name  2.说明:删除数据库 drop database dbname 3.说明:备份s ...