天天看點

Delphi RTTI(運作時類型資訊)

  • 如何根據名稱找到控件
  • 如何根據名稱找到對應的屬性
  • 如何根據名稱執行某個方法或事件

運作時類型信(以下簡稱RTTI)是在運作時儲存和檢索對象和資料類型的手段.通過RTTI我們可以了解正在使用的對象或元件的資訊,并對它們進行一些處理.

RTTI需要引用單元TypInfo

至于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 參數。

[delphi] view plain copy print ?

  1. 以下代碼,循環修改窗體上的Button元件的Capiton  
  2. 方法一:  
  3. procedure TForm1.SetCaption;  
  4. var  
  5.   pInfo : PPropInfo;  
  6.   i:integer;  
  7. begin  
  8.   for i := 0 to Self.ControlCount - 1 do  
  9.   begin  
  10.     pInfo := GetPropInfo(Self.Controls[i],'Caption');   //GetPropInfo,根據'Caption'字元串,查找Caption屬性   
  11.     if pInfo <> nil then                             //如果有   
  12.       TButton(Self.Controls[i]).Caption:= 'ABC';     //修改Capiton   
  13.   end;  
  14. end;  
  15. 方法二:  
  16. procedure TForm1.SetCaption;  
  17. var  
  18.   pInfo : PPropInfo;  
  19.   i:integer;  
  20. begin  
  21.   for i := 0 to Self.ControlCount - 1 do  
  22.   begin  
  23.     pInfo := GetPropInfo(Self.Controls[i],'Caption');  
  24.     if pInfo <> nil then  
  25.       SetPropValue(Self.Controls[i],'Caption','ABC');  
  26.   end;  
  27. end;  

繼續閱讀