您的位置:首页 > 理论基础 > 数据结构算法

了解运行时类型信息(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 参数。

以下代码,循环修改窗体上的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;


 

 参考文献:大富翁论坛
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息