delphi 运行时动态设置控件(类)属性值

发布时间 2023-10-27 18:53:55作者: txgh

运行时动态设置控件(类)属性值

代码

运行时根据控件名称设置Alignment属性值

uses System.Rtti;

procedure TForm1.Button1Click(Sender: TObject);
var
  vComponent: TComponent;
  vRttiCtx: TRttiContext;
  vRType: TRttiType;
  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
      vRType := vRttiCtx.GetType(vComponent.ClassInfo);
      vProp := vRType.GetProperty('Alignment');
      if vProp = nil then
      begin
        Memo1.Lines.Add('未找到Alignment属性');
      end
      else
      begin
        v := TValue.From<TAlignment>(taRightJustify);
        vProp.SetValue(vComponent, v);
      end;
    finally
      vRttiCtx.Free;
    end;
  end;
end;

运行时根据控件名称设置Alignment属性值(SetPropValue方法)

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
    SetPropValue(vComponent, 'Alignment', taRightJustify);
  end;
end;

方法

System.Rtti.TRttiProperty.SetValue

procedure SetValue(Instance: Pointer; const AValue: TValue);

Unit

System.Rtti

设置给定实例中属性的值。

参数

AInstance 指向类实例或记录实例。

AValue 包含新属性值的 TValue 结构。

注意: 使用 IsWritable 属性来检查是否允许写入属性的值。尝试对不可写属性调用会导致异常。

System.TypInfo.SetPropValue

procedure SetPropValue(Instance: TObject; const PropName: string; const Value: Variant);
procedure SetPropValue(Instance: TObject; PropInfo: PPropInfo; const Value: Variant);

Unit

System.TypInfo

利用 RTTI(运行时类型信息)来使用变体值设置组件属性的值。

该函数允许在运行时进行可视化组件处理,设置组件属性。

通常,Variant 类型不能保留类型 TObject、set、方法指针和类类型。但是 GetPropValueSetPropValue 可以处理这些类型。在这些情况下,SetPropValue 可以更改类型 TObject、集合、方法指针和类的属性。

参数

Instance 指向类实例。

PropName 属性的名称

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

Value 新属性值。如果参数不是 GetPropValue 的返回值,则必须同时检查变体数据和属性类型,且属性类型为 TObject、set、方法指针或类类型,则结果未定义。

注意:

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