博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Delphi 使用 RTTI 动态通过名称调用函数和设置控件属性值
阅读量:4147 次
发布时间:2019-05-25

本文共 1544 字,大约阅读时间需要 5 分钟。

// 设置控件的属性名

uses TypInfo, JclAnsiStrings;

function GetObject(obj:TObject; path:String): TObject;

var objName:String;
begin
  Result := obj;

  while System.Length(path) > 0 do begin

    objName := JclAnsiStrings.StrToken(path, '.');
    if obj is TComponent then begin
      Result := TComponent(Result).FindComponent(objName);
    end else begin
      Result := TypInfo.GetObjectProp(Result, objName);
    end;
  end;
end;

procedure SetPropValue(obj:TObject; path:String; value:Variant);

var tk:TTypeKind;
    i:Integer;
    propName:String;
begin
  i := JclAnsiStrings.StrLastPos('.', path);
  if i > 0 then begin
    obj:= GetObject(obj, JclAnsiStrings.StrLeft(path, i-1));
    propName:= JclAnsiStrings.StrRestOf(path, i+1);
  end else begin
    propName := path;
  end;
  TypInfo.SetPropValue(obj, propName, value);
end;

procedure TForm1.Button1Click(Sender: TObject);

begin
  SetPropValue(Self, 'button1.caption', 'test');
  SetPropValue(Self, 'button1.width', '200');
  SetPropValue(Self, 'label1.Visible', false);
end;

// 动态调用函数/过程

type

  TMyProcedure = procedure of object;
  TMyMethod =  function(x, y: Integer): integer of object;

function GetMethod(obj: TObject; MethodName: string): TMethod;

var Rounte: TMethod;
begin
  Result := nil;
  Rounte.Data := Pointer(obj);
  Rounte.Code := obj.MethodAddress(MethodName);
  if not System.Assigned(Rounte.Code) then Exit;
  Result := Rounte;
end;

procedure Form1.Button1Click(Sender:TObject);
var m1: TMyProcedure;
    m2: TMyMethod;
    i:Integer;
begin
  m1 := TMyProcedure(GetMethod(Self, 'show'));
  m1(); // execute
 
  m2 := TMyMethod(GetMethod(), 'Add');
  i := m2(1,2); // execute
end;

 

 

 

转载地址:http://dunti.baihongyu.com/

你可能感兴趣的文章
OpenCV gpu模块样例注释:video_reader.cpp
查看>>
就在昨天,全球 42 亿 IPv4 地址宣告耗尽!
查看>>
Mysql复制表以及复制数据库
查看>>
Linux分区方案
查看>>
如何使用 systemd 中的定时器
查看>>
git命令速查表
查看>>
linux进程监控和自动重启的简单实现
查看>>
OpenFeign学习(三):OpenFeign配置生成代理对象
查看>>
OpenFeign学习(四):OpenFeign的方法同步请求执行
查看>>
OpenFeign学习(六):OpenFign进行表单提交参数或传输文件
查看>>
Ribbon 学习(二):Spring Cloud Ribbon 加载配置原理
查看>>
Ribbon 学习(三):RestTemplate 请求负载流程解析
查看>>
深入理解HashMap
查看>>
XML生成(一):DOM生成XML
查看>>
XML生成(三):JDOM生成
查看>>
Ubuntu Could not open lock file /var/lib/dpkg/lock - open (13:Permission denied)
查看>>
collect2: ld returned 1 exit status
查看>>
C#入门
查看>>
C#中ColorDialog需点两次确定才会退出的问题
查看>>
数据库
查看>>