java中的反射机制使我们能够在运行期间获取运行期类的信息,那么在delphi中有没有这样的功能呢?答案是有,实现这种功能的机制在delphi中叫做RTTI,废话少说,先来一段demo:

1.先定义一个demo类,注意这个类必须要以TPersistent为基类,代码如下:

  1. unit Unit2;
  2. interface
  3. { TDemo }
  4. uses  Classes ;
  5. type
  6. TDemo = class(TPersistent)
  7. private
  8. protected
  9. public
  10. FName : string;
  11. FAge : Integer;
  12. constructor Create;
  13. destructor Destroy; override;
  14. published
  15. property Name : string read FName write FName;
  16. property Age : Integer read FAge write FAge;
  17. end;
  18. implementation
  19. { TDemo }
  20. constructor TDemo.Create;
  21. begin
  22. FName := 'peirenlei';
  23. end;
  24. destructor TDemo.Destroy;
  25. begin
  26. inherited;
  27. end;
  28. end.

2.接下来,创建一个这个类的实例:

  1. ADemo := TDemo.Create;
  2. ADemo.Name := 'peirenlei';
  3. ADemo.Age := 0;

3.获取该实例的属性列表:

  1. var
  2. APropList:PPropList;
  3. ATypeInfo:PTypeInfo;
  4. AClasDateInfo:PTypeData;
  5. I : Integer;
  6. begin
  7. ATypeInfo := ADemo.ClassInfo;
  8. AClasDateInfo := GetTypeData(ATypeInfo);
  9. if AClasDateInfo.PropCount <> 0 then
  10. begin
  11. //分配空间
  12. GetMem(APropList,sizeof(PPropInfo)*AClasDateInfo.PropCount);
  13. try
  14. GetPropInfos(ADemo.ClassInfo,APropList);  //得到类的属性列表
  15. for I := 0 to AClasDateInfo.PropCount - 1 do
  16. begin
  17. if APropList[I]^.PropType^.Kind <> tkMethod then
  18. mmo.Lines.Add(Format('%s:%s',[APropList[I]^.Name,APropList[I]^.PropType^.Name]));
  19. end;
  20. finally
  21. FreeMem(APropList,sizeof(APropList)*AClasDateInfo.PropCount);
  22. end;
  23. end;
  24. end;

输出:

  1. Name:string
  2. Age:Integer

3. 获取类的方法列表:

  1. var
  2. APropList:PPropList;
  3. ATypeInfo:PTypeInfo;
  4. AClasDateInfo:PTypeData;
  5. I ,NumPro : Integer;
  6. begin
  7. ATypeInfo := ADemo.ClassInfo;
  8. AClasDateInfo := GetTypeData(ATypeInfo);
  9. if AClasDateInfo.PropCount <> 0 then
  10. begin
  11. //分配空间
  12. GetMem(APropList,sizeof(PPropInfo)*AClasDateInfo.PropCount);
  13. try
  14. NumPro := GetPropList(ADemo.ClassInfo,[tkMethod],APropList);
  15. if NumPro <> 0 then
  16. begin
  17. mmo.Lines.Add('-----events-------');
  18. for I := 0 to NumPro - 1 do //获得事件属性的列表
  19. begin
  20. mmo.Lines.Add(Format('%s:%s',[APropList[i]^.Name,APropList[i]^.PropType^.Name]));
  21. end;
  22. end;
  23. finally
  24. FreeMem(APropList,sizeof(PPropInfo)*AClasDateInfo.PropCount);
  25. end;
  26. end;
  27. end;

4.获取实例类的属性和属性值:

  1. var
  2. AProperInfo:PPropInfo;
  3. AValue:string;
  4. begin
  5. AValue := GetPropValue(ADemo,'Name');
  6. mmo.Lines.Add('Name='+AValue);
  7. AValue := GetPropValue(ADemo,'Age');
  8. mmo.Lines.Add('Age='+AValue);
  9. SetPropValue(ADemo,'Name','zengzhen');
  10. SetPropValue(ADemo,'Age',100);
  11. AValue := GetPropValue(ADemo,'Name');
  12. mmo.Lines.Add('Name='+AValue);
  13. AValue := GetPropValue(ADemo,'Age');
  14. mmo.Lines.Add('Age='+AValue);
  15. end;

输出:

  1. Name=peirenlei
  2. Age=0
  3. Name=zengzhen
  4. Age=100

http://peirenlei.iteye.com/blog/378465

delpi中的RTTI初试的更多相关文章

  1. C++中的RTTI机制解析

    RTTI RTTI概念 RTTI(Run Time Type Identification)即通过运行时类型识别,程序能够使用基类的指针或引用来检查着这些指针或引用所指的对象的实际派生类型. RTTI ...

  2. C++ 中的RTTI机制详解

    前言 RTTI是”Runtime Type Information”的缩写,意思是运行时类型信息,它提供了运行时确定对象类型的方法.RTTI并不是什么新的东西,很早就有了这个技术,但是,在实际应用中使 ...

  3. Java中的RTTI

    RTTI可以帮助我们在运行时识别对象和类的信息. 一般传统的RTTI有三种实现方式: 1. 向上转型或向下转型(upcasting and downcasting),在java中,向下转型(父类转成子 ...

  4. Delphi中的Rtti函数

    TTypeKind,类型类别,tkclass,tkinteger,tkstring等.类,属性都是一种类型. ttypedata,是一个record包括ttypekind.是一个类的描述.TTypeK ...

  5. Delphi中关于Rtti的一些操作(一)

    function TForm1.ShowMethodAddress(aObj: TDerived; const sData: String) : Pointer;var  aPtr : Pointer ...

  6. Java系列笔记(2) - Java RTTI和反射机制

    目录 前言 传统的RTTI 反射 反射的实现方式 反射的性能 反射与设计模式 前言 并不是所有的Class都能在编译时明确,因此在某些情况下需要在运行时再发现和确定类型信息(比如:基于构建编程,),这 ...

  7. UE4 中Struct Emum 类型的定义方式 笔记

    UE4 基础,但是不经常用总是忘记,做个笔记加深记忆: 图方便就随便贴一个项目中的STRUCT和 Enum 的.h 文件 Note:虽然USTRUCT可以定义函数,但是不能加UFUNCTION 标签喔 ...

  8. Java RTTI机制与反射机制

    1.1 什么是RTTI? 维基百科的定义:In computer programming, RTTI (Run-Time Type Information, or Run-Time Type Iden ...

  9. RTTI (Run-Time Type Identification,通过运行时类型识别) 转

    参考一: RTTI(Run-Time Type Identification,通过运行时类型识别)程序能够使用基类的指针或引用来检查这些指针或引用所指的对象的实际派生类型.   RTTI提供了以下两个 ...

随机推荐

  1. java--String方法

    String : 字符串类型 一.构造函数 String(byte[ ] bytes):通过byte数组构造字符串对象. String(char[ ] value):通过char数组构造字符串对象. ...

  2. USACO Cow Pedigrees 【Dp】

    一道经典Dp. 定义dp[i][j] 表示由i个节点,j 层高度的累计方法数 状态转移方程为: 用i个点组成深度最多为j的二叉树的方法树等于组成左子树的方法数 乘于组成右子树的方法数再累计. & ...

  3. HDU 1004 MAP【STL__map_的应用】

    强大的MAP,今天终于开始好好学习一次. map内部是用红黑树维持的有序结构. 定义:map<int,string>mapStudent; 查找的时间复杂度为对数级别. 1.构造方法学习两 ...

  4. Ubuntu上搭建DokuWiki

    1.准备工作 1) 安装Apache sudo apt-get install apache2 2)在浏览器中输入http://localhost 如果现实It works则说明Apache安装成功, ...

  5. Qt中所有类型之间的转换

    1.char * 与 const char *的转换 char *ch1="hello11";const char *ch2="hello22";ch2 = c ...

  6. sencha touch(7)——list组件

    1.list组件是一个很强大的组件.用于以一览表的形式或者列表的形式展示应用程序中的大量的数据.该组件使用XTemplate模版来显示数据,同时与数据仓库进行绑定.所以当数据仓库中的数据发生变化的时候 ...

  7. Python 第六篇(中):面向对象编程中级篇

    面向对象编程中级篇: 编程思想概述: 面向过程:根据业务逻辑从上到下写垒代码  #最low,淘汰 函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可 #混口饭吃 def add(ho ...

  8. svn回滚版本2

    svn 版本回滚 取消对代码的修改分为两种情况:   第一种情况:改动没有被提交(commit). 这种情况下,使用svn revert就能取消之前的修改. svn revert用法如下: # svn ...

  9. Android自定义照相机实现(拍照、保存到SD卡,利用Bundle在Acitivity交换数据)

    Android自定义照相机实现 近期小巫在学校有一个创新项目,也不是最近,是一个拖了很久的项目,之前一直没有去搞,最近因为要中期检查,搞得我跟小组成员一阵忙活,其实开发一款照相机软件并不太难,下面就是 ...

  10. Android_简单笔记一

    入门学习Android的简单笔记(已经安装好了开发环境ADT) 一.关于 AndroidManifest.xml文件 1. android:icon和android:label定义了应用程序安装后显示 ...