了解运行时类型信息(RTTI)
2009-04-27 13:29
295 查看
翻阅近期的帖子,发现类似如下的问题被提及多次:
如何根据名称找到控件
如何根据名称找到对应的属性
如何根据名称执行某个方法或事件
那我们能不能做到呢,当然可以,那就让我们了解一下RTTI吧.
运行时类型信(以下简称RTTI)是在运行时保存和检索对象和数据类型的手段.通过RTTI我们可以了解正在使用的对象或组件的信息,并对它们进行一些处理.
RTTI需要引用单元TypeInfo
至于RTTI的数据结构,大家可以参考TypeInfo单元的代码
看例子,先为大家介绍一下根据字符串找到属性,并且对其修改的例子
根据属性字符串找到属性,并修改属性
GetPropInfo 函数用于获得属性的 RTTI 指针 PPropInfo。它有四种重载形式,后面三种重载的实现都是调用第一种形式。AKinds 参数用于限制属性的类型,如果得到的 PPropInfo 不属于指定的类型,则返回 nil。
function GetPropInfo(TypeInfo: PTypeInfo; const PropName: string): PPropInfo;
function GetPropInfo(Instance: TObject; const PropName: string;
AKinds: TTypeKinds = []): PPropInfo;
function GetPropInfo(AClass: TClass; const PropName: string;
AKinds: TTypeKinds = []): PPropInfo;
function GetPropInfo(TypeInfo: PTypeInfo; const PropName: string;
AKinds: TTypeKinds): PPropInfo;
SetPropValue 函数用于设置任何类型的属性值。SetPropValue 的实现与 GetPropValue 类似。并且 SetPropValue 内部分析 Value 参数是否是字符串来设置枚举和集合类型的属性,所以不需要 PreferStrings 参数。
参考文献:大富翁论坛
如何根据名称找到控件
如何根据名称找到对应的属性
如何根据名称执行某个方法或事件
那我们能不能做到呢,当然可以,那就让我们了解一下RTTI吧.
运行时类型信(以下简称RTTI)是在运行时保存和检索对象和数据类型的手段.通过RTTI我们可以了解正在使用的对象或组件的信息,并对它们进行一些处理.
RTTI需要引用单元TypeInfo
至于RTTI的数据结构,大家可以参考TypeInfo单元的代码
看例子,先为大家介绍一下根据字符串找到属性,并且对其修改的例子
根据属性字符串找到属性,并修改属性
GetPropInfo 函数用于获得属性的 RTTI 指针 PPropInfo。它有四种重载形式,后面三种重载的实现都是调用第一种形式。AKinds 参数用于限制属性的类型,如果得到的 PPropInfo 不属于指定的类型,则返回 nil。
function GetPropInfo(TypeInfo: PTypeInfo; const PropName: string): PPropInfo;
function GetPropInfo(Instance: TObject; const PropName: string;
AKinds: TTypeKinds = []): PPropInfo;
function GetPropInfo(AClass: TClass; const PropName: string;
AKinds: TTypeKinds = []): PPropInfo;
function GetPropInfo(TypeInfo: PTypeInfo; const PropName: string;
AKinds: TTypeKinds): PPropInfo;
SetPropValue 函数用于设置任何类型的属性值。SetPropValue 的实现与 GetPropValue 类似。并且 SetPropValue 内部分析 Value 参数是否是字符串来设置枚举和集合类型的属性,所以不需要 PreferStrings 参数。
以下代码,循环修改窗体上的Button组件的Capiton 方法一: procedure TForm1.SetCaption; var pInfo : PPropInfo; i:integer; begin for i := 0 to Self.ControlCount - 1 do begin pInfo := GetPropInfo(Self.Controls[i],'Caption'); //GetPropInfo,根据'Caption'字符串,查找Caption属性 if pInfo <> nil then //如果有 TButton(Self.Controls[i]).Caption:= 'ABC'; //修改Capiton end; end; 方法二: procedure TForm1.SetCaption; var pInfo : PPropInfo; i:integer; begin for i := 0 to Self.ControlCount - 1 do begin pInfo := GetPropInfo(Self.Controls[i],'Caption'); if pInfo <> nil then SetPropValue(Self.Controls[i],'Caption','ABC'); end; end;
参考文献:大富翁论坛
相关文章推荐
- 了解运行时类型信息(RTTI)
- 了解运行时类型信息(RTTI)
- 了解运行时类型信息(RTTI)
- 在.NET运行时了解类型信息(1)
- RTTI(Run-Time Type Information,通过运行时类型信息) 运行期类型检查
- 在.NET运行时了解类型信息(3)
- [面试] C/C++ 语法(六)—— RTTI(运行时类型信息)
- C++中运行时类型信息(RTTI)及动态强制类型转换
- C++知识文档十二_运行时类型信息RTTI
- RTTI 运行时类型信息 与 Reflect 反射
- 4.MFCRTTI,运行时类型信息
- RTTI 运行时类型信息
- C++ - RTTI(RunTime Type Information)运行时类型信息 详解
- C++之运行时类型信息(RTTI)
- 【C++】学习笔记草稿版17(运行时类型信息RTTI)
- Runtime Type Information 运行时类型信息RTTI
- Java的反射与RTTI(运行时类型信息)的区别
- 在.NET运行时了解类型信息(2)
- 在.NET运行时了解类型信息(2)
- 使用Java的RTTI(运行时类型信息)要注意的地方