delpi中的RTTI初试
java中的反射机制使我们能够在运行期间获取运行期类的信息,那么在delphi中有没有这样的功能呢?答案是有,实现这种功能的机制在delphi中叫做RTTI,废话少说,先来一段demo:
1.先定义一个demo类,注意这个类必须要以TPersistent为基类,代码如下:
- unit Unit2;
- interface
- { TDemo }
- uses Classes ;
- type
- TDemo = class(TPersistent)
- private
- protected
- public
- FName : string;
- FAge : Integer;
- constructor Create;
- destructor Destroy; override;
- published
- property Name : string read FName write FName;
- property Age : Integer read FAge write FAge;
- end;
- implementation
- { TDemo }
- constructor TDemo.Create;
- begin
- FName := 'peirenlei';
- end;
- destructor TDemo.Destroy;
- begin
- inherited;
- end;
- end.
2.接下来,创建一个这个类的实例:
- ADemo := TDemo.Create;
- ADemo.Name := 'peirenlei';
- ADemo.Age := 0;
3.获取该实例的属性列表:
- var
- APropList:PPropList;
- ATypeInfo:PTypeInfo;
- AClasDateInfo:PTypeData;
- I : Integer;
- begin
- ATypeInfo := ADemo.ClassInfo;
- AClasDateInfo := GetTypeData(ATypeInfo);
- if AClasDateInfo.PropCount <> 0 then
- begin
- //分配空间
- GetMem(APropList,sizeof(PPropInfo)*AClasDateInfo.PropCount);
- try
- GetPropInfos(ADemo.ClassInfo,APropList); //得到类的属性列表
- for I := 0 to AClasDateInfo.PropCount - 1 do
- begin
- if APropList[I]^.PropType^.Kind <> tkMethod then
- mmo.Lines.Add(Format('%s:%s',[APropList[I]^.Name,APropList[I]^.PropType^.Name]));
- end;
- finally
- FreeMem(APropList,sizeof(APropList)*AClasDateInfo.PropCount);
- end;
- end;
- end;
输出:
- Name:string
- Age:Integer
3. 获取类的方法列表:
- var
- APropList:PPropList;
- ATypeInfo:PTypeInfo;
- AClasDateInfo:PTypeData;
- I ,NumPro : Integer;
- begin
- ATypeInfo := ADemo.ClassInfo;
- AClasDateInfo := GetTypeData(ATypeInfo);
- if AClasDateInfo.PropCount <> 0 then
- begin
- //分配空间
- GetMem(APropList,sizeof(PPropInfo)*AClasDateInfo.PropCount);
- try
- NumPro := GetPropList(ADemo.ClassInfo,[tkMethod],APropList);
- if NumPro <> 0 then
- begin
- mmo.Lines.Add('-----events-------');
- for I := 0 to NumPro - 1 do //获得事件属性的列表
- begin
- mmo.Lines.Add(Format('%s:%s',[APropList[i]^.Name,APropList[i]^.PropType^.Name]));
- end;
- end;
- finally
- FreeMem(APropList,sizeof(PPropInfo)*AClasDateInfo.PropCount);
- end;
- end;
- end;
4.获取实例类的属性和属性值:
- var
- AProperInfo:PPropInfo;
- AValue:string;
- begin
- AValue := GetPropValue(ADemo,'Name');
- mmo.Lines.Add('Name='+AValue);
- AValue := GetPropValue(ADemo,'Age');
- mmo.Lines.Add('Age='+AValue);
- SetPropValue(ADemo,'Name','zengzhen');
- SetPropValue(ADemo,'Age',100);
- AValue := GetPropValue(ADemo,'Name');
- mmo.Lines.Add('Name='+AValue);
- AValue := GetPropValue(ADemo,'Age');
- mmo.Lines.Add('Age='+AValue);
- end;
输出:
- Name=peirenlei
- Age=0
- Name=zengzhen
- Age=100
http://peirenlei.iteye.com/blog/378465
delpi中的RTTI初试的更多相关文章
- C++中的RTTI机制解析
RTTI RTTI概念 RTTI(Run Time Type Identification)即通过运行时类型识别,程序能够使用基类的指针或引用来检查着这些指针或引用所指的对象的实际派生类型. RTTI ...
- C++ 中的RTTI机制详解
前言 RTTI是”Runtime Type Information”的缩写,意思是运行时类型信息,它提供了运行时确定对象类型的方法.RTTI并不是什么新的东西,很早就有了这个技术,但是,在实际应用中使 ...
- Java中的RTTI
RTTI可以帮助我们在运行时识别对象和类的信息. 一般传统的RTTI有三种实现方式: 1. 向上转型或向下转型(upcasting and downcasting),在java中,向下转型(父类转成子 ...
- Delphi中的Rtti函数
TTypeKind,类型类别,tkclass,tkinteger,tkstring等.类,属性都是一种类型. ttypedata,是一个record包括ttypekind.是一个类的描述.TTypeK ...
- Delphi中关于Rtti的一些操作(一)
function TForm1.ShowMethodAddress(aObj: TDerived; const sData: String) : Pointer;var aPtr : Pointer ...
- Java系列笔记(2) - Java RTTI和反射机制
目录 前言 传统的RTTI 反射 反射的实现方式 反射的性能 反射与设计模式 前言 并不是所有的Class都能在编译时明确,因此在某些情况下需要在运行时再发现和确定类型信息(比如:基于构建编程,),这 ...
- UE4 中Struct Emum 类型的定义方式 笔记
UE4 基础,但是不经常用总是忘记,做个笔记加深记忆: 图方便就随便贴一个项目中的STRUCT和 Enum 的.h 文件 Note:虽然USTRUCT可以定义函数,但是不能加UFUNCTION 标签喔 ...
- Java RTTI机制与反射机制
1.1 什么是RTTI? 维基百科的定义:In computer programming, RTTI (Run-Time Type Information, or Run-Time Type Iden ...
- RTTI (Run-Time Type Identification,通过运行时类型识别) 转
参考一: RTTI(Run-Time Type Identification,通过运行时类型识别)程序能够使用基类的指针或引用来检查这些指针或引用所指的对象的实际派生类型. RTTI提供了以下两个 ...
随机推荐
- Redis中的value包含中文显示的问题?
linux 系统 redis不识别中文 如何显示中文 在Redis中存储的value值是中文“马拉斯加”Shell下get获取后展示的结果为:\xc2\xed\xc0\xad\xcb\xb9\xbc ...
- mysql中if语句
#1.IF表达式 IF(condition,expr1,expr2) //如果condition成立返回expr1,否则返回expr2 #2.IFNULL表达式 IFNULL(expr1,expr2) ...
- zookeeper perl 版本需求
[root@wx03 ~]# perl -v This is perl 5, version 22, subversion 1 (v5.22.1) built for x86_64-linux Cop ...
- Pencil OJ 02 安装
Mongo 官方的安装方法 官方教程已经很好啦,这里就不罗嗦了. 源码编译 待补.我是从这里看到的. 遇到的问题 启动时的警告信息 2015-03-06T21:01:15.526-0800 I CON ...
- libgdx, mouse 关节
鼠标与body的交互就靠这个mouse 关节了. 在使用中:主要分成3步: 步1:mouseDown : 这个时期,调用world->QueryAABB.它有一个回调接口,并依据鼠标指针指定一个 ...
- Oracle 数据的导入和导出(SID service.msc)
一:版本号说明: (1)(Oracle11 32位系统)Oracle - OraDb11g_home1: (2)成功安装后显演示样例如以下:第一个图是管理工具.创建连接.创建表:第二个是数据库创建工 ...
- C#文件上传和文件下载
#region 文件上传 private void UpLoadFile(string fileName, string fileNamePath, string uriString) { ); if ...
- c: c代码书写规范
排版: 较长的语句或函数过程参数(>80字符)要分成多行书写, 长表达式要在低优先级操作符处划分新行,操作符放在新行之首, 划分出的新行要进行适当的缩进,使排版整齐,语句可读 参考: 1. 运算 ...
- ASP.NET aspx页面中 写C#脚本; ASP.NET 指令(<%@%>);
1 <h2>Welcome</h2> <ul> <% for (int i = 0; i <= Convert.ToInt32(ViewData[&qu ...
- Javascript DOM 02 在<ul>中创建、删除 <li>
创建DOM元素 createElement(标签名) 创建一个节点 appendChild(节点) 追加一个节点 例子:为ul插入li 插入元素 insertBefore(节点, 原有节点) 在 ...