大悟还俗

邮箱 key_ok@qq.com 我的收集 http://pan.baidu.com/share/home?uk=1177427271
  新随笔  :: 联系 :: 订阅 订阅  :: 管理

RTTI D7

Posted on 2013-11-18 17:19  大悟还俗_2  阅读(263)  评论(0编辑  收藏  举报

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;
View Code