- 如何根據名稱找到控件
- 如何根據名稱找到對應的屬性
- 如何根據名稱執行某個方法或事件
運作時類型信(以下簡稱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 ?
- 以下代碼,循環修改窗體上的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;