delphi 运行时动态获取控件(类)属性值

发布时间 2023-10-23 19:04:38作者: txgh

运行时动态获取控件(类)属性值

代码

运行时根据控件名称获取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

System.Rtti

获取描述给定类型的 RTTI 对象。

重载

GetType(Pointer)

接受指向描述类型的 RTTI 数据块的指针。可以使用 TypeInfo 标准运算符获取该指针。

GetType(TClass)

接受类引用以获取 RTTI 类型对象的方法。

不能对不提供类型信息的 Delphi 类型使用 GetType

System.Rtti.TRttiType.GetProperty

function GetProperty(const AName: string): TRttiProperty;

Unit

System.Rtti

获取作为反射类型成员的属性的 RTTI 对象。

GetProperty 仅适用于描述实际允许属性的类型的 RTTI 对象,例如记录、类和接口;对于所有其他类型,此方法只会返回 nil

参数

AName 指定要查找的属性名称。

System.Rtti.TRttiType.GetProperties

function GetProperties: TArray<TRttiProperty>;

Unit

System.Rtti

获取作为反射类型成员的所有属性的列表。

返回的列表按类/接口层次结构排序。这意味着最近包含的属性位于列表的顶部。

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

System.TypInfo

利用 RTTI(运行时类型信息)来检索指定属性的值作为变体返回。

通常,Variant 类型不能保留 TObject、set、方法指针和类类型。但是 GetPropValueSetPropValue 可以处理这些类型。在这些情况下,返回的 Variant 值仅由具有相同属性类型的 SetPropValue 使用。

注意:

  • 如果指定的属性不存在或不是已发布的属性,则会引发 EPropertyError 异常。
  • 如果要获取 Variant 类型属性,则必须使用 GetVariantProp

参数

Instance 指向类实例。

PropName 属性的名称

PropInfo 指向属性信息记录的指针。可以用 GetPropInfoGetPropList 来获取。

PreferStrings 指定在获取枚举或集合类型的属性值时是否应使用字符串表示形式。