运行时动态设置控件(类)属性值
代码
运行时根据控件名称设置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
设置给定实例中属性的值。
参数
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
利用 RTTI(运行时类型信息)来使用变体值设置组件属性的值。
该函数允许在运行时进行可视化组件处理,设置组件属性。
通常,Variant
类型不能保留类型 TObject、set、方法指针和类类型。但是 GetPropValue
和 SetPropValue
可以处理这些类型。在这些情况下,SetPropValue
可以更改类型 TObject、集合、方法指针和类的属性。
参数
Instance 指向类实例。
PropName 属性的名称
PropInfo 指向属性信息记录的指针。可以用 GetPropInfo
和 GetPropList
来获取。
Value 新属性值。如果参数不是 GetPropValue
的返回值,则必须同时检查变体数据和属性类型,且属性类型为 TObject、set、方法指针或类类型,则结果未定义。
标签:控件,begin,end,vComponent,delphi,TObject,属性 From: https://www.cnblogs.com/txgh/p/17792996.html注意:
- 如果指定的属性不存在或不是已发布的属性,则会引发
EPropertyError
异常。- 要设置 Variant 类型属性,必须使用
SetVariantProp
。