首页 > 其他分享 >delphi 运行时动态获取控件(类)属性值

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

时间:2023-10-23 19:12:02浏览次数:30  
标签:控件 begin end vComponent delphi System 属性

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

代码

运行时根据控件名称获取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 指定在获取枚举或集合类型的属性值时是否应使用字符串表示形式。

标签:控件,begin,end,vComponent,delphi,System,属性
From: https://www.cnblogs.com/txgh/p/17783233.html

相关文章

  • 在Delphi中使用正则表达式校验中文姓名
    usessystem.RegularExpressions;functionIsChineseName(constaName:string;constaMaxLength:Integer=10):Boolean;beginvarPattern:='^[\x{4E00}-\x{9FA5}]{2,'+aMaxLength.ToString+'}(·[\x{4E00}-\x{9FA5}]{2,'+aMaxLength.ToString......
  • JPA查询修改数据,但是未保存到数据库,数据库却修改了,因为对查询出的Entity实体对象,修改s
    JPA查询修改数据,但是未保存到数据库,数据库却修改了,因为对查询出的Entity实体对象,修改set了属性。导致事务提交时候修改了数据库的数据使用JPA查询数据,对查询出来的结果进行修改,但是不保存数据库,最终数据库却做了同样的修改。JPA对象的四种状态瞬时状态:瞬时状态的实体就是一......
  • [Vue]计算属性computed
    计算属性:  1.定义:要用的属性不存在,要通过已有属性计算得来。   2.原理:底层借助了Objcet.defineProperty方法提供的getter和setter。   3.get函数什么时候执行?      (1).初次读取时会执行一次。      (2).当依赖的数据发生改变......
  • CSS(二) 字体系列属性
    1.CSS常用属性属性名称属性作用值width宽度px/百分数/em等height高度px/百分数/em等background-color背景色red/#fff/rgb(255,255,255).box{width:100px;/*宽度*/height:100px;/*高度*/bac......
  • 前端接口请求HTTP设置自定义header属性字段大小写问题
    问题:接口请求头传token值的字段为tokenValue,需要用到token的接口一直不能成功请求。后端排查发现没有接收到token,前端虽然传了token值,但是发现浏览器把tokenValue变成了Tokenvalue,导致后端没正确接收到token值。原因是:HTTPRFC里规定,大小写不敏感。HTTP/1.x大小写不敏感,但现实是......
  • [AHK2] 向对象原型添加属性和方法
    ahk和js十分相似,其中一点就是可以向本地对象添加自定义方法和属性。下面的脚本向ahk的字符串,数组添加了许多方法,添加之后在使用上就和js更加相似了。;Thisscriptisusedtoextendthemethodsoftheahknativeobjectprototype#RequiresAutoHotkeyv2.0#SingleInstan......
  • 原始翎风CLIENT8位 (3) frmMain 下的 CSocket控件
    原始翎风CLIENT8位frmMain下的CSocket控件属性:在frmMain的FormCreate中g_ConnectionStep:=cnsLogin设置为登陆方式g_boSendLogin:=Falseg_boServerConnected:=FALSE根据读取的mir.ini文件给CSOCKET的ADDRESS,PORT赋值Socket.Address:=g_sServerAddr;CSocket.Port:......
  • 循序渐进介绍基于CommunityToolkit.Mvvm 和HandyControl的WPF应用端开发(11) -- 下拉
    在我们开发的前端项目中,往往为了方便,都需对一些控件进行自定义的处理,以便实现快速的数据绑定以及便捷的使用,本篇随笔介绍通过抽取常见字典列表,实现通用的字典类型绑定;以及通过自定义控件的属性处理,实现系统字典内容的快捷绑定的操作。1、下拉列表的数据绑定在我们创建下拉列表的......
  • CSS3属性详解(一)文本 盒模型中的 box-ssize 属性 处理兼容性问题:私有前缀 边框 背景属
    CSS3是用于为HTML文档添加样式和布局的最新版本的层叠样式表(CascadingStyleSheets)。下面是一些常用的CSS3属性及其详细解释:border-radius:设置元素的边框圆角的半径。可以使用四个值设置四个不同的圆角半径,也可以只使用一个值来设置统一的圆角。box-shadow:创建一个元素的阴影效果......
  • 利用 CSS 的 clip-path 属性快速画三角形、气泡框
    clip-path 结合polygon函数,可以快速切出一个三角形、气泡框。a.三角形有三个顶点,因此 polygon 需要传三个参数,每个参数是顶点的x和y轴位置百分比:#triangle-1{-webkit-clip-path:polygon(50%0,100%100%,0100%);clip-path:polygon(50%0,100%100%,......