• delpi中的RTTI初试


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

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

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

      

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

    Delphi代码  收藏代码
    1. ADemo := TDemo.Create;  
    2.   
    3.  ADemo.Name := 'peirenlei';  
    4.  ADemo.Age := 0;  

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

    Delphi代码  收藏代码
    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.           
    21.     finally  
    22.       FreeMem(APropList,sizeof(APropList)*AClasDateInfo.PropCount);   
    23.     end;  
    24.   end;  
    25. end;  

        输出:   

    Delphi代码  收藏代码
    1. Name:string  
    2. Age:Integer  

    3. 获取类的方法列表:

    Delphi代码  收藏代码
    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.   
    14.     try  
    15.       NumPro := GetPropList(ADemo.ClassInfo,[tkMethod],APropList);  
    16.       if NumPro <> 0 then  
    17.       begin  
    18.          mmo.Lines.Add('-----events-------');  
    19.          for I := 0 to NumPro - 1 do //获得事件属性的列表  
    20.          begin  
    21.            mmo.Lines.Add(Format('%s:%s',[APropList[i]^.Name,APropList[i]^.PropType^.Name]));  
    22.          end;  
    23.       end;  
    24.     finally  
    25.       FreeMem(APropList,sizeof(PPropInfo)*AClasDateInfo.PropCount);  
    26.     end;  
    27.   end;  
    28. end;  

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

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

      输出:

    Delphi代码  收藏代码
    1. Name=peirenlei  
    2. Age=0  
    3. Name=zengzhen  
    4. Age=100  

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

  • 相关阅读:
    ①---Java开发环境配置
    1.java的基础和数据类型
    0、原生jdbc工厂类
    spring中使用quartz动态添加定时任务执行sql
    app前端代码打包步骤
    less的解析笔记
    转:玩转HTML5移动页面(动效篇)
    HTML5属性备忘单
    玩转git和github
    js基础----数组
  • 原文地址:https://www.cnblogs.com/findumars/p/5236728.html
Copyright © 2020-2023  润新知