运行时动态获取控件(类)属性值
代码
运行时根据控件名称获取Caption属性值
uses System.Rtti;
procedure TForm1.Button1Click(Sender: TObject);
var
vComponent: TComponent;
vRttiCtx: TRttiContext;
vRType: TRttiType;
vProp: TRttiProperty;
begin
vComponent := Self.FindComponent(Edit1.Text);
if vComponent = nil then
begin
Memo1.Lines.Add('未找到控件' + Edit1.Text);
end
else
begin
vRttiCtx := TRttiContext.Create;
try
vRType := vRttiCtx.GetType(vComponent.ClassInfo);
vProp := vRType.GetProperty('Caption');
if vProp = nil then
begin
Memo1.Lines.Add('未找到Caption属性');
end
else
begin
Memo1.Lines.Add(vProp.GetValue(vComponent).AsString);
end;
finally
vRttiCtx.Free;
end;
end;
end;
运行时根据控件名称获取Caption属性值(GetPropValue方法)
uses System.TypInfo;
procedure TForm1.Button2Click(Sender: TObject);
var
vComponent: TComponent;
begin
vComponent := Self.FindComponent(Edit1.Text);
if vComponent = nil then
begin
Memo1.Lines.Add('未找到控件' + Edit1.Text);
end
else
begin
Memo1.Lines.Add(VarToStr(GetPropValue(vComponent, 'Caption')));
end;
end;
运行时根据控件名称遍历控件属性值
uses System.Rtti;
procedure TForm1.Button3Click(Sender: TObject);
var
vComponent: TComponent;
vRttiCtx: TRttiContext;
vProperties: TArray<TRttiProperty>;
vProp: TRttiProperty;
v: TValue;
begin
vComponent := Self.FindComponent(Edit1.Text);
if vComponent = nil then
begin
Memo1.Lines.Add('未找到控件' + Edit1.Text);
end
else
begin
vRttiCtx := TRttiContext.Create;
try
vProperties := vRttiCtx.GetType(vComponent.ClassType).GetProperties;
for vProp in vProperties do
begin
if vProp.PropertyType.TypeKind in [tkString, tkWString, tkInteger, tkFloat] then
begin
v := vProp.GetValue(Button1);
Memo1.Lines.Add('Name ' + vProp.Name + ' Value ' + v.ToString);
end
else
Memo1.Lines.Add('Name ' + vProp.Name + ' PropertyType ' + vProp.PropertyType.Name);
Memo1.Lines.Add('------------------------');
end;
finally
vRttiCtx.Free;
end;
end;
end;
方法
System.Rtti.TRttiContext.GetType
function GetType(ATypeInfo: Pointer): TRttiType;
function GetType(AClass: TClass): TRttiType;
Unit
获取描述给定类型的 RTTI 对象。
重载
GetType(Pointer)
接受指向描述类型的 RTTI 数据块的指针。可以使用 TypeInfo
标准运算符获取该指针。
GetType(TClass)
接受类引用以获取 RTTI 类型对象的方法。
不能对不提供类型信息的 Delphi 类型使用
GetType
。
System.Rtti.TRttiType.GetProperty
function GetProperty(const AName: string): TRttiProperty;
Unit
获取作为反射类型成员的属性的 RTTI 对象。
GetProperty
仅适用于描述实际允许属性的类型的 RTTI 对象,例如记录、类和接口;对于所有其他类型,此方法只会返回 nil。
参数
AName 指定要查找的属性名称。
System.Rtti.TRttiType.GetProperties
function GetProperties: TArray<TRttiProperty>;
Unit
获取作为反射类型成员的所有属性的列表。
返回的列表按类/接口层次结构排序。这意味着最近包含的属性位于列表的顶部。
GetProperties
仅适用于描述实际允许属性的类型的 RTTI 对象,例如记录、类和接口;对于所有其他类型,此方法只会返回 nil。
System.TypInfo.GetPropValue
function GetPropValue(Instance: TObject; const PropName: string; PreferStrings: Boolean): Variant;
function GetPropValue(Instance: TObject; PropInfo: PPropInfo; PreferStrings: Boolean): Variant;
Unit
利用 RTTI(运行时类型信息)来检索指定属性的值作为变体返回。
通常,Variant
类型不能保留 TObject、set、方法指针和类类型。但是 GetPropValue
和 SetPropValue
可以处理这些类型。在这些情况下,返回的 Variant
值仅由具有相同属性类型的 SetPropValue
使用。
注意:
- 如果指定的属性不存在或不是已发布的属性,则会引发
EPropertyError
异常。- 如果要获取
Variant
类型属性,则必须使用GetVariantProp
。
参数
Instance 指向类实例。
PropName 属性的名称
PropInfo 指向属性信息记录的指针。可以用 GetPropInfo
和 GetPropList
来获取。
PreferStrings 指定在获取枚举或集合类型的属性值时是否应使用字符串表示形式。